aragon-cli icon indicating copy to clipboard operation
aragon-cli copied to clipboard

version manager for apm packages

Open kernelwhisperer opened this issue 5 years ago • 2 comments

TL;DR

nvm, but for @aragon/cli, as well as other tools.

This will make pinning to a certain version as quick as few seconds and as easy as one command.

🚀 Feature

There is the use case where an app might be using a different version of the GUI client.

(currently this is hard coded in the CLI, but I think we need to move it to a configuration file, along with the gasPrice option and the others)

And there is also the use case where an app only works with a specific version of the CLI.

(currently people can install the CLI as a project depedency and pin it to a certain version)

Proposal

I wonder if it makes sense to centralize these versions under ~/.aragon, for example:

~/.aragon/cli/v5.9.3
~/.aragon/cli/v5.8.0
~/.aragon/cli/v5.6.2
~/.aragon/gui/v0.8
~/.aragon/gui/v0.7

And declare in the arapp.json/package.json or some other project-specific configuration file, which version it should use, e.g.: >= 5, <= 6.

This logic might also improve how the aragon-desktop handles GUI upgrades and downgrades. :thinking:

The other solution

The alternative would be include these projects (gui, cli, etc.) as project dependencies... :thinking:

  "@aragon/cli": "5.9.3",
  "@aragon/gui": "0.8.0"

Pros:

  • dependencies are more contained? (I'm not sure though, and if this becomes a problem we could to some integrity checking ourselves :man_shrugging: )
  • no global space pollution (I think people can still achieve this with docker though)

Cons:

  • slower (although I think npm will not download these packages over and over again, it still needs to copy the files from the local npm cache, and writing so many files to disk is still slow...)

I think the first solution makes more sense because these projects are not libraries like aragon.js or aragon-ui. They have more in common with tools like git, node, npm, which you have installed globally and you expect them to just work.

Possible interface

avm set-default @aragon/cli v5.9.3
avm set-default @aragon/gui v0.8

Now if I do aragon --version it will print v5.9.3, but if my cwd is a project and its package.json says:

  "aragon" : {
     "cliVersion": "v5.6.0",
     "guiVersion": "*"
   }

Doing aragon --version should actually print v5.6.0.

kernelwhisperer avatar Jul 05 '19 15:07 kernelwhisperer

Now if I do aragon --version it will print v5.9.3, but if my cwd is a project and its package.json says:

  "aragon" : {
     "cliVersion": "v5.6.0",
     "guiVersion": "*"
   }

Doing aragon --version should actually print v5.6.0.

On second thought, this might be too much magic and could cause problems. It would be better if the CLI would throw an error instead.

So if package.json says:

  "engines": {
     "aragonCLI": "> 5.0.0"
  }

And you are using v6.0.0, it should error saying: "This project is only compatible with v5 of the aragonCLI, please use avm set-default @aragon/cli v5.9.3 to switch"

This would also allow us to start using the CLI globally and remove it from repos before we have the "apm version manager" feature.

kernelwhisperer avatar Jul 18 '19 11:07 kernelwhisperer

solc-select has nice UX too, using an environment variable to switch between versions: https://github.com/crytic/solc-select#usage

kernelwhisperer avatar Jul 22 '19 14:07 kernelwhisperer