Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for custom commands and functions #265

Closed
nicolashainaux opened this issue Jun 28, 2018 · 7 comments
Closed

Support for custom commands and functions #265

nicolashainaux opened this issue Jun 28, 2018 · 7 comments

Comments

@nicolashainaux
Copy link

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?

@neighthan
Copy link

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 " is requesting to run <script name> (). Allow this? (y/n)". This seems like a bit of a weird install step, though.

@sdispater
Copy link
Member

I don't plan on supporting this. The whole idea of Poetry and pyproject.toml in general is to not have executable files to setup a project so it's unlikely it will ever be implemented.

@stinovlas
Copy link

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.py with several custom build cases:

  • compiling translation files .po → .mo (has already been mentioned)
  • compiling grpc protocol buffers to python modules
  • calling webpack to transpile and bundle the JavaScript code in our django apps

If Poetry doesn't plan to support these custom build steps, we could:

  1. add generated binary/minified files to our versioning system (ugh...)
  2. call these build steps manually (let's say from a Makefile) before running calling 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 guess
  3. not use Poetry for the projects that require this (unfortunately, most of our projects requires at least the translations build step – so that would basically mean not using Poetry at all)

I 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?

@martinkirch
Copy link

In case anyone comes here because of .mo files embedding : don't forget to list them in include https://python-poetry.org/docs/pyproject/#include-and-exclude

Still, their automatic compilation is not possible. Maybe the plug-in system will solve this, follow #1237

dimbleby pushed a commit to dimbleby/poetry that referenced this issue Apr 21, 2022
* ci(integration): Add 3.10 release

* ci(tests): Support python 3.10 final, still keep master experimental build

* ci(tox): Add python 3.10

* chore: Use string to prevent coercing 3.10 to 3.1

* ci(integration): Remove experimental

We will add this back to 3.11 alpha or when bootstrap-args is supported
by the tox.ini for setting poetry to master/trunk.
@dreamflasher
Copy link

Not being able to run custom commands is one of the blockers for us to switch to poetry. There's now a plugin system implemented: #3733 – Probably one needs to implement a plugin to have that feature?

@epignatelli
Copy link

epignatelli commented Jan 27, 2023

Ditto, I think that this is a reason why I will not use poetry.
I hope this'll help developers' roadmap.

Copy link

This issue has been automatically locked since there has not been any recent activity after it was closed. Please open a new issue for related bugs.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Feb 29, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants