Hello,
When using setup.py, it is possible to customize commands or use functions to get some results dynamically.
For instance, to run a post install script (that requires dependencies to be installed) one can write this:
class CustomInstallCommand(install):
def _post_install(self):
# Some stuff to do
def __init__(self, *args, **kwargs):
super(CustomInstallCommand, self).__init__(*args, **kwargs)
atexit.register(self._post_install)
and use this class as keyword argument value in the setup() call:
cmdclass={'install': CustomInstallCommand}
(other commands like clean, test, tox can be customized this way too).
Second example, in order to compile translation files (po files) into mo files at setup time:
def create_mo_files():
data_files = []
# do stuff
return data_files
and use the result as keyword argument value in the setup() call:
data_files=create_mo_files()
It looks quite obvious that it's not possible to do such things if one uses only a pyproject.toml file: how would it import a class or a function, or know about it, how to run it? (Or is there a way?)
From reading the code, I've seen that the keyword arguments list passed to setup() is hard coded (to build a sdist), so cmdclass and data_files are not usable at the moment (if I'm not wrong).
I guess this is not the easiest feature to implement. Is it planned or already discussed?
Just wanted to create this issue myself! (adding some keywords I was searching for here: post-install hook, post-install script). We can't write the code in pyproject.toml itself, but perhaps we could give a list of paths of scripts that should be run once install completes? This adds a lot to how you can customize the installation (e.g. poetry itself prompts to modify your path on install - could you do that when installing a project built with poetry?), but I think part of the argument for poetry over, e.g., setuptools + setup.py is to _not_ have arbitrary code execution at install. Would it be to much to have scripts that prompt to run at install? Then the user sees something like "
Most helpful comment
I was just researching Poetry as one of possibilities for our new workflow and I bumped into this issue. Up until now, we've been using good old
setup.pywith several custom build cases:.po → .mo(has already been mentioned)If Poetry doesn't plan to support these custom build steps, we could:
poetry build; unfortunately, that clashes with Poetry excluding files mentioned in.gitignore, but maybe there is a way around it; still, this way seems to be prone to errors (what if I forget to call them?), but kind of OK for the CI use i guessI really like Poetry and I thought it could be a solution to our current problems. But without these custom build steps, I'm afraid we won't be able to use it. @sdispater, do you think that there is any way around this? Any chance we could add a hook that would run before each call of
poetry build(basically option 2 above, but without the manual component)? That wouldn't necessarily mean adding some executable files to Poetry itself, just being able to call a python function (or a shell script, but I'm much more inclined to Python callable). Or could this be somehow achieved by plugins?