Skip to main content

Version detection

2 min

The most powerful feature in proto is its contextual version detection, that is triggered with proto run, proto bin, or when a shim is executed. So what does this mean exactly? Before a tool in proto's toolchain can be executed, we need to determine the version of the tool to execute with. If a detected version exists locally, we proceed using that binary, otherwise we fail with a missing installation error.

When detecting a version, the following steps are checked, in the order as listed:

1. Version is explicitly passed as a command line argument​

$ proto run node 18.0.0

2. Version is provided with the PROTO_*_VERSION environment variable​

$ PROTO_NODE_VERSION=18.0.0 proto run node

3. Version is located by traversing the file system​

This step will attempt to find a configuration or manifest file in the current working directory, and traverse upwards through parent directories (stops at the user's home directory) until a file is found.

3.1. Version is defined locally in .prototools​

A .prototools file was found and a version entry exists for the current tool. This is also known as a "local version" and can be created with proto pin.

.prototools
node = "18.0.0"
3.2. Version is defined in the tool's ecosystem​

Depending on the tool, a version is extracted from a found file unique to that tool's ecosystem. This includes version manager configs (.nvmrc, etc), manifest files (package.json, etc), and more.

.nvmrc
18.0.0

4. Version is defined globally​

As the last check, we look for a "global version" that was pinned with proto pin --global or proto install --pin. This version is stored at ~/.proto/.prototools.

5. Version could not be detected​

If all the previous steps have failed, then we could not detect an applicable version, and the process will fail.