proto v0.24 - Standardized configuration and 10x WASM boost
In this release, we've standardized our configuration from the ground-up.
Improved WASM performance up to 20x
Before we dive into the major changes of this release, we want to highlight the performance improvements that have landed recently. Thanks to Dylibso and the Extism team, we've been able to improve the performance of our WASM plugins by 10-20x! This was achieved by plugging into wasmtime's ahead-of-time (AOT) compiler and caching layer.
Here's an example of the performance improvements when running node --version
. On older versions,
the execution time was anywhere from 100ms-200ms, but is now down to 10-20ms! This is almost as fast
as native's 5-10ms!
# proto v0.23.5 and below
hyperfine --warmup 10 -- 'node --version'
Benchmark 1: node --version
Time (mean ± σ): 99.2 ms ± 6.3 ms [User: 662.5 ms, System: 79.4 ms]
Range (min … max): 91.3 ms … 119.7 ms 29 runs
# proto v0.23.6 and above
hyperfine --warmup 10 -- 'node --version'
Benchmark 1: node --version
Time (mean ± σ): 18.5 ms ± 1.0 ms [User: 7.9 ms, System: 12.7 ms]
Range (min … max): 17.1 ms … 23.8 ms 146 runs
Dylibso is hosting an Extism hackathon through the month of December, that'll donate to children in need. Check it out and participate!
Standardized configuration (breaking)
Up until now, proto has supported 2 types of configuration, .prototools
and
~/.proto/config.toml
. The former can exist in any folder, and is used for pinning versions and
defining plugins. The latter is a per-user file that is used for customizing how proto works and
also defining plugins.
Over time, functionality in both of these files has grown, and so has the overlap between them. We
felt it was time to standardize these files into a single configuration file, and as such, have
removed ~/.proto/config.toml
and merged its functionality into
.prototools
. The biggest changes are:
- proto settings (like
auto-clean
andhttp
) must now exist within a[settings]
table. - Tool specific settings (like
node-intercept-globals
) have moved to the new[tools.node]
table (more info below). - Plugins are still configured within a
[plugins]
table. - Global/default settings can be defined in
~/.proto/.prototools
.
node = "20.0.0"
[settings]
auto-clean = true
[settings.http]
allow-invalid-certs = true
The other massive benefit of this change, is that settings can now be defined anywhere!
Previously, settings like auto-clean
or detect-strategy
could only be defined at the user-level,
but what if your company or team wanted to control this setting? It wasn't possible without asking
all team members to update their configuration manually. With this change, settings can now be tied
to projects or repositories!
After upgrading, run proto migrate v0.24
to migrate the old user configuration to the new format!
Tool-level settings
While working on these configuration changes, we also landed the
Tool-level configuration RFC, although with a
different implementation. This enables users to define settings that will be passed to the WASM
plugin of a specific tool, controlling how it works. These settings can be configured with the new
[tools.<name>]
table.
For example, the node
tool has a setting called intercept-globals
, which will trigger an error
when npm/pnpm/yarn attempt to install a global package.
[tools.go]
gobin = false
[tools.node]
intercept-globals = false
As of now, only the Node.js and Go plugins support settings.
Moved aliases and default versions (breaking)
To continue with these configuration changes, we've also moved aliases and the default version into
this new configuration. Previously, both of these values were stored in
~/.proto/tools/<name>/manifest.json
, but the problem was, that this file is internally managed by
proto, and should not be modified by users. This made it difficult for users to manage, and to
persist these values across machines (think dotfile syncing).
Now these values are stored in .prototools
, with aliases being configured in
[tools.<name>.aliases]
, and the default version (global) being
pinned as a version in ~/.proto/.prototools
. Here's an example:
node = "20.0.0"
[tools.node.aliases]
work = "18"
This change also enables aliases to be defined anywhere! Previously, aliases were only allowed to be defined globally for a user, but now they can be defined per-project, or even per-directory.
After upgrading, run proto migrate v0.24
to migrate your aliases and default versions to the new
configuration format!
Other changes
View the official release for a full list of changes.