I like this proposal a lot!

Personally, I'd like if I were always prompted in some way if a newer 
version that the cached one were available. So the behavior might be:

First run: install and run
Subsequent run: Check for latest, prompt to install latest and then run
Subsequent run with no internet connection: warn and use cached version

Perhaps a flag could be used to force only using a cached version without 
checking for latest, but in my opinion, if you want a specific version, 
you'd just install that version of the archive. 

On Tuesday, June 4, 2024 at 10:39:58 PM UTC+2 the.mitc...@gmail.com wrote:

> > However, I don't think it needs to be part of install? For example, it 
> could be included with archives:
>
> I only meant to imply that Mix.install could be used in the 
> implementation, but not be *part *of Mix.install per say.
>
> > On the other hand, there are benefits in not depending on archives. 
> Installed packages can have more dependencies. Maybe:
> >
> >         mix hex.run phx.new ./my-app
> >
>
> Would including it in hex preclude it from running local or git/github 
> tasks? i think that could be useful if you have some local code or just to 
> avoid folks polluting hex.pm with little tasks.
>
> > The question is: when do we check for updates? Maybe, if we make it part 
> of Hex, we can always check the latest version before.
>
> I think the way npx works is it caches whatever version it found at the 
> time, but if you have a specifier like `latest`, it would always resolve it 
> (I think).
>
> So we could potentially include syntax like `mix x phx@latest phx.new 
> my_app`, or merely have a `--force` flag that always checks to see if the 
> current installation is the latest `mix x --force phx phx.new my_app`
>
> Regarding the cli name, it could also be another binary that is installed 
> like `mix`, `iex`, `elixir`, etc.
>
> `hpx phx@latest phx.new my_app`
>
> `hpx` being "hex package executor" (or whatever we want it to be)
>
> Regarding the potential duplicative typing of something like `hpx phx_new 
> phx.new my_app`, adding a new key to the Mix.Project to determine a default 
> task would be useful (this is something else that `npx` does), leaving you 
> with something like `hpx phx_new my_app`. That could leave some arg parsing 
> ambiguity, so maybe something like `hpx phx_new:phx.new my_app` if you were 
> to explicitly call a task.
> On Tuesday, June 4, 2024 at 4:10:08 PM UTC-4 José Valim wrote:
>
>> I think this is potentially a good idea indeed! Especially because it 
>> would force people to always stay on the latest.
>>
>> However, I don't think it needs to be part of install? For example, it 
>> could be included with archives:
>>
>> mix archive.run hex phx_new ./my-app
>>
>> phx_new could introduce a task called phx_new so you don't have to repeat 
>> it. Another option is to have:
>>
>> mix archive.run hex phx.new ./my-app
>>
>> And the name of the package comes from everything before the dot.
>>
>> On the other hand, there are benefits in not depending on archives. 
>> Installed packages can have more dependencies. Maybe:
>>
>> mix hex.run phx.new ./my-app
>>
>> The question is: when do we check for updates? Maybe, if we make it part 
>> of Hex, we can always check the latest version before.
>> The command above will:
>>
>> 1. Download the package phx
>> 2. Invoke the phx.new task with the remaining arguments
>>
>> We will need to convince the Phoenix folks to publish phx though, 
>> probably as part of Phoenix v1.8. Definitely food for thought!
>>
>>
>>
>> On Tue, Jun 4, 2024 at 8:04 PM Mitchell Hanberg <the.mitc...@gmail.com> 
>> wrote:
>>
>>> *TLDR:*
>>>
>>> A builtin mix task to run mix tasks directly from hex or a git 
>>> repository (an SCM).
>>>
>>> `mix x phx_new phx.new`
>>>
>>> *Problem*:
>>>
>>> Currently if you would like to distribute a mix task or CLI tool, you 
>>> either need to have the user first install an archive (like `mix 
>>> archive.install hex phx_new`) or the user needs to  package and distribute 
>>> it themselves.
>>>
>>> The Node.js ecosystem has a solution to this called `npx`, that enables 
>>> a developer to run a CLI tool without globally installing a package or 
>>> creating a project first. This is useful for many scaffolding CLIs that 
>>> generate new projects: e.g., `npx create-react-app my-app`.
>>>
>>> In Elixir, we have the powerful `Mix.install/2` function that can enable 
>>> installing packages in iex or scripts without installing them globally (not 
>>> currently possible at all unless I'm mistaken) or creating a new project.
>>>
>>> This still requires the user to write a script or boot up iex.
>>>
>>> *Solution*:
>>>
>>> A builtin mix task to run mix tasks directly from hex or a git 
>>> repository (an SCM).
>>>
>>> `mix x phx_new phx.new`
>>>
>>> *Advantages:*
>>>
>>> - Easier way to distribute CLI tooling
>>> - Remove a step from projects like phoenix for installing the 
>>> scaffolding CLI
>>> - Building this into Elixir (vs having a 3rd party CLI people can 
>>> install) ensures that users have it and library authors can take advantage 
>>> of it reliably
>>>
>>> *Disadvantages:*
>>>
>>> - Another feature to maintain
>>>
>>> *Considerations:*
>>>
>>> - What to name the mix task? The above is just not the real proposed 
>>> name, just the closed thing to the `npx` convention
>>> - Should libraries be able to declare a "default" task, such that `mix x 
>>> phx_new` works without explicitly declaring the task?
>>>
>>> Notes:
>>>
>>> I have a script in my dotfiles that as a proof of concept
>>>
>>> ```elixir
>>> #!/usr/bin/env elixir
>>>
>>> [package, task | args] = System.argv()
>>>
>>> Mix.install([String.to_atom(package)])
>>>
>>> Mix.Task.run(task, args)
>>> ```
>>>
>>> Let me know what you think!
>>>
>>> - Mitch
>>>
>>> -- 
>>> You received this message because you are subscribed to the Google 
>>> Groups "elixir-lang-core" group.
>>> To unsubscribe from this group and stop receiving emails from it, send 
>>> an email to elixir-lang-co...@googlegroups.com.
>>> To view this discussion on the web visit 
>>> https://groups.google.com/d/msgid/elixir-lang-core/d2e4ac74-8ef2-499b-88dc-3b0577fc1300n%40googlegroups.com
>>>  
>>> <https://groups.google.com/d/msgid/elixir-lang-core/d2e4ac74-8ef2-499b-88dc-3b0577fc1300n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-core+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/7d53f290-cc0d-4ef0-99b1-d9c839a60e74n%40googlegroups.com.

Reply via email to