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

Report Drush 12 deprecations with command classes and drush.services.yml file #678

Open
davereid opened this issue Dec 5, 2023 · 12 comments
Labels
Drush enhancement New feature or request

Comments

@davereid
Copy link

davereid commented Dec 5, 2023

Feature request

If a site has written custom Drush commands using Drush 11 or lower, and they update to Drush 12, the drush.services.yml files are now deprecated as per https://www.drush.org/12.x/commands/

Drush 12 expects commandfiles to use a create() method to inject Drupal and Drush dependencies. Prior versions used a drush.services.yml file which is now deprecated and will be removed in Drush 13.

Drush 12 expects all commandfiles in the /Drush/<Commands|Generators> directory. The Drush subdirectory is a new requirement.

I guess I could write a rule for any classes that extend the DrushCommands class...

@davereid davereid added the enhancement New feature or request label Dec 5, 2023
@davereid davereid changed the title Report presence of drush.services.yml files when using Drush 12+ Report Drush 12 deprecations with command classes and drush.services.yml file Dec 5, 2023
@mglaman
Copy link
Owner

mglaman commented Dec 5, 2023

So anything which extends DrushCommands and doesn't have a create method, throw an error?

@davereid
Copy link
Author

davereid commented Dec 7, 2023

So anything which extends DrushCommands and doesn't have a create method, throw an error?

Only if the module that owns that command file has a drush.services.yml file for dependency injection.

@mglaman
Copy link
Owner

mglaman commented Dec 7, 2023

Because if they do not, it's assumed it doesn't need dependency injection?

@davereid
Copy link
Author

Because if they do not, it's assumed it doesn't need dependency injection?

I think it depends if there is a drush.services.yml record for that class that contains arguments or not.

@mglaman mglaman added this to the Better Drush support milestone Feb 14, 2024
@mglaman
Copy link
Owner

mglaman commented Mar 22, 2024

As of, things have changed yet again: https://github.com/drush-ops/drush/releases/tag/12.5.0

Commandfiles are now encouraged to inject their dependencies via Autowire (drush-ops/drush#5893). Prior methods such as a create() method or a drush.services.yml file are deprecated and may be removed in Drush 13. Now is also a good time to update commandfiles to use PHP Attributes instead of annotations.

@mglaman
Copy link
Owner

mglaman commented Mar 22, 2024

I think this can be DrushAutowireTraitRule which reports an error if a command class doesn't have the AutowireTrait on the class.

@mglaman mglaman added the Drush label Mar 22, 2024
@davereid
Copy link
Author

davereid commented Mar 22, 2024

Well, I'm confused about the messaging from Drush about create() given that Drupal core also isn't strong on autowiring:

Prior methods such as a create() method or a drush.services.yml file are deprecated and may be removed in Drush 13.

... vs the docs from https://www.drush.org/12.x/dependency-injection/:

If Autowire is still insufficient, a commandfile may implement its own create() method (see below).

I would caution to warn only if AutowireTrait and create() are not used, because otherwise I can't make a contrib drush command compatible with the current and previous major versions, which is personally what I target doing.

@weitzman
Copy link

  1. I would warn if a drush.services.yml is present. Thats the only thing thats going to be deprecated in the foreseeable future. Point people to https://www.drush.org/latest/dependency-injection/ for more info.
  2. Perhaps warn if composer.extra.drush is present. Its no longer needed with Drush 12+

@davereid - yeah create() is not part of the deprecation. Its more that Autowire is new and shiny and slightly preferred. Feel free to keep using create(). AFAICT autowire is very much available and recommended for Contrib. Its just Drupal core thats slow.

@mglaman
Copy link
Owner

mglaman commented Mar 22, 2024

Thanks for the input and clarifications!

Right now we have:

            $servicesFileName = $module_dir . '/' . $module_name . '.services.yml';
            if (file_exists($servicesFileName)) {
                $this->serviceYamls[$module_name] = $servicesFileName;
            }

I guess we need the same for drush.services.yml. This way, the DrushAutowireRule can do something like the following.

If the class name is found in the service map, via a drush.services.yml check if it has ::create and/or AutowireTrait. If it does not, report an error that command classes need to use modern dependency injection, see https://www.drush.org/latest/dependency-injection/

I shouldn't need to check composer.json (which is harder to do, more of an Upgrade Status thing) then.

@weitzman
Copy link

OK, but the presence of drush.services.yml should always trigger a warning. Its always good to remove it. If you have one AND you have autowire/create, you are doing the same work twice. Thats likely harmless, but its confusing where changes should be made.

@davereid
Copy link
Author

OK, but the presence of drush.services.yml should always trigger a warning. Its always good to remove it. If you have one AND you have autowire/create, you are doing the same work twice. Thats likely harmless, but its confusing where changes should be made.

Yup, agreed.

@mglaman
Copy link
Owner

mglaman commented Mar 22, 2024

Perfect. Thanks! I hit major camp brain fog and fatigue before writing any code. But at least the requirements are now captured. I appreciate it!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Drush enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants