Hey Prem,

The Rails command infrastructure is still private and I don’t like the current 
internal API that much. Don’t feel good exposing that. There’s also no way to 
mark command dependencies yet.

Now I did write the initial infrastructure 3-4 years ago for Rails 5.0, so it’s 
been some time coming. I remember fighting Thor a lot just to get to where it 
is today, now I’d like to think I’ve improved a lot in those years, but I’m 
still not looking super forward to going back in.

We could try to add this in an attempt to commit, but then again there’s really 
no rush.

So I’m not super keen, but I’m also not a complete no. Though I guess I’m 
saying if the proposal is just open as-is, add documentation, call it done, 
then it’s no from me.

--
Kasper

> On 14 Jan 2020, at 07.50, Prem Sichanugrist <sikand...@gmail.com> wrote:
> 
> Hello,
> 
> Currently, in our project, we've migrated away from using Rake tasks and 
> trying to use Rails Command classes instead.
> 
> However, one of the thing we started to notice is that we have to add our 
> application's lib directory to $LOAD_PATH in order for Rails to find the 
> custom commands.
> 
> As I look into the source code, I noticed that Rails have a really specific 
> rule on where to find additional commands:
> 
> https://github.com/rails/rails/blob/5371d5dcf26f5a5321471517531f36defa114e68/railties/lib/rails/command/behavior.rb#L55-L65
>  
> <https://github.com/rails/rails/blob/5371d5dcf26f5a5321471517531f36defa114e68/railties/lib/rails/command/behavior.rb#L55-L65>
>           # This will try to load any command in the load path to show in 
> help.
>           def lookup!
>             $LOAD_PATH.each do |base|
>               Dir[File.join(base, *file_lookup_paths)].each do |path|
>                 path = path.sub("#{base}/", "")
>                 require path
>               rescue Exception
>                 # No problem
>               end
>             end
>           end
> 
> https://github.com/rails/rails/blob/5371d5dcf26f5a5321471517531f36defa114e68/railties/lib/rails/command.rb#L104-L110
>  
> <https://github.com/rails/rails/blob/5371d5dcf26f5a5321471517531f36defa114e68/railties/lib/rails/command.rb#L104-L110>
>         def lookup_paths # :doc:
>           @lookup_paths ||= %w( rails/commands commands )
>         end
> 
> 
>         def file_lookup_paths # :doc:
>           @file_lookup_paths ||= [ "{#{lookup_paths.join(',')}}", "**", 
> "*_command.rb" ]
>         end
> 
> Basically, Ralis will only loop through every rails/commands or commands 
> within the $LOAD_PATH. While this work perfectly for gems (as they can just 
> have lib/rails/commands and everything will just work™) it might lead into a 
> weird directory structure when you try to implement a custom command within 
> the application itself, and generally I believe there's a reason we don't 
> have our application's lib directory in the $LOAD_PATH by default makes me 
> feel wrong to add it back again.
> 
> So, I would like to propose a standard, well-documented path for custom 
> command within the Rails application. Some candidates are:
> app/commands — (This might not work well due to everything in app/ is 
> autoloadable by zeitwerk)
> lib/commands — (Goes along with lib/tasks, so might be a good choice)
> config/commands — (A bit weird since this isn't really a config)
> Do you think we should add one of these example to Rails lookup path? I'll be 
> willing to submit a PR to get it work.
> 
> Thank you,
> Prem
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "Ruby on Rails: Core" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to rubyonrails-core+unsubscr...@googlegroups.com 
> <mailto:rubyonrails-core+unsubscr...@googlegroups.com>.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/rubyonrails-core/3d028cb9-128d-44f2-9880-21fdc6151ba9%40googlegroups.com
>  
> <https://groups.google.com/d/msgid/rubyonrails-core/3d028cb9-128d-44f2-9880-21fdc6151ba9%40googlegroups.com?utm_medium=email&utm_source=footer>.

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to rubyonrails-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/rubyonrails-core/4AD46268-1339-46F5-9929-482BA64BC4FC%40gmail.com.

Reply via email to