One Tool
Manage each of your project runtimes with a single CLI tool and command interface.
commit 017e46212e1d67ecdafd39cc4da26b9d3d66a8ce Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon Oct 7 13:52:36 2024 +0000 Deploy to GitHub pages diff --git a/404.html b/404.html new file mode 100644 index 00000000..dc5acdf0 --- /dev/null +++ b/404.html @@ -0,0 +1,21 @@ + + +
+ + +asdf
core contribution guide.
Fork asdf
on GitHub and/or Git clone the default branch:
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git
The tools for core development are in this repo's .tool-versions
. If you wish to manage with asdf
itself, add the plugins:
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git
Install the versions to develop asdf
with:
asdf install
It may be useful to not use asdf
to manage the tools during development on your local machine as you may need to break functionality which would then break your dev tooling. Here's the raw list of tools:
If you want to try out your changes without making change to your installed asdf
, you can set the $ASDF_DIR
variable to the path where you cloned the repository, and temporarily prepend the bin
and shims
directory of the directory to your path.
It is best to format, lint and test your code locally before you commit or push to the remote. Use the following scripts/commands:
# Lint
+./scripts/lint.bash --check
+
+# Fix & Format
+./scripts/lint.bash --fix
+
+# Test: all tests
+./scripts/test.bash
+
+# Test: for specific command
+bats test/list_commands.bash
TIP
Add tests! - Tests are required for new features and speed up review of bug fixes. Please cover new code paths before you create a Pull Request. See bats-core documentation
The following is the .gitignore
file in the asdf-vm/asdf
repository. We ignore project-specific files. Files specific to your OS, tools or workflows should be ignored in your global .gitignore
configuration, see here for more details.
/installs
+/downloads
+/plugins
+/shims
+repository
+.vagrant
+keyrings
+/tmp
.git-blame-ignore-revs
asdf
uses a .git-blame-ignore-revs
to reduce noise when running a blame. See the git blame documentation for more information.
Use the file with git blame
like so:
git blame --ignore-revs-file .git-blame-ignore-revs ./test/install_command.bats
Optionally, configure to use the file on every invocation of blame
without manually supplying it:
git config blame.ignoreRevsFile .git-blame-ignore-revs
It is possible to configure IDEs to use this file. For example, when using VSCode (with GitLens), write the following to .vscode/settings.json
:
{
+ "gitlens.advanced.blame.customArguments": [
+ "--ignore-revs-file",
+ ".git-blame-ignore-revs"
+ ]
+}
Execute tests locally with:
./scripts/test.bash
Before writing tests please read:
test/
scripts/test.bash
Bats debugging can be difficult at times. Using the TAP output with -t
flag will enable you to print outputs with the special file descriptor >&3
during test execution, simplifying debugging. As an example:
# test/some_tests.bats
+
+printf "%s\\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\\n" "Will be printed during bats -t test/some_tests.bats" >&3
This is further documented in bats-core Printing to the Terminal.
asdf
is using an automated release tool called Release Please to automatically bump the SemVer version and generate the Changelog. This information is determined by reading the commit history since the last release.
Conventional Commit messages define the format of the Pull Request Title which becomes the commit message format on the default branch. This is enforced with GitHub Action amannn/action-semantic-pull-request
.
Conventional Commit follows this format:
<type>[optional scope][optional !]: <description>
+
+<!-- examples -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change
The full list of <types>
are: feat
, fix
, docs
, style
, refactor
, perf
, test
, build
, ci
, chore
, revert
.
!
: indicates a breaking changefix
: will create a new SemVer patch
feat
: will create a new SemVer minor
<type>!
: will create a new SemVer major
The Pull Request Title must follow this format.
TIP
Use Conventional Commit message format for your Pull Request Title.
The asdf-alpine and asdf-ubuntu projects are an ongoing effort to provide Dockerized images of some asdf tools. You can use these docker images as base for your development servers, or for running your production apps.
`,47)]))}const k=e(n,[["render",l]]);export{g as __pageData,k as default}; diff --git a/assets/contribute_core.md.BABeyVan.lean.js b/assets/contribute_core.md.BABeyVan.lean.js new file mode 100644 index 00000000..66d8cade --- /dev/null +++ b/assets/contribute_core.md.BABeyVan.lean.js @@ -0,0 +1,38 @@ +import{_ as e,c as a,a2 as i,o as t}from"./chunks/framework.C9NVOr0y.js";const g=JSON.parse('{"title":"asdf","description":"","frontmatter":{},"headers":[],"relativePath":"contribute/core.md","filePath":"contribute/core.md","lastUpdated":1728309110000}'),n={name:"contribute/core.md"};function l(o,s,p,r,h,d){return t(),a("div",null,s[0]||(s[0]=[i(`asdf
core contribution guide.
Fork asdf
on GitHub and/or Git clone the default branch:
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git
The tools for core development are in this repo's .tool-versions
. If you wish to manage with asdf
itself, add the plugins:
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git
Install the versions to develop asdf
with:
asdf install
It may be useful to not use asdf
to manage the tools during development on your local machine as you may need to break functionality which would then break your dev tooling. Here's the raw list of tools:
If you want to try out your changes without making change to your installed asdf
, you can set the $ASDF_DIR
variable to the path where you cloned the repository, and temporarily prepend the bin
and shims
directory of the directory to your path.
It is best to format, lint and test your code locally before you commit or push to the remote. Use the following scripts/commands:
# Lint
+./scripts/lint.bash --check
+
+# Fix & Format
+./scripts/lint.bash --fix
+
+# Test: all tests
+./scripts/test.bash
+
+# Test: for specific command
+bats test/list_commands.bash
TIP
Add tests! - Tests are required for new features and speed up review of bug fixes. Please cover new code paths before you create a Pull Request. See bats-core documentation
The following is the .gitignore
file in the asdf-vm/asdf
repository. We ignore project-specific files. Files specific to your OS, tools or workflows should be ignored in your global .gitignore
configuration, see here for more details.
/installs
+/downloads
+/plugins
+/shims
+repository
+.vagrant
+keyrings
+/tmp
.git-blame-ignore-revs
asdf
uses a .git-blame-ignore-revs
to reduce noise when running a blame. See the git blame documentation for more information.
Use the file with git blame
like so:
git blame --ignore-revs-file .git-blame-ignore-revs ./test/install_command.bats
Optionally, configure to use the file on every invocation of blame
without manually supplying it:
git config blame.ignoreRevsFile .git-blame-ignore-revs
It is possible to configure IDEs to use this file. For example, when using VSCode (with GitLens), write the following to .vscode/settings.json
:
{
+ "gitlens.advanced.blame.customArguments": [
+ "--ignore-revs-file",
+ ".git-blame-ignore-revs"
+ ]
+}
Execute tests locally with:
./scripts/test.bash
Before writing tests please read:
test/
scripts/test.bash
Bats debugging can be difficult at times. Using the TAP output with -t
flag will enable you to print outputs with the special file descriptor >&3
during test execution, simplifying debugging. As an example:
# test/some_tests.bats
+
+printf "%s\\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\\n" "Will be printed during bats -t test/some_tests.bats" >&3
This is further documented in bats-core Printing to the Terminal.
asdf
is using an automated release tool called Release Please to automatically bump the SemVer version and generate the Changelog. This information is determined by reading the commit history since the last release.
Conventional Commit messages define the format of the Pull Request Title which becomes the commit message format on the default branch. This is enforced with GitHub Action amannn/action-semantic-pull-request
.
Conventional Commit follows this format:
<type>[optional scope][optional !]: <description>
+
+<!-- examples -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change
The full list of <types>
are: feat
, fix
, docs
, style
, refactor
, perf
, test
, build
, ci
, chore
, revert
.
!
: indicates a breaking changefix
: will create a new SemVer patch
feat
: will create a new SemVer minor
<type>!
: will create a new SemVer major
The Pull Request Title must follow this format.
TIP
Use Conventional Commit message format for your Pull Request Title.
The asdf-alpine and asdf-ubuntu projects are an ongoing effort to provide Dockerized images of some asdf tools. You can use these docker images as base for your development servers, or for running your production apps.
`,47)]))}const k=e(n,[["render",l]]);export{g as __pageData,k as default}; diff --git a/assets/contribute_documentation.md.BYyBOKz0.js b/assets/contribute_documentation.md.BYyBOKz0.js new file mode 100644 index 00000000..ff60ed67 --- /dev/null +++ b/assets/contribute_documentation.md.BYyBOKz0.js @@ -0,0 +1,42 @@ +import{_ as i,c as a,a2 as e,o as n}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"Docs & Site","description":"","frontmatter":{},"headers":[],"relativePath":"contribute/documentation.md","filePath":"contribute/documentation.md","lastUpdated":1687069487000}'),t={name:"contribute/documentation.md"};function l(p,s,h,o,r,d){return n(),a("div",null,s[0]||(s[0]=[e(`Documentation & site contribution guide.
Fork asdf
on GitHub and/or Git clone the default branch:
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git
The tools for Docs site development are managed with asdf
in the docs/.tool-versions
. Add the plugins with:
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs
Install the tool version(s) with:
asdf install
Install Node.js dependencies from docs/package.json
:
npm install
VitePress (v2) is the Static Site Generator (SSG) we use to build the asdf documentation site. It was chosen to replace Docsify.js and subsequently VuePress as we would like to support an HTML only fallback when users do not have JavaScript available or enabled. This was not possible with Docsify & VitePress quicly supplanted VuePress. Other than this, the feature-set is largely the same, with the focus on writing Markdown files with minimal configuration.
package.json
contains the scripts required for development:
To start the local development server:
npm run dev
Format the code before committing:
npm run format
asdf
is using an automated release pipeline which relies on Conventional Commits in PR titles. Detailed documentation found in the core contribution guide.
When creating a PR for documentation changes please make the PR title with the Conventional Commit type docs
in the format docs: <description>
.
Configuration of the site is contained within a few TypeScript files with JS Objects used to represent the config. They are:
docs/.vitepress/config.js
: the root config file for the site. Read the VitePress documentation for it's spec.To simplify the root config, the larger JS Objects representing the navbar and sidebar configuration have been extracted and separated by their locale. See both in:
docs/.vitepress/navbars.js
docs/.vitepress/sidebars.js
With the official documentation for these configs living in the Default Theme Reference.
VitePress has first-class support for internationalization. The root config docs/.vitepress/config.js
defines the supported locales with their URL, title in the selection dropdown menu and navbar/sidebar configs references.
The navbar/sidebar configs are captured in the aforementioned config files, separated by locale and exported individually.
The markdown content for each locale must fall under a folder with the same name as the keys for locales
in the root config. That is:
// docs/.vitepress/config.js
+export default defineConfig({
+ ...
+ locales: {
+ root: {
+ label: "English",
+ lang: "en-US",
+ themeConfig: {
+ nav: navbars.en,
+ sidebar: sidebars.en,
+ },
+ },
+ "pt-br": {
+ label: "Brazilian Portuguese",
+ lang: "pr-br",
+ themeConfig: {
+ nav: navbars.pt_br,
+ sidebar: sidebars.pt_br,
+ },
+ },
+ "zh-hans": {
+ label: "简体中文",
+ lang: "zh-hans",
+ themeConfig: {
+ nav: navbars.zh_hans,
+ sidebar: sidebars.zh_hans,
+ },
+ },
+ },
+})
/pt-BR/
will require the same set of markdown files located under docs/pt-BR/
, like so:
docs
+├─ README.md
+├─ foo.md
+├─ nested
+│ └─ README.md
+└─ pt-BR
+ ├─ README.md
+ ├─ foo.md
+ └─ nested
+ └─ README.md
The official VitePress i18n documentation goes into more detail.
`,37)]))}const g=i(t,[["render",l]]);export{c as __pageData,g as default}; diff --git a/assets/contribute_documentation.md.BYyBOKz0.lean.js b/assets/contribute_documentation.md.BYyBOKz0.lean.js new file mode 100644 index 00000000..ff60ed67 --- /dev/null +++ b/assets/contribute_documentation.md.BYyBOKz0.lean.js @@ -0,0 +1,42 @@ +import{_ as i,c as a,a2 as e,o as n}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"Docs & Site","description":"","frontmatter":{},"headers":[],"relativePath":"contribute/documentation.md","filePath":"contribute/documentation.md","lastUpdated":1687069487000}'),t={name:"contribute/documentation.md"};function l(p,s,h,o,r,d){return n(),a("div",null,s[0]||(s[0]=[e(`Documentation & site contribution guide.
Fork asdf
on GitHub and/or Git clone the default branch:
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git
The tools for Docs site development are managed with asdf
in the docs/.tool-versions
. Add the plugins with:
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs
Install the tool version(s) with:
asdf install
Install Node.js dependencies from docs/package.json
:
npm install
VitePress (v2) is the Static Site Generator (SSG) we use to build the asdf documentation site. It was chosen to replace Docsify.js and subsequently VuePress as we would like to support an HTML only fallback when users do not have JavaScript available or enabled. This was not possible with Docsify & VitePress quicly supplanted VuePress. Other than this, the feature-set is largely the same, with the focus on writing Markdown files with minimal configuration.
package.json
contains the scripts required for development:
To start the local development server:
npm run dev
Format the code before committing:
npm run format
asdf
is using an automated release pipeline which relies on Conventional Commits in PR titles. Detailed documentation found in the core contribution guide.
When creating a PR for documentation changes please make the PR title with the Conventional Commit type docs
in the format docs: <description>
.
Configuration of the site is contained within a few TypeScript files with JS Objects used to represent the config. They are:
docs/.vitepress/config.js
: the root config file for the site. Read the VitePress documentation for it's spec.To simplify the root config, the larger JS Objects representing the navbar and sidebar configuration have been extracted and separated by their locale. See both in:
docs/.vitepress/navbars.js
docs/.vitepress/sidebars.js
With the official documentation for these configs living in the Default Theme Reference.
VitePress has first-class support for internationalization. The root config docs/.vitepress/config.js
defines the supported locales with their URL, title in the selection dropdown menu and navbar/sidebar configs references.
The navbar/sidebar configs are captured in the aforementioned config files, separated by locale and exported individually.
The markdown content for each locale must fall under a folder with the same name as the keys for locales
in the root config. That is:
// docs/.vitepress/config.js
+export default defineConfig({
+ ...
+ locales: {
+ root: {
+ label: "English",
+ lang: "en-US",
+ themeConfig: {
+ nav: navbars.en,
+ sidebar: sidebars.en,
+ },
+ },
+ "pt-br": {
+ label: "Brazilian Portuguese",
+ lang: "pr-br",
+ themeConfig: {
+ nav: navbars.pt_br,
+ sidebar: sidebars.pt_br,
+ },
+ },
+ "zh-hans": {
+ label: "简体中文",
+ lang: "zh-hans",
+ themeConfig: {
+ nav: navbars.zh_hans,
+ sidebar: sidebars.zh_hans,
+ },
+ },
+ },
+})
/pt-BR/
will require the same set of markdown files located under docs/pt-BR/
, like so:
docs
+├─ README.md
+├─ foo.md
+├─ nested
+│ └─ README.md
+└─ pt-BR
+ ├─ README.md
+ ├─ foo.md
+ └─ nested
+ └─ README.md
The official VitePress i18n documentation goes into more detail.
`,37)]))}const g=i(t,[["render",l]]);export{c as __pageData,g as default}; diff --git a/assets/contribute_first-party-plugins.md.CpFWKmHh.js b/assets/contribute_first-party-plugins.md.CpFWKmHh.js new file mode 100644 index 00000000..e1a12f33 --- /dev/null +++ b/assets/contribute_first-party-plugins.md.CpFWKmHh.js @@ -0,0 +1 @@ +import{_ as r,c as t,a2 as a,o as i}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"First-Party Plugins","description":"","frontmatter":{},"headers":[],"relativePath":"contribute/first-party-plugins.md","filePath":"contribute/first-party-plugins.md","lastUpdated":1627017981000}'),o={name:"contribute/first-party-plugins.md"};function s(l,e,n,d,c,f){return i(),t("div",null,e[0]||(e[0]=[a('The asdf core team has authored some plugins relevant to their daily work life. Help is always welcome in maintaining and improving these plugins. See the associated repo for each linked below:
For community plugins, see:
asdf-community
organisation: A collaborative, community-driven project for long-term maintenance of asdf
plugins.asdf-plugins
shortname repo: Short-name list used by asdf
core to lookup popular asdf
plugins.asdf-plugin
topic searchThe asdf core team has authored some plugins relevant to their daily work life. Help is always welcome in maintaining and improving these plugins. See the associated repo for each linked below:
For community plugins, see:
asdf-community
organisation: A collaborative, community-driven project for long-term maintenance of asdf
plugins.asdf-plugins
shortname repo: Short-name list used by asdf
core to lookup popular asdf
plugins.asdf-plugin
topic searchasdf
installation involves:
asdf
coreasdf
.tool-versions
config filesasdf primarily requires git
& curl
. Here is a non-exhaustive list of commands to run for your package manager (some might automatically install these tools in later steps).
OS | Package Manager | Command |
---|---|---|
linux | Aptitude | apt install curl git |
linux | DNF | dnf install curl git |
linux | Pacman | pacman -S curl git |
linux | Zypper | zypper install curl git |
macOS | Homebrew | brew install coreutils curl git |
macOS | Spack | spack install coreutils curl git |
Note
sudo
may be required depending on your system configuration.
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1
We highly recommend using the official git
method.
Method | Command |
---|---|
Homebrew | brew install asdf |
Pacman | git clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper |
There are many different combinations of Shells, OSs & Installation methods all of which affect the configuration here. Expand the selection below that best matches your system.
macOS users, be sure to read the warning about path_helper
at the end of this section.
Add the following to ~/.bashrc
:
. "$HOME/.asdf/asdf.sh"
Completions must be configured by adding the following to your .bashrc
:
. "$HOME/.asdf/completions/asdf.bash"
If using macOS Catalina or newer, the default shell has changed to ZSH. Unless changing back to Bash, follow the ZSH instructions.
Add the following to ~/.bash_profile
:
. "$HOME/.asdf/asdf.sh"
Completions must be configured manually with the following entry in your .bash_profile
:
. "$HOME/.asdf/completions/asdf.bash"
Add asdf.sh
to your ~/.bashrc
with:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bashrc
Completions will need to be configured as per Homebrew's instructions or with the following:
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
If using macOS Catalina or newer, the default shell has changed to ZSH. Unless changing back to Bash, follow the ZSH instructions.
Add asdf.sh
to your ~/.bash_profile
with:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bash_profile
Completions will need to be configured as per Homebrew's instructions or with the following:
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Add the following to ~/.bashrc
:
. /opt/asdf-vm/asdf.sh
bash-completion
needs to be installed for the completions to work.
Add the following to ~/.config/fish/config.fish
:
source ~/.asdf/asdf.fish
Completions must be configured manually with the following command:
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Add asdf.fish
to your ~/.config/fish/config.fish
with:
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish
Completions are handled by Homebrew for the Fish shell. Friendly!
Add the following to ~/.config/fish/config.fish
:
source /opt/asdf-vm/asdf.fish
Completions are automatically configured on installation by the AUR package.
Add asdf.elv
to your ~/.config/elvish/rc.elv
with:
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
Completions are automatically configured.
Add asdf.elv
to your ~/.config/elvish/rc.elv
with:
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
Completions are automatically configured.
Add asdf.elv
to your ~/.config/elvish/rc.elv
with:
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
Completions are automatically configured.
Add the following to ~/.zshrc
:
. "$HOME/.asdf/asdf.sh"
OR use a ZSH Framework plugin like asdf for oh-my-zsh which will source this script and setup completions.
Completions are configured by either a ZSH Framework asdf
plugin or by adding the following to your .zshrc
:
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
compinit
setup, ensure compinit
is below your sourcing of asdf.sh
compinit
setup with a ZSH Framework, ensure compinit
is below your sourcing of the frameworkWarning
If you are using a ZSH Framework the associated asdf
plugin may need to be updated to use the new ZSH completions properly via fpath
. The Oh-My-ZSH asdf plugin is yet to be updated, see ohmyzsh/ohmyzsh#8837.
Add asdf.sh
to your ~/.zshrc
with:
echo -e "\\n. $(brew --prefix asdf)/libexec/asdf.sh" >> \${ZDOTDIR:-~}/.zshrc
OR use a ZSH Framework plugin like asdf for oh-my-zsh which will source this script and setup completions.
Completions are configured by either a ZSH Framework asdf
or will need to be configured as per Homebrew's instructions. If you are using a ZSH Framework the associated plugin for asdf may need to be updated to use the new ZSH completions properly via fpath
. The Oh-My-ZSH asdf plugin is yet to be updated, see ohmyzsh/ohmyzsh#8837.
Add the following to ~/.zshrc
:
. /opt/asdf-vm/asdf.sh
Completions are placed in a ZSH friendly location, but ZSH must be configured to use the autocompletions.
Add the following to ~/.config/powershell/profile.ps1
:
. "$HOME/.asdf/asdf.ps1"
Add asdf.sh
to your ~/.config/powershell/profile.ps1
with:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
Add the following to ~/.config/powershell/profile.ps1
:
. /opt/asdf-vm/asdf.ps1
Add asdf.nu
to your ~/.config/nushell/config.nu
with:
"\\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path
Completions are automatically configured
Add asdf.nu
to your ~/.config/nushell/config.nu
with:
"\\n$env.ASDF_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\\n source " + (brew --prefix asdf | str trim | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path
Completions are automatically configured
Add asdf.nu
to your ~/.config/nushell/config.nu
with:
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path
Completions are automatically configured.
Add the following to ~/.profile
:
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
Add asdf.sh
to your ~/.profile
with:
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
Add the following to ~/.profile
:
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh
asdf
scripts need to be sourced after you have set your $PATH
and after you have sourced your framework (oh-my-zsh etc).
WARNING
On macOS, starting a Bash or Zsh shell automatically calls a utility called path_helper
. path_helper
can rearrange items in PATH
(and MANPATH
), causing inconsistent behavior for tools that require specific ordering. To workaround this, asdf
on macOS defaults to forcily adding its PATH
-entries to the front (taking highest priority). This is controllable with the ASDF_FORCE_PREPEND
variable.
Restart your shell so that PATH
changes take effect. Opening a new terminal tab will usually do it.
This completes the installation of the asdf
core 🎉
asdf
is only useful once you install a plugin, install a tool and manage its versions. Continue the guide below to learn how to do this.
For demonstration purposes we will install & set Node.js via the asdf-nodejs
plugin.
Each plugin has dependencies so we need to check the plugin repo where they should be listed. For asdf-nodejs
they are:
OS | Dependency Installation |
---|---|
Debian | apt-get install dirmngr gpg curl gawk |
CentOS/ Rocky Linux/ AlmaLinux | yum install gnupg2 curl gawk |
macOS | brew install gpg gawk |
We should install dependencies first as some Plugins have post-install hooks.
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
Now we have a plugin for Node.js we can install a version of the tool.
We can see which versions are available with asdf list all nodejs
or a subset of versions with asdf list all nodejs 14
.
We will just install the latest
available version:
asdf install nodejs latest
Note
asdf
enforces exact versions. latest
is a helper throughout asdf
that will resolve to the actual version number at the time of execution.
asdf
performs a version lookup of a tool in all .tool-versions
files from the current working directory up to the $HOME
directory. The lookup occurs just-in-time when you execute a tool that asdf
manages.
WARNING
Without a version listed for a tool execution of the tool will error. asdf current
will show you the tool & version resolution, or absence of, from your current directory so you can observe which tools will fail to execute.
Global defaults are managed in $HOME/.tool-versions
. Set a global version with:
asdf global nodejs latest
$HOME/.tool-versions
will then look like:
nodejs 16.5.0
Some OSs already have tools installed that are managed by the system and not asdf
, python
is a common example. You need to tell asdf
to pass the management back to the system. The Versions reference section will guide you.
Local versions are defined in the $PWD/.tool-versions
file (your current working directory). Usually, this will be the Git repository for a project. When in your desired directory execute:
asdf local nodejs latest
$PWD/.tool-versions
will then look like:
nodejs 16.5.0
asdf
supports the migration from existing version files from other version managers. Eg: .ruby-version
for the case of rbenv
. This is supported on a per-plugin basis.
asdf-nodejs
supports this via both .nvmrc
and .node-version
files. To enable this, add the following to your asdf
configuration file $HOME/.asdfrc
:
legacy_version_file = yes
See the configuration reference page for more config options.
That completes the Getting Started guide for asdf
🎉 You can now manage nodejs
versions for your project. Follow similar steps for each type of tool in your project!
asdf
has many more commands to become familiar with, you can see them all by running asdf --help
or asdf
. The core of the commands are broken into three categories:
asdf
installation involves:
asdf
coreasdf
.tool-versions
config filesasdf primarily requires git
& curl
. Here is a non-exhaustive list of commands to run for your package manager (some might automatically install these tools in later steps).
OS | Package Manager | Command |
---|---|---|
linux | Aptitude | apt install curl git |
linux | DNF | dnf install curl git |
linux | Pacman | pacman -S curl git |
linux | Zypper | zypper install curl git |
macOS | Homebrew | brew install coreutils curl git |
macOS | Spack | spack install coreutils curl git |
Note
sudo
may be required depending on your system configuration.
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1
We highly recommend using the official git
method.
Method | Command |
---|---|
Homebrew | brew install asdf |
Pacman | git clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper |
There are many different combinations of Shells, OSs & Installation methods all of which affect the configuration here. Expand the selection below that best matches your system.
macOS users, be sure to read the warning about path_helper
at the end of this section.
Add the following to ~/.bashrc
:
. "$HOME/.asdf/asdf.sh"
Completions must be configured by adding the following to your .bashrc
:
. "$HOME/.asdf/completions/asdf.bash"
If using macOS Catalina or newer, the default shell has changed to ZSH. Unless changing back to Bash, follow the ZSH instructions.
Add the following to ~/.bash_profile
:
. "$HOME/.asdf/asdf.sh"
Completions must be configured manually with the following entry in your .bash_profile
:
. "$HOME/.asdf/completions/asdf.bash"
Add asdf.sh
to your ~/.bashrc
with:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bashrc
Completions will need to be configured as per Homebrew's instructions or with the following:
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
If using macOS Catalina or newer, the default shell has changed to ZSH. Unless changing back to Bash, follow the ZSH instructions.
Add asdf.sh
to your ~/.bash_profile
with:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bash_profile
Completions will need to be configured as per Homebrew's instructions or with the following:
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Add the following to ~/.bashrc
:
. /opt/asdf-vm/asdf.sh
bash-completion
needs to be installed for the completions to work.
Add the following to ~/.config/fish/config.fish
:
source ~/.asdf/asdf.fish
Completions must be configured manually with the following command:
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Add asdf.fish
to your ~/.config/fish/config.fish
with:
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish
Completions are handled by Homebrew for the Fish shell. Friendly!
Add the following to ~/.config/fish/config.fish
:
source /opt/asdf-vm/asdf.fish
Completions are automatically configured on installation by the AUR package.
Add asdf.elv
to your ~/.config/elvish/rc.elv
with:
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
Completions are automatically configured.
Add asdf.elv
to your ~/.config/elvish/rc.elv
with:
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
Completions are automatically configured.
Add asdf.elv
to your ~/.config/elvish/rc.elv
with:
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
Completions are automatically configured.
Add the following to ~/.zshrc
:
. "$HOME/.asdf/asdf.sh"
OR use a ZSH Framework plugin like asdf for oh-my-zsh which will source this script and setup completions.
Completions are configured by either a ZSH Framework asdf
plugin or by adding the following to your .zshrc
:
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
compinit
setup, ensure compinit
is below your sourcing of asdf.sh
compinit
setup with a ZSH Framework, ensure compinit
is below your sourcing of the frameworkWarning
If you are using a ZSH Framework the associated asdf
plugin may need to be updated to use the new ZSH completions properly via fpath
. The Oh-My-ZSH asdf plugin is yet to be updated, see ohmyzsh/ohmyzsh#8837.
Add asdf.sh
to your ~/.zshrc
with:
echo -e "\\n. $(brew --prefix asdf)/libexec/asdf.sh" >> \${ZDOTDIR:-~}/.zshrc
OR use a ZSH Framework plugin like asdf for oh-my-zsh which will source this script and setup completions.
Completions are configured by either a ZSH Framework asdf
or will need to be configured as per Homebrew's instructions. If you are using a ZSH Framework the associated plugin for asdf may need to be updated to use the new ZSH completions properly via fpath
. The Oh-My-ZSH asdf plugin is yet to be updated, see ohmyzsh/ohmyzsh#8837.
Add the following to ~/.zshrc
:
. /opt/asdf-vm/asdf.sh
Completions are placed in a ZSH friendly location, but ZSH must be configured to use the autocompletions.
Add the following to ~/.config/powershell/profile.ps1
:
. "$HOME/.asdf/asdf.ps1"
Add asdf.sh
to your ~/.config/powershell/profile.ps1
with:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
Add the following to ~/.config/powershell/profile.ps1
:
. /opt/asdf-vm/asdf.ps1
Add asdf.nu
to your ~/.config/nushell/config.nu
with:
"\\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path
Completions are automatically configured
Add asdf.nu
to your ~/.config/nushell/config.nu
with:
"\\n$env.ASDF_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\\n source " + (brew --prefix asdf | str trim | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path
Completions are automatically configured
Add asdf.nu
to your ~/.config/nushell/config.nu
with:
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path
Completions are automatically configured.
Add the following to ~/.profile
:
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
Add asdf.sh
to your ~/.profile
with:
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
Add the following to ~/.profile
:
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh
asdf
scripts need to be sourced after you have set your $PATH
and after you have sourced your framework (oh-my-zsh etc).
WARNING
On macOS, starting a Bash or Zsh shell automatically calls a utility called path_helper
. path_helper
can rearrange items in PATH
(and MANPATH
), causing inconsistent behavior for tools that require specific ordering. To workaround this, asdf
on macOS defaults to forcily adding its PATH
-entries to the front (taking highest priority). This is controllable with the ASDF_FORCE_PREPEND
variable.
Restart your shell so that PATH
changes take effect. Opening a new terminal tab will usually do it.
This completes the installation of the asdf
core 🎉
asdf
is only useful once you install a plugin, install a tool and manage its versions. Continue the guide below to learn how to do this.
For demonstration purposes we will install & set Node.js via the asdf-nodejs
plugin.
Each plugin has dependencies so we need to check the plugin repo where they should be listed. For asdf-nodejs
they are:
OS | Dependency Installation |
---|---|
Debian | apt-get install dirmngr gpg curl gawk |
CentOS/ Rocky Linux/ AlmaLinux | yum install gnupg2 curl gawk |
macOS | brew install gpg gawk |
We should install dependencies first as some Plugins have post-install hooks.
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
Now we have a plugin for Node.js we can install a version of the tool.
We can see which versions are available with asdf list all nodejs
or a subset of versions with asdf list all nodejs 14
.
We will just install the latest
available version:
asdf install nodejs latest
Note
asdf
enforces exact versions. latest
is a helper throughout asdf
that will resolve to the actual version number at the time of execution.
asdf
performs a version lookup of a tool in all .tool-versions
files from the current working directory up to the $HOME
directory. The lookup occurs just-in-time when you execute a tool that asdf
manages.
WARNING
Without a version listed for a tool execution of the tool will error. asdf current
will show you the tool & version resolution, or absence of, from your current directory so you can observe which tools will fail to execute.
Global defaults are managed in $HOME/.tool-versions
. Set a global version with:
asdf global nodejs latest
$HOME/.tool-versions
will then look like:
nodejs 16.5.0
Some OSs already have tools installed that are managed by the system and not asdf
, python
is a common example. You need to tell asdf
to pass the management back to the system. The Versions reference section will guide you.
Local versions are defined in the $PWD/.tool-versions
file (your current working directory). Usually, this will be the Git repository for a project. When in your desired directory execute:
asdf local nodejs latest
$PWD/.tool-versions
will then look like:
nodejs 16.5.0
asdf
supports the migration from existing version files from other version managers. Eg: .ruby-version
for the case of rbenv
. This is supported on a per-plugin basis.
asdf-nodejs
supports this via both .nvmrc
and .node-version
files. To enable this, add the following to your asdf
configuration file $HOME/.asdfrc
:
legacy_version_file = yes
See the configuration reference page for more config options.
That completes the Getting Started guide for asdf
🎉 You can now manage nodejs
versions for your project. Follow similar steps for each type of tool in your project!
asdf
has many more commands to become familiar with, you can see them all by running asdf --help
or asdf
. The core of the commands are broken into three categories:
asdf
is a tool version manager. All tool version definitions are contained within one file (.tool-versions
) which you can check in to your project's Git repository to share with your team, ensuring everyone is using the exact same versions of tools.
The old way of working required multiple CLI version managers, each with their distinct API, configurations files and implementation (e.g. $PATH
manipulation, shims, environment variables, etc...). asdf
provides a single interface and configuration file to simplify development workflows, and can be extended to all tools and runtimes via a simple plugin interface.
Once asdf
core is set up with your Shell configuration, plugins are installed to manage particular tools. When a tool is installed by a plugin, the executables that are installed have shims created for each of them. When you try and run one of these executables, the shim is run instead, allowing asdf
to identify which version of the tool is set in .tool-versions
and execute that version.
Tools like nvm, n and rbenv are all written as Shell scripts which create shims for the executables installed by these tools.
asdf
is very similar and was built to compete in this space of tool/runtime version management. The differentiating factor for asdf
is its plugin system which removes the need for a manager per tool/runtime, different commands per manager and different *-version
files in your repo.
augments existing shells with a new feature that can load and unload environment variables depending on the current directory.
asdf
does not manage Environment Variables, however there is a plugin asdf-direnv
to integrate direnv behaviour with asdf
.
See direnv docs for more.
The Missing Package Manager for macOS (or Linux)
Homebrew manages your packages and their upstream dependencies. asdf
does not manage upstream dependencies, it is not a package manager, that burden is upon the user, though we try and keep the dependency list small.
See Homebrew docs for more.
Nix is a tool that takes a unique approach to package management and system configuration
NixOS aims to build truly reproducible environments by managing exact versions of packages up the entire dependency tree of each tool, something asdf
does not do. NixOS does this with its own programming language, many CLI tools and a package collection of over 60,000 packages.
Again, asdf
does not manage upstream dependencies and is not a package manager.
See NixOS docs for more.
asdf
ensures teams are using the exact same versions of tools, with support for many tools via a plugin system, and the simplicity and familiarity of being a single Shell script you include in your Shell config.
Note
asdf
is not intended to be a system package manager. It is a tool version manager. Just because you can create a plugin for any tool and manage its versions with asdf
, does not mean that is the best course of action for that specific tool.
asdf
is a tool version manager. All tool version definitions are contained within one file (.tool-versions
) which you can check in to your project's Git repository to share with your team, ensuring everyone is using the exact same versions of tools.
The old way of working required multiple CLI version managers, each with their distinct API, configurations files and implementation (e.g. $PATH
manipulation, shims, environment variables, etc...). asdf
provides a single interface and configuration file to simplify development workflows, and can be extended to all tools and runtimes via a simple plugin interface.
Once asdf
core is set up with your Shell configuration, plugins are installed to manage particular tools. When a tool is installed by a plugin, the executables that are installed have shims created for each of them. When you try and run one of these executables, the shim is run instead, allowing asdf
to identify which version of the tool is set in .tool-versions
and execute that version.
Tools like nvm, n and rbenv are all written as Shell scripts which create shims for the executables installed by these tools.
asdf
is very similar and was built to compete in this space of tool/runtime version management. The differentiating factor for asdf
is its plugin system which removes the need for a manager per tool/runtime, different commands per manager and different *-version
files in your repo.
augments existing shells with a new feature that can load and unload environment variables depending on the current directory.
asdf
does not manage Environment Variables, however there is a plugin asdf-direnv
to integrate direnv behaviour with asdf
.
See direnv docs for more.
The Missing Package Manager for macOS (or Linux)
Homebrew manages your packages and their upstream dependencies. asdf
does not manage upstream dependencies, it is not a package manager, that burden is upon the user, though we try and keep the dependency list small.
See Homebrew docs for more.
Nix is a tool that takes a unique approach to package management and system configuration
NixOS aims to build truly reproducible environments by managing exact versions of packages up the entire dependency tree of each tool, something asdf
does not do. NixOS does this with its own programming language, many CLI tools and a package collection of over 60,000 packages.
Again, asdf
does not manage upstream dependencies and is not a package manager.
See NixOS docs for more.
asdf
ensures teams are using the exact same versions of tools, with support for many tools via a plugin system, and the simplicity and familiarity of being a single Shell script you include in your Shell config.
Note
asdf
is not intended to be a system package manager. It is a tool version manager. Just because you can create a plugin for any tool and manage its versions with asdf
, does not mean that is the best course of action for that specific tool.
これは、asdf
コアのコントリビューションガイドです。
GitHubでasdf
をフォークするか、デフォルトのブランチをGitクローンしてください:
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git
コア開発用のツールは、このリポジトリの.tool-versions
で定義されています。asdf
自身でこれらのツールを管理したい場合は、下記のようにプラグインを追加してください:
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git
asdf
の開発に必要なバージョンを、下記のようにインストールします:
asdf install
開発ツールに影響を与える特定の機能を壊す可能性もあるため、ローカルマシンで開発する際は、asdf
を使用しないほうが 良いかもしれません 。下記に、使用しているツールを列挙します:
インストール済みのasdf
に変更を加えずに、あなたが開発した変更内容を試したいときは、$ASDF_DIR
変数に、クローンしたリポジトリのパスを設定し、そのディレクトリのbin
とshims
ディレクトリを一時的にパスの先頭へ追加します。
リモートにコミットまたはプッシュする前に、コードをローカルでフォーマット、Lint、およびテストすることを推奨します。その際は、次のスクリプト/コマンドを使用してください:
# Lint
+./scripts/lint.bash --check
+
+# Fix & Format
+./scripts/lint.bash --fix
+
+# Test: all tests
+./scripts/test.bash
+
+# Test: for specific command
+bats test/list_commands.bash
ヒント
テストを作ってください! - 新機能にとってテストは必要不可欠であり、バグ修正のレビューをスピードアップさせることができます。プルリクエストを作成する前に、新しいコードをカバーするようなテストを作成してください。bats-coreのドキュメントもご覧ください。
下記は、asdf-vm/asdf
リポジトリの.gitignore
ファイルです。プロジェクト固有のファイルは無視をしています。使用しているOS、ツール、およびワークフロー固有のファイルは、グローバルな.gitignore
構成で無視する必要があります。詳しくはこちらをご覧ください。
.git-blame-ignore-revs
asdf
では、.git-blame-ignore-revs
を使用して、Blameを実行する際のノイズを減らしています。詳しくは、git blameのドキュメントをご覧ください。
git blame
を実行するときは、下記のように、このファイルと共に使います:
git blame --ignore-revs-file .git-blame-ignore-revs ./test/install_command.bats
毎回手動でファイルを指定しなくても、gitのオプションで、blame
を呼び出すたびにこのファイルを使うように設定することもできます:
git config blame.ignoreRevsFile .git-blame-ignore-revs
このファイルを使用するように、IDEを設定することもできます。例えば、VSCode(およびGitLens)を使う場合は、.vscode/settings.json
に下記のように記述します:
{
+ "gitlens.advanced.blame.customArguments": [
+ "--ignore-revs-file",
+ ".git-blame-ignore-revs"
+ ]
+}
ローカルでテストを実行するには、下記のようにテストを呼び出します:
./scripts/test.bash
テストを作成する前に、下記項目を一通り参照してください:
test/
内にすでに作成されているテストscripts/test.bash
で使用されている既存のBatsの設定Batsでのデバッグは、難しいことがあります。-t
フラグを指定してTAP出力を有効にすると、テスト実行中に特殊なファイルディスクリプタ>&3
を使用して出力を表示できるため、デバッグが簡単になります。例えば次のとおりです:
# test/some_tests.bats
+
+printf "%s\\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\\n" "Will be printed during bats -t test/some_tests.bats" >&3
詳しくは、bats-coreドキュメント内のPrinting to the Terminalで説明されています。
asdf
は、Release Pleaseという自動リリースツールを使用して、セマンティックバージョンを自動的に引き上げ、Changelogを生成しています。この情報は、前回のリリースからのコミット履歴を読み込むことで生成されます。
Conventional Commit messagesでは、デフォルトブランチでのコミットメッセージのフォーマットとなる、プルリクエストタイトルのフォーマットを定義しています。これは、GitHub Actionamannn/action-semantic-pull-request
で強制されます。
Conventional Commitは、下記のフォーマットに従います:
<type>[optional scope][optional !]: <description>
+
+<!-- examples -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change
<types>
の種類は次のとおりです: feat
、fix
、docs
、style
、 refactor
、 perf
、test
、build
、ci
、chore
、 revert
。
!
: 破壊的変更を示しますfix
: セマンティックバージョンのpatch
を新しく作成しますfeat
: セマンティックバージョンのminor
を新しく作成します<type>!
: セマンティックバージョンのmajor
を新しく作成しますプルリクエストのタイトルは、このフォーマットに従う必要があります。
ヒント
プルリクエストのタイトルには、Conventional Commit messageのフォーマットを使用してください。
asdf-alpineおよびasdf-ubuntuプロジェクトは、一部のasdfツールのDocker化されたイメージを提供する取り組みを継続的に行っています。これらのDockerイメージは、開発用サーバのベースとしたり、本番用アプリケーションの実行用途として使用することができます。
`,47)]))}const g=a(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/ja-jp_contribute_core.md.Dl6llQ1K.lean.js b/assets/ja-jp_contribute_core.md.Dl6llQ1K.lean.js new file mode 100644 index 00000000..782df053 --- /dev/null +++ b/assets/ja-jp_contribute_core.md.Dl6llQ1K.lean.js @@ -0,0 +1,31 @@ +import{_ as a,c as e,a2 as i,o as t}from"./chunks/framework.C9NVOr0y.js";const k=JSON.parse('{"title":"asdf","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/contribute/core.md","filePath":"ja-jp/contribute/core.md","lastUpdated":1704890757000}'),n={name:"ja-jp/contribute/core.md"};function l(p,s,h,o,r,d){return t(),e("div",null,s[0]||(s[0]=[i(`これは、asdf
コアのコントリビューションガイドです。
GitHubでasdf
をフォークするか、デフォルトのブランチをGitクローンしてください:
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git
コア開発用のツールは、このリポジトリの.tool-versions
で定義されています。asdf
自身でこれらのツールを管理したい場合は、下記のようにプラグインを追加してください:
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git
asdf
の開発に必要なバージョンを、下記のようにインストールします:
asdf install
開発ツールに影響を与える特定の機能を壊す可能性もあるため、ローカルマシンで開発する際は、asdf
を使用しないほうが 良いかもしれません 。下記に、使用しているツールを列挙します:
インストール済みのasdf
に変更を加えずに、あなたが開発した変更内容を試したいときは、$ASDF_DIR
変数に、クローンしたリポジトリのパスを設定し、そのディレクトリのbin
とshims
ディレクトリを一時的にパスの先頭へ追加します。
リモートにコミットまたはプッシュする前に、コードをローカルでフォーマット、Lint、およびテストすることを推奨します。その際は、次のスクリプト/コマンドを使用してください:
# Lint
+./scripts/lint.bash --check
+
+# Fix & Format
+./scripts/lint.bash --fix
+
+# Test: all tests
+./scripts/test.bash
+
+# Test: for specific command
+bats test/list_commands.bash
ヒント
テストを作ってください! - 新機能にとってテストは必要不可欠であり、バグ修正のレビューをスピードアップさせることができます。プルリクエストを作成する前に、新しいコードをカバーするようなテストを作成してください。bats-coreのドキュメントもご覧ください。
下記は、asdf-vm/asdf
リポジトリの.gitignore
ファイルです。プロジェクト固有のファイルは無視をしています。使用しているOS、ツール、およびワークフロー固有のファイルは、グローバルな.gitignore
構成で無視する必要があります。詳しくはこちらをご覧ください。
.git-blame-ignore-revs
asdf
では、.git-blame-ignore-revs
を使用して、Blameを実行する際のノイズを減らしています。詳しくは、git blameのドキュメントをご覧ください。
git blame
を実行するときは、下記のように、このファイルと共に使います:
git blame --ignore-revs-file .git-blame-ignore-revs ./test/install_command.bats
毎回手動でファイルを指定しなくても、gitのオプションで、blame
を呼び出すたびにこのファイルを使うように設定することもできます:
git config blame.ignoreRevsFile .git-blame-ignore-revs
このファイルを使用するように、IDEを設定することもできます。例えば、VSCode(およびGitLens)を使う場合は、.vscode/settings.json
に下記のように記述します:
{
+ "gitlens.advanced.blame.customArguments": [
+ "--ignore-revs-file",
+ ".git-blame-ignore-revs"
+ ]
+}
ローカルでテストを実行するには、下記のようにテストを呼び出します:
./scripts/test.bash
テストを作成する前に、下記項目を一通り参照してください:
test/
内にすでに作成されているテストscripts/test.bash
で使用されている既存のBatsの設定Batsでのデバッグは、難しいことがあります。-t
フラグを指定してTAP出力を有効にすると、テスト実行中に特殊なファイルディスクリプタ>&3
を使用して出力を表示できるため、デバッグが簡単になります。例えば次のとおりです:
# test/some_tests.bats
+
+printf "%s\\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\\n" "Will be printed during bats -t test/some_tests.bats" >&3
詳しくは、bats-coreドキュメント内のPrinting to the Terminalで説明されています。
asdf
は、Release Pleaseという自動リリースツールを使用して、セマンティックバージョンを自動的に引き上げ、Changelogを生成しています。この情報は、前回のリリースからのコミット履歴を読み込むことで生成されます。
Conventional Commit messagesでは、デフォルトブランチでのコミットメッセージのフォーマットとなる、プルリクエストタイトルのフォーマットを定義しています。これは、GitHub Actionamannn/action-semantic-pull-request
で強制されます。
Conventional Commitは、下記のフォーマットに従います:
<type>[optional scope][optional !]: <description>
+
+<!-- examples -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change
<types>
の種類は次のとおりです: feat
、fix
、docs
、style
、 refactor
、 perf
、test
、build
、ci
、chore
、 revert
。
!
: 破壊的変更を示しますfix
: セマンティックバージョンのpatch
を新しく作成しますfeat
: セマンティックバージョンのminor
を新しく作成します<type>!
: セマンティックバージョンのmajor
を新しく作成しますプルリクエストのタイトルは、このフォーマットに従う必要があります。
ヒント
プルリクエストのタイトルには、Conventional Commit messageのフォーマットを使用してください。
asdf-alpineおよびasdf-ubuntuプロジェクトは、一部のasdfツールのDocker化されたイメージを提供する取り組みを継続的に行っています。これらのDockerイメージは、開発用サーバのベースとしたり、本番用アプリケーションの実行用途として使用することができます。
`,47)]))}const g=a(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/ja-jp_contribute_documentation.md.DFrK7QhV.js b/assets/ja-jp_contribute_documentation.md.DFrK7QhV.js new file mode 100644 index 00000000..a019bfa8 --- /dev/null +++ b/assets/ja-jp_contribute_documentation.md.DFrK7QhV.js @@ -0,0 +1,42 @@ +import{_ as i,c as a,a2 as n,o as e}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"ドキュメント & サイト","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/contribute/documentation.md","filePath":"ja-jp/contribute/documentation.md","lastUpdated":1704890757000}'),t={name:"ja-jp/contribute/documentation.md"};function l(p,s,h,k,d,r){return e(),a("div",null,s[0]||(s[0]=[n(`これは、ドキュメントおよびサイトのコントリビューションガイドです。
GitHubでasdf
をフォークするか、デフォルトのブランチをGitクローンしてください:
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git
ドキュメントサイト開発用のツールは、asdf
によってdocs/.tool-versions
で管理されています。下記のようにプラグインを追加してください:
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs
開発に必要なバージョンを、下記のようにインストールします:
asdf install
docs/package.json
をもとに、Node.jsの依存関係をインストールしてください:
npm install
VitePress (v2)は、asdfドキュメントサイトを構築するために使用している静的サイトジェネレータ(SSG)です。類似ツールであるDocsify.jsやVuePressに代わってVitePressが採用されたのは、ユーザがJavaScriptを使用できない、または有効にしていない場合に、HTMLのみのフォールバックをサポートしたいからでした。これは、DocsifyとVitePressがVuePressに急速に取って代わっていた場合には不可能でした。これ以外の機能セットはほとんど同じで、最小限の構成でMarkdownファイルを書くことに重点を置いています。
package.json
には、開発に必要なスクリプトが含まれています:
ローカルの開発サーバを起動するには、次のように実行します:
npm run dev
コミットする前にコードをフォーマットするには、次のように実行します:
npm run format
asdf
は、プルリクエストタイトルのConventional Commitsに依存する自動リリースパイプラインを使用しています。詳しくは、コアのコントリビューションガイドのドキュメントに記述されています。
ドキュメントの変更に関するプルリクエストを作成する場合、プルリクエストのタイトルは、Conventional Commit typeをdocs
として、docs: <description>
というフォーマットで作成するようにしてください。
サイトの構成設定は、構成を示すために使用されるJSオブジェクト含んだ、いくつかのTypeScriptファイルに記述されています。以下のとおりです:
docs/.vitepress/config.js
: サイトのルート構成ファイルです。仕様については、VitePressのドキュメントをご覧ください。ルート構成ファイルを簡素化するために、 Navバー と サイドバー の構成を示す大きなJSオブジェクトについては、別ファイルに切り出されており、かつ、ロケールごとに分類されています。次の両方のファイルを参照してください:
docs/.vitepress/navbars.js
docs/.vitepress/sidebars.js
これらの構成設定に関する公式ドキュメントは、Default Theme Referenceをご覧ください。
VitePressは、国際化対応に関して最高のサポートを備えています。 ルート構成ファイルであるdocs/.vitepress/config.js
では、サポートされているロケールとそのURL、ドロップメニューのタイトル、Navバー/サイドバーの構成への参照を定義しています。
Navバー/サイドバーの構成設定は前述の構成ファイルにキャプチャされ、ロケールごとに分類され、個別にエクスポートされます。
各ロケールのMarkdownコンテンツは、ルート構成ファイル内のlocales
内のキーと同じ名前のディレクトリ配下に配置する必要があります。ルート構成が下記の場合:
// docs/.vitepress/config.js
+export default defineConfig({
+ ...
+ locales: {
+ root: {
+ label: "English",
+ lang: "en-US",
+ themeConfig: {
+ nav: navbars.en,
+ sidebar: sidebars.en,
+ },
+ },
+ "pt-br": {
+ label: "Brazilian Portuguese",
+ lang: "pr-br",
+ themeConfig: {
+ nav: navbars.pt_br,
+ sidebar: sidebars.pt_br,
+ },
+ },
+ "zh-hans": {
+ label: "简体中文",
+ lang: "zh-hans",
+ themeConfig: {
+ nav: navbars.zh_hans,
+ sidebar: sidebars.zh_hans,
+ },
+ },
+ },
+})
/pt-BR/
を有効にするには、下記のように、docs/pt-BR/
配下に同じMarkdownファイルのセットを配置する必要があります:
docs
+├─ README.md
+├─ foo.md
+├─ nested
+│ └─ README.md
+└─ pt-BR
+ ├─ README.md
+ ├─ foo.md
+ └─ nested
+ └─ README.md
公式のVitePress i18nドキュメントには、より詳細な説明が記述されています。
`,37)]))}const E=i(t,[["render",l]]);export{c as __pageData,E as default}; diff --git a/assets/ja-jp_contribute_documentation.md.DFrK7QhV.lean.js b/assets/ja-jp_contribute_documentation.md.DFrK7QhV.lean.js new file mode 100644 index 00000000..a019bfa8 --- /dev/null +++ b/assets/ja-jp_contribute_documentation.md.DFrK7QhV.lean.js @@ -0,0 +1,42 @@ +import{_ as i,c as a,a2 as n,o as e}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"ドキュメント & サイト","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/contribute/documentation.md","filePath":"ja-jp/contribute/documentation.md","lastUpdated":1704890757000}'),t={name:"ja-jp/contribute/documentation.md"};function l(p,s,h,k,d,r){return e(),a("div",null,s[0]||(s[0]=[n(`これは、ドキュメントおよびサイトのコントリビューションガイドです。
GitHubでasdf
をフォークするか、デフォルトのブランチをGitクローンしてください:
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git
ドキュメントサイト開発用のツールは、asdf
によってdocs/.tool-versions
で管理されています。下記のようにプラグインを追加してください:
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs
開発に必要なバージョンを、下記のようにインストールします:
asdf install
docs/package.json
をもとに、Node.jsの依存関係をインストールしてください:
npm install
VitePress (v2)は、asdfドキュメントサイトを構築するために使用している静的サイトジェネレータ(SSG)です。類似ツールであるDocsify.jsやVuePressに代わってVitePressが採用されたのは、ユーザがJavaScriptを使用できない、または有効にしていない場合に、HTMLのみのフォールバックをサポートしたいからでした。これは、DocsifyとVitePressがVuePressに急速に取って代わっていた場合には不可能でした。これ以外の機能セットはほとんど同じで、最小限の構成でMarkdownファイルを書くことに重点を置いています。
package.json
には、開発に必要なスクリプトが含まれています:
ローカルの開発サーバを起動するには、次のように実行します:
npm run dev
コミットする前にコードをフォーマットするには、次のように実行します:
npm run format
asdf
は、プルリクエストタイトルのConventional Commitsに依存する自動リリースパイプラインを使用しています。詳しくは、コアのコントリビューションガイドのドキュメントに記述されています。
ドキュメントの変更に関するプルリクエストを作成する場合、プルリクエストのタイトルは、Conventional Commit typeをdocs
として、docs: <description>
というフォーマットで作成するようにしてください。
サイトの構成設定は、構成を示すために使用されるJSオブジェクト含んだ、いくつかのTypeScriptファイルに記述されています。以下のとおりです:
docs/.vitepress/config.js
: サイトのルート構成ファイルです。仕様については、VitePressのドキュメントをご覧ください。ルート構成ファイルを簡素化するために、 Navバー と サイドバー の構成を示す大きなJSオブジェクトについては、別ファイルに切り出されており、かつ、ロケールごとに分類されています。次の両方のファイルを参照してください:
docs/.vitepress/navbars.js
docs/.vitepress/sidebars.js
これらの構成設定に関する公式ドキュメントは、Default Theme Referenceをご覧ください。
VitePressは、国際化対応に関して最高のサポートを備えています。 ルート構成ファイルであるdocs/.vitepress/config.js
では、サポートされているロケールとそのURL、ドロップメニューのタイトル、Navバー/サイドバーの構成への参照を定義しています。
Navバー/サイドバーの構成設定は前述の構成ファイルにキャプチャされ、ロケールごとに分類され、個別にエクスポートされます。
各ロケールのMarkdownコンテンツは、ルート構成ファイル内のlocales
内のキーと同じ名前のディレクトリ配下に配置する必要があります。ルート構成が下記の場合:
// docs/.vitepress/config.js
+export default defineConfig({
+ ...
+ locales: {
+ root: {
+ label: "English",
+ lang: "en-US",
+ themeConfig: {
+ nav: navbars.en,
+ sidebar: sidebars.en,
+ },
+ },
+ "pt-br": {
+ label: "Brazilian Portuguese",
+ lang: "pr-br",
+ themeConfig: {
+ nav: navbars.pt_br,
+ sidebar: sidebars.pt_br,
+ },
+ },
+ "zh-hans": {
+ label: "简体中文",
+ lang: "zh-hans",
+ themeConfig: {
+ nav: navbars.zh_hans,
+ sidebar: sidebars.zh_hans,
+ },
+ },
+ },
+})
/pt-BR/
を有効にするには、下記のように、docs/pt-BR/
配下に同じMarkdownファイルのセットを配置する必要があります:
docs
+├─ README.md
+├─ foo.md
+├─ nested
+│ └─ README.md
+└─ pt-BR
+ ├─ README.md
+ ├─ foo.md
+ └─ nested
+ └─ README.md
公式のVitePress i18nドキュメントには、より詳細な説明が記述されています。
`,37)]))}const E=i(t,[["render",l]]);export{c as __pageData,E as default}; diff --git a/assets/ja-jp_contribute_first-party-plugins.md.C-K_bFJd.js b/assets/ja-jp_contribute_first-party-plugins.md.C-K_bFJd.js new file mode 100644 index 00000000..5e02888f --- /dev/null +++ b/assets/ja-jp_contribute_first-party-plugins.md.C-K_bFJd.js @@ -0,0 +1 @@ +import{_ as a,c as r,a2 as t,o as i}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"公式プラグイン","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/contribute/first-party-plugins.md","filePath":"ja-jp/contribute/first-party-plugins.md","lastUpdated":1704890757000}'),s={name:"ja-jp/contribute/first-party-plugins.md"};function l(o,e,d,n,f,c){return i(),r("div",null,e[0]||(e[0]=[t('asdfコアチームでは、日々のワークライフに関連するプラグインをいくつか作成しています。これらのプラグインのメンテナンスおよび改善にご協力いただける方を、いつでも歓迎しています。詳しくは、下記リンクから、それぞれのリポジトリを参照してください:
コミュニティプラグインについては、下記をご覧ください:
asdf-community
オーガナイゼーション: asdf
プラグインの長期的なメンテナンスを目的としたコミュニティ主導の共同プロジェクトです。asdf-plugins
ショートネームリポジトリ: ポピュラーなasdf
プラグインを検索するためにasdf
コアが使用する、ショートネームのリストです。asdf-plugin
トピック検索asdfコアチームでは、日々のワークライフに関連するプラグインをいくつか作成しています。これらのプラグインのメンテナンスおよび改善にご協力いただける方を、いつでも歓迎しています。詳しくは、下記リンクから、それぞれのリポジトリを参照してください:
コミュニティプラグインについては、下記をご覧ください:
asdf-community
オーガナイゼーション: asdf
プラグインの長期的なメンテナンスを目的としたコミュニティ主導の共同プロジェクトです。asdf-plugins
ショートネームリポジトリ: ポピュラーなasdf
プラグインを検索するためにasdf
コアが使用する、ショートネームのリストです。asdf-plugin
トピック検索asdf
のインストールには次の手順が必要です:
asdf
コアのダウンロードasdf
のインストール.tool-versions
ファイルで、グローバルまたはプロジェクトのバージョンをセットasdfの動作にはgit
およびcurl
が必要です。以下の表は、 あなたが使用している パッケージマネージャで実行するコマンドの 一部例 です(some might automatically install these tools in later steps)。
OS | パッケージマネージャ | コマンド |
---|---|---|
linux | Aptitude | apt install curl git |
linux | DNF | dnf install curl git |
linux | Pacman | pacman -S curl git |
linux | Zypper | zypper install curl git |
macOS | Homebrew | brew install coreutils curl git |
macOS | Spack | spack install coreutils curl git |
備考
お使いのシステムの構成によっては、接頭にsudo
が必要となる場合もあります。
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.13.1
理由がない限り、git
コマンドを使用した公式ダウンロードの手順を使用することを強く推奨します。
方法 | コマンド |
---|---|
Homebrew | brew install asdf |
Pacman | git clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si または好みのAURヘルパーを使用 |
あなたが使用しているシェル、OS、およびインストール方法によって、ここでの設定方法が変わります。最も適したものを選択してください。
masOSユーザの方は、この節の最後にあるpath_helper
に関する警告を必ず参照してください。
~/.bashrc
に下記の行を追記します:
. "$HOME/.asdf/asdf.sh"
コマンド補完が必要な場合は、.bashrc
に下記の行を追記します:
. "$HOME/.asdf/completions/asdf.bash"
macOS Catalina以降を使用している場合、デフォルトのシェルはZSHです。Bashに変更していない限り、ZSHの手順を参照してください。
~/.bash_profile
に下記の行を追記します:
. "$HOME/.asdf/asdf.sh"
コマンド補完が必要な場合は、.bash_profile
に下記の行を追記します:
. "$HOME/.asdf/completions/asdf.bash"
下記コマンドで、~/.bashrc
にasdf.sh
を追加します:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bashrc
コマンド補完が必要な場合は、Homebrewのガイドに従って設定を完了させるか、下記コマンドを実行します:
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
macOS Catalina以降を使用している場合、デフォルトのシェルはZSHです。Bashに変更していない限り、ZSHの手順を参照してください。
下記コマンドで、~/.bash_profile
にasdf.sh
を追加します:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bash_profile
コマンド補完が必要な場合は、Homebrewのガイドに従って設定を完了させるか、下記コマンドを実行します:
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
~/.bashrc
に下記の行を追記します:
. /opt/asdf-vm/asdf.sh
コマンド補完が必要な場合は、bash-completion
をインストールします。
~/.config/fish/config.fish
に下記の行を追記します:
source ~/.asdf/asdf.fish
コマンド補完が必要な場合は、下記コマンドを実行します:
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
下記コマンドで、~/.config/fish/config.fish
にasdf.sh
を追加します:
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish
コマンド補完は、Fish shellのHomebrewが担います。親切ですね!
~/.config/fish/config.fish
に下記の行を追記します:
source /opt/asdf-vm/asdf.fish
コマンド補完は、AURパッケージのインストール時に自動的に設定されます。
下記コマンドで、~/.config/elvish/rc.elv
にasdf.elv
を追加します:
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
コマンド補完は自動的に設定されます。
下記コマンドで、~/.config/elvish/rc.elv
にasdf.elv
を追加します:
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
コマンド補完は自動的に設定されます。
下記コマンドで、~/.config/elvish/rc.elv
にasdf.elv
を追加します:
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
コマンド補完は自動的に設定されます。
~/.zshrc
に下記の行を追記します:
. "$HOME/.asdf/asdf.sh"
または、asdf for oh-my-zshのようなZSHフレームワークプラグインを使用して、このスクリプトをsourceし、コマンド補完をセットアップします。
コマンド補完は、ZSHフレームワークのasdf
プラグインで設定するか、~/.zshrc
に下記の行を追記することで設定できます:
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
compinit
のセットアップをカスタマイズしている場合は、asdf.sh
ソース以下にcompinit
がくるようにしてください。compinit
のセットアップをカスタマイズしている場合は、フレームワークソース以下にcompinit
がくるようにしてください。警告
ZSHフレームワークを使用している場合、新しいZSHコマンド補完を使用するには、fpath
経由で、関連するasdf
プラグインの更新が必要となることがあります。Oh-My-ZSH asdfプラグインは、ohmyzsh/ohmyzsh#8837でご覧いただくと分かるとおり、まだ更新されていません。
下記コマンドで、~/.zshrc
にasdf.sh
を追加します:
echo -e "\\n. $(brew --prefix asdf)/libexec/asdf.sh" >> \${ZDOTDIR:-~}/.zshrc
OR use a ZSH Framework plugin like asdf for oh-my-zsh which will source this script and setup completions.
コマンド補完は、ZSHフレームワークasdf
によって設定されるか、Homebrewの説明に従って設定必要があります。ZSHフレームワークを使用している場合、新しいZSHコマンド補完を使用するには、fpath
経由で、関連するasdf
プラグインの更新が必要となることがあります。Oh-My-ZSH asdfプラグインは、ohmyzsh/ohmyzsh#8837でご覧いただくと分かるとおり、まだ更新されていません。
~/.zshrc
に下記の行を追記します:
. /opt/asdf-vm/asdf.sh
コマンド補完は、ZSHに適した場所に配置されますが、オートコンプリートを使用するようにZSHを設定する必要があります。
~/.config/powershell/profile.ps1
に下記の行を追記します:
. "$HOME/.asdf/asdf.ps1"
下記コマンドで、~/.config/powershell/profile.ps1
にasdf.sh
を追加します:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
~/.config/powershell/profile.ps1
に下記の行を追記します:
. /opt/asdf-vm/asdf.ps1
下記コマンドで、~/.config/nushell/config.nu
にasdf.nu
を追加します:
"\\n$env.ASDF_NU_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path
コマンド補完は自動的に設定されます。
下記コマンドで、~/.config/nushell/config.nu
にasdf.nu
を追加します:
"\\n$env.ASDF_NU_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\\n source " + (brew --prefix asdf | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path
コマンド補完は自動的に設定されます。
下記コマンドで、~/.config/nushell/config.nu
にasdf.nu
を追加します:
"\\n$env.ASDF_NU_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path
コマンド補完は自動的に設定されます。
~/.profile
に下記の行を追記します:
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
下記コマンドで、~/.profile
にasdf.sh
を追加します:
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
~/.profile
に下記の行を追記します:
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh
asdf
のスクリプトは、$PATH
を設定したあと、かつ、使用中のフレームワーク(oh-my-zsh など)を呼び出したあとに記述する必要があります。
警告
macOSでは、BasgまたはZSHシェルを起動すると、自動的にpath_helper
というユーティリティが呼び出されます。path_helper
はPATH
(およびMANPATH
)内の項目の順番を並び替えることができるため、特定の順序を必要とするツールの動作に、一貫性が無くなってしまいます。これを回避するため、macOSでasdf
を利用するときは、強制的にPATH
エントリの先頭に追加する(優先度を一番高くする)ようにしてください。これは、ASDF_FORCE_PREPEND
環境変数で制御できます。
PATH
の変更を反映するために、シェルを再起動してください。たいていの場合、ターミナルのタブを新たに開けばOKです。
これで、asdf
のコアのインストールは完了です🎉
しかし、asdf
が役に立つようになるのは、プラグインをインストールしてからツールをインストールし、バージョンを管理するようになってからです。引き続き、ガイドを進めていきましょう。
ここではデモとして、asdf-nodejs
プラグインを使用してNode.jsをインストール・設定してみましょう。
各プラグインには依存関係があるため、プラグインのリポジトリを確認しておきましょう。asdf-nodejs
の場合、必要なものは次のとおりです:
OS | 依存関係インストールコマンド |
---|---|
Debian | apt-get install dirmngr gpg curl gawk |
CentOS/ Rocky Linux/ AlmaLinux | yum install gnupg2 curl gawk |
macOS | brew install gpg gawk |
一部のプラグインではインストール後の事後処理でこれらの依存関係が必要となるため、あらかじめインストールしておきましょう。
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
Node.js用のプラグインをインストールしたので、このツールの特定のバージョンをインストールしましょう。
インストール可能なバージョンはasdf list all nodejs
コマンドで確認できますし、特定のメジャーバージョンのサブセットはasdf list all nodejs 14
コマンドで確認できます。
最新版をインストールするには、次のコマンドを実行します:
asdf install nodejs latest
備考
asdf
では正確なバージョン番号を指定してください。latest
は、現時点での最新バージョンを指定できるasdf
のヘルパーです。
asdf
は、カレントディレクトリから上位の$HOME
ディレクトリまでに存在するすべての.tool-versions
ファイルをもとに、ツールのバージョンを照会します。照会は、asdf
で管理するツールを実行した際に、ジャストインタイムで行われます。
警告
ツールで指定されたバージョンが見つからない場合、エラーが発生します。asdf current
コマンドを実行すると、カレントディレクトリにおいてツールのバージョンを解決可能か確認できるため、どのツールが実行に失敗するか検証することができます。
グローバルのデフォルト設定は、$HOME/.tool-versions
で管理されます。グローバルのバージョンをセットするには、次のコマンドを実行します:
asdf global nodejs latest
すると、$HOME/.tool-versions
内には次のように書き込まれます:
nodejs 16.5.0
一部のOSでは、python
のように、asdf
ではなくシステムが管理するツールが既にインストールされていることがあります。それを使用する場合、asdf
に対して、バージョン管理をシステムに委任するように指示する必要があります。詳しくは、バージョンのリファレンスをご覧ください。
ローカルのバージョン設定は、$PWD/.tool-versions
ファイル(カレントディレクトリ内)で定義されます。たいていの場合は、プロジェクトのGitリポジトリ内となるでしょう。対象となるディレクトリで、下記コマンドを実行します:
asdf local nodejs latest
すると、$PWD/.tool-versions
内には次のように書き込まれます:
nodejs 16.5.0
asdf
は、他のバージョンマネージャ向けに作られた既存のバージョンファイル(例: rbenv
の場合は.ruby-version
ファイル)からの移行をサポートしています。これはプラグイン単位でのサポートです。
asdf-nodejs
であれば、.nvmrc
ファイルと.node-version
ファイルの両方に対応しています。このサポートを有効にするには、asdf
の構成設定ファイルである$HOME/.asdfrc
内に、下記の行を追記してください:
legacy_version_file = yes
構成設定でのその他のオプションについて詳しくは、構成設定のリファレンスをご覧ください。
以上で、asdf
の入門は完了です🎉 ここまでで、プロジェクトでのnodejs
のバージョン管理ができるようになりました。プロジェクトで使用するツールごとに、同様の手順を実施してください!
asdf
には使いこなすと便利なコマンドが他にもいっぱいあり、asdf --help
コマンドまたは単にasdf
コマンドを実行すれば、すべてのコマンドの説明を見ることができます。コマンドは大きく分けて3つのカテゴリに分けられます:
asdf
のインストールには次の手順が必要です:
asdf
コアのダウンロードasdf
のインストール.tool-versions
ファイルで、グローバルまたはプロジェクトのバージョンをセットasdfの動作にはgit
およびcurl
が必要です。以下の表は、 あなたが使用している パッケージマネージャで実行するコマンドの 一部例 です(some might automatically install these tools in later steps)。
OS | パッケージマネージャ | コマンド |
---|---|---|
linux | Aptitude | apt install curl git |
linux | DNF | dnf install curl git |
linux | Pacman | pacman -S curl git |
linux | Zypper | zypper install curl git |
macOS | Homebrew | brew install coreutils curl git |
macOS | Spack | spack install coreutils curl git |
備考
お使いのシステムの構成によっては、接頭にsudo
が必要となる場合もあります。
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.13.1
理由がない限り、git
コマンドを使用した公式ダウンロードの手順を使用することを強く推奨します。
方法 | コマンド |
---|---|
Homebrew | brew install asdf |
Pacman | git clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si または好みのAURヘルパーを使用 |
あなたが使用しているシェル、OS、およびインストール方法によって、ここでの設定方法が変わります。最も適したものを選択してください。
masOSユーザの方は、この節の最後にあるpath_helper
に関する警告を必ず参照してください。
~/.bashrc
に下記の行を追記します:
. "$HOME/.asdf/asdf.sh"
コマンド補完が必要な場合は、.bashrc
に下記の行を追記します:
. "$HOME/.asdf/completions/asdf.bash"
macOS Catalina以降を使用している場合、デフォルトのシェルはZSHです。Bashに変更していない限り、ZSHの手順を参照してください。
~/.bash_profile
に下記の行を追記します:
. "$HOME/.asdf/asdf.sh"
コマンド補完が必要な場合は、.bash_profile
に下記の行を追記します:
. "$HOME/.asdf/completions/asdf.bash"
下記コマンドで、~/.bashrc
にasdf.sh
を追加します:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bashrc
コマンド補完が必要な場合は、Homebrewのガイドに従って設定を完了させるか、下記コマンドを実行します:
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
macOS Catalina以降を使用している場合、デフォルトのシェルはZSHです。Bashに変更していない限り、ZSHの手順を参照してください。
下記コマンドで、~/.bash_profile
にasdf.sh
を追加します:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bash_profile
コマンド補完が必要な場合は、Homebrewのガイドに従って設定を完了させるか、下記コマンドを実行します:
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
~/.bashrc
に下記の行を追記します:
. /opt/asdf-vm/asdf.sh
コマンド補完が必要な場合は、bash-completion
をインストールします。
~/.config/fish/config.fish
に下記の行を追記します:
source ~/.asdf/asdf.fish
コマンド補完が必要な場合は、下記コマンドを実行します:
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
下記コマンドで、~/.config/fish/config.fish
にasdf.sh
を追加します:
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish
コマンド補完は、Fish shellのHomebrewが担います。親切ですね!
~/.config/fish/config.fish
に下記の行を追記します:
source /opt/asdf-vm/asdf.fish
コマンド補完は、AURパッケージのインストール時に自動的に設定されます。
下記コマンドで、~/.config/elvish/rc.elv
にasdf.elv
を追加します:
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
コマンド補完は自動的に設定されます。
下記コマンドで、~/.config/elvish/rc.elv
にasdf.elv
を追加します:
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
コマンド補完は自動的に設定されます。
下記コマンドで、~/.config/elvish/rc.elv
にasdf.elv
を追加します:
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
コマンド補完は自動的に設定されます。
~/.zshrc
に下記の行を追記します:
. "$HOME/.asdf/asdf.sh"
または、asdf for oh-my-zshのようなZSHフレームワークプラグインを使用して、このスクリプトをsourceし、コマンド補完をセットアップします。
コマンド補完は、ZSHフレームワークのasdf
プラグインで設定するか、~/.zshrc
に下記の行を追記することで設定できます:
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
compinit
のセットアップをカスタマイズしている場合は、asdf.sh
ソース以下にcompinit
がくるようにしてください。compinit
のセットアップをカスタマイズしている場合は、フレームワークソース以下にcompinit
がくるようにしてください。警告
ZSHフレームワークを使用している場合、新しいZSHコマンド補完を使用するには、fpath
経由で、関連するasdf
プラグインの更新が必要となることがあります。Oh-My-ZSH asdfプラグインは、ohmyzsh/ohmyzsh#8837でご覧いただくと分かるとおり、まだ更新されていません。
下記コマンドで、~/.zshrc
にasdf.sh
を追加します:
echo -e "\\n. $(brew --prefix asdf)/libexec/asdf.sh" >> \${ZDOTDIR:-~}/.zshrc
OR use a ZSH Framework plugin like asdf for oh-my-zsh which will source this script and setup completions.
コマンド補完は、ZSHフレームワークasdf
によって設定されるか、Homebrewの説明に従って設定必要があります。ZSHフレームワークを使用している場合、新しいZSHコマンド補完を使用するには、fpath
経由で、関連するasdf
プラグインの更新が必要となることがあります。Oh-My-ZSH asdfプラグインは、ohmyzsh/ohmyzsh#8837でご覧いただくと分かるとおり、まだ更新されていません。
~/.zshrc
に下記の行を追記します:
. /opt/asdf-vm/asdf.sh
コマンド補完は、ZSHに適した場所に配置されますが、オートコンプリートを使用するようにZSHを設定する必要があります。
~/.config/powershell/profile.ps1
に下記の行を追記します:
. "$HOME/.asdf/asdf.ps1"
下記コマンドで、~/.config/powershell/profile.ps1
にasdf.sh
を追加します:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
~/.config/powershell/profile.ps1
に下記の行を追記します:
. /opt/asdf-vm/asdf.ps1
下記コマンドで、~/.config/nushell/config.nu
にasdf.nu
を追加します:
"\\n$env.ASDF_NU_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path
コマンド補完は自動的に設定されます。
下記コマンドで、~/.config/nushell/config.nu
にasdf.nu
を追加します:
"\\n$env.ASDF_NU_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\\n source " + (brew --prefix asdf | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path
コマンド補完は自動的に設定されます。
下記コマンドで、~/.config/nushell/config.nu
にasdf.nu
を追加します:
"\\n$env.ASDF_NU_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path
コマンド補完は自動的に設定されます。
~/.profile
に下記の行を追記します:
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
下記コマンドで、~/.profile
にasdf.sh
を追加します:
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
~/.profile
に下記の行を追記します:
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh
asdf
のスクリプトは、$PATH
を設定したあと、かつ、使用中のフレームワーク(oh-my-zsh など)を呼び出したあとに記述する必要があります。
警告
macOSでは、BasgまたはZSHシェルを起動すると、自動的にpath_helper
というユーティリティが呼び出されます。path_helper
はPATH
(およびMANPATH
)内の項目の順番を並び替えることができるため、特定の順序を必要とするツールの動作に、一貫性が無くなってしまいます。これを回避するため、macOSでasdf
を利用するときは、強制的にPATH
エントリの先頭に追加する(優先度を一番高くする)ようにしてください。これは、ASDF_FORCE_PREPEND
環境変数で制御できます。
PATH
の変更を反映するために、シェルを再起動してください。たいていの場合、ターミナルのタブを新たに開けばOKです。
これで、asdf
のコアのインストールは完了です🎉
しかし、asdf
が役に立つようになるのは、プラグインをインストールしてからツールをインストールし、バージョンを管理するようになってからです。引き続き、ガイドを進めていきましょう。
ここではデモとして、asdf-nodejs
プラグインを使用してNode.jsをインストール・設定してみましょう。
各プラグインには依存関係があるため、プラグインのリポジトリを確認しておきましょう。asdf-nodejs
の場合、必要なものは次のとおりです:
OS | 依存関係インストールコマンド |
---|---|
Debian | apt-get install dirmngr gpg curl gawk |
CentOS/ Rocky Linux/ AlmaLinux | yum install gnupg2 curl gawk |
macOS | brew install gpg gawk |
一部のプラグインではインストール後の事後処理でこれらの依存関係が必要となるため、あらかじめインストールしておきましょう。
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
Node.js用のプラグインをインストールしたので、このツールの特定のバージョンをインストールしましょう。
インストール可能なバージョンはasdf list all nodejs
コマンドで確認できますし、特定のメジャーバージョンのサブセットはasdf list all nodejs 14
コマンドで確認できます。
最新版をインストールするには、次のコマンドを実行します:
asdf install nodejs latest
備考
asdf
では正確なバージョン番号を指定してください。latest
は、現時点での最新バージョンを指定できるasdf
のヘルパーです。
asdf
は、カレントディレクトリから上位の$HOME
ディレクトリまでに存在するすべての.tool-versions
ファイルをもとに、ツールのバージョンを照会します。照会は、asdf
で管理するツールを実行した際に、ジャストインタイムで行われます。
警告
ツールで指定されたバージョンが見つからない場合、エラーが発生します。asdf current
コマンドを実行すると、カレントディレクトリにおいてツールのバージョンを解決可能か確認できるため、どのツールが実行に失敗するか検証することができます。
グローバルのデフォルト設定は、$HOME/.tool-versions
で管理されます。グローバルのバージョンをセットするには、次のコマンドを実行します:
asdf global nodejs latest
すると、$HOME/.tool-versions
内には次のように書き込まれます:
nodejs 16.5.0
一部のOSでは、python
のように、asdf
ではなくシステムが管理するツールが既にインストールされていることがあります。それを使用する場合、asdf
に対して、バージョン管理をシステムに委任するように指示する必要があります。詳しくは、バージョンのリファレンスをご覧ください。
ローカルのバージョン設定は、$PWD/.tool-versions
ファイル(カレントディレクトリ内)で定義されます。たいていの場合は、プロジェクトのGitリポジトリ内となるでしょう。対象となるディレクトリで、下記コマンドを実行します:
asdf local nodejs latest
すると、$PWD/.tool-versions
内には次のように書き込まれます:
nodejs 16.5.0
asdf
は、他のバージョンマネージャ向けに作られた既存のバージョンファイル(例: rbenv
の場合は.ruby-version
ファイル)からの移行をサポートしています。これはプラグイン単位でのサポートです。
asdf-nodejs
であれば、.nvmrc
ファイルと.node-version
ファイルの両方に対応しています。このサポートを有効にするには、asdf
の構成設定ファイルである$HOME/.asdfrc
内に、下記の行を追記してください:
legacy_version_file = yes
構成設定でのその他のオプションについて詳しくは、構成設定のリファレンスをご覧ください。
以上で、asdf
の入門は完了です🎉 ここまでで、プロジェクトでのnodejs
のバージョン管理ができるようになりました。プロジェクトで使用するツールごとに、同様の手順を実施してください!
asdf
には使いこなすと便利なコマンドが他にもいっぱいあり、asdf --help
コマンドまたは単にasdf
コマンドを実行すれば、すべてのコマンドの説明を見ることができます。コマンドは大きく分けて3つのカテゴリに分けられます:
asdf
は、ツールのためのバージョンマネージャです。すべてのツールのバージョンは単一のファイル(.tool-versions
)内で定義されるため、プロジェクトのGitリポジトリにチェックインして共有することで、チーム全員に同じーバージョンのツールを使ってもらえるようになります。
従来は、複数のCLIのバージョンマネージャを用意する必要があり、それぞれが異なるAPI、構成ファイル、および実装($PATH
の操作、Shim、環境変数など)となっていました。asdf
は、開発ワークフローを簡素化するための単一インターフェースと構成ファイルを提供しており、シンプルなプラグインインターフェースを使って、すべてのツール・ランタイムに拡張することができます。
シェル上でasdf
コアがセットアップすると、特定のツールを管理するためのプラグインをインストールすることができるようになります。プラグインによってツールがインストールされると、インストールされる実行ファイルごとにShimが作成されます。これらの実行ファイルを実行しようとすると、代わりにShimが実行され、.tool-versions
で定義されているバージョンをasdf
が認識して、当該バージョンが実行されます。
nvm、n、およびrbenvのようなツールはすべて、ツールによってインストールされる実行ファイルのShimを作成するシェルスクリプトです。
asdf
はこれらのツールと非常に似ていて、ツール/ランタイムのバージョン管理という分野では競合しています。asdf
はプラグインシステムを採用し、他のツールと差別化することで、ツール/ランタイムごとのマネージャ、マネージャごとの異なるコマンド、そしてリポジトリ内の様々な*-version
ファイルといったものを排除しています。
シェルに、ディレクトリごとに環境変数をロード/アンロードできる機能を付け加えます。
asdf
は環境変数を管理することはしませんが、direnvの動作をasdf
に統合するasdf-direnv
プラグインが存在します。
詳しくはdirenvのドキュメントをご覧ください。
macOS(またはLinux)のためのパッケージマネージャー
Homebrewは、パッケージとその上位の依存関係を管理します。asdf
は上位の依存関係を管理することはしませんし、パッケージマネージャでもありません。それらの管理はユーザが負担することとなりますが、asdf
はなるべく依存関係のリストを小さく保つように努めています。
詳しくはHomebrewのドキュメントをご覧ください。
Nixは、パッケージ管理とシステム構成に独自のアプローチを取り入れたツールです。
NixOSは、各ツールの依存関係ツリー全体でパッケージのバージョンを正確に管理することで、真に再現可能な環境を構築することを目指しています。asdf
でそのようなことはできません。NixOSは、独自のプログラミング言語、たくさんのCLIツール、そして60,000を超えるパッケージコレクションによって、それらの機能を支えています。
繰り返しになりますが、asdf
は上位の依存関係を管理することはしませんし、パッケージマネージャでもありません。
詳しくはNixOSのドキュメントをご覧ください。
asdf
は、プラグインシステムによって多くのツールをサポートしており、シェル構成にたった1行のシェルスクリプトを記述するだけで使えるというシンプルさ・親しみやすさによって、チームが確実に同じバージョンのツールを使用することを保証できます。
Note
asdf
はシステムのパッケージマネージャになることを目指してはいません。あくまで、ツールのバージョンマネージャです。プラグインを作成することで、どのようなツールでもasdf
で管理できるようになりますが、それがそのツールにとって最善の方法であるとは限りませんのでご注意ください。
asdf
は、ツールのためのバージョンマネージャです。すべてのツールのバージョンは単一のファイル(.tool-versions
)内で定義されるため、プロジェクトのGitリポジトリにチェックインして共有することで、チーム全員に同じーバージョンのツールを使ってもらえるようになります。
従来は、複数のCLIのバージョンマネージャを用意する必要があり、それぞれが異なるAPI、構成ファイル、および実装($PATH
の操作、Shim、環境変数など)となっていました。asdf
は、開発ワークフローを簡素化するための単一インターフェースと構成ファイルを提供しており、シンプルなプラグインインターフェースを使って、すべてのツール・ランタイムに拡張することができます。
シェル上でasdf
コアがセットアップすると、特定のツールを管理するためのプラグインをインストールすることができるようになります。プラグインによってツールがインストールされると、インストールされる実行ファイルごとにShimが作成されます。これらの実行ファイルを実行しようとすると、代わりにShimが実行され、.tool-versions
で定義されているバージョンをasdf
が認識して、当該バージョンが実行されます。
nvm、n、およびrbenvのようなツールはすべて、ツールによってインストールされる実行ファイルのShimを作成するシェルスクリプトです。
asdf
はこれらのツールと非常に似ていて、ツール/ランタイムのバージョン管理という分野では競合しています。asdf
はプラグインシステムを採用し、他のツールと差別化することで、ツール/ランタイムごとのマネージャ、マネージャごとの異なるコマンド、そしてリポジトリ内の様々な*-version
ファイルといったものを排除しています。
シェルに、ディレクトリごとに環境変数をロード/アンロードできる機能を付け加えます。
asdf
は環境変数を管理することはしませんが、direnvの動作をasdf
に統合するasdf-direnv
プラグインが存在します。
詳しくはdirenvのドキュメントをご覧ください。
macOS(またはLinux)のためのパッケージマネージャー
Homebrewは、パッケージとその上位の依存関係を管理します。asdf
は上位の依存関係を管理することはしませんし、パッケージマネージャでもありません。それらの管理はユーザが負担することとなりますが、asdf
はなるべく依存関係のリストを小さく保つように努めています。
詳しくはHomebrewのドキュメントをご覧ください。
Nixは、パッケージ管理とシステム構成に独自のアプローチを取り入れたツールです。
NixOSは、各ツールの依存関係ツリー全体でパッケージのバージョンを正確に管理することで、真に再現可能な環境を構築することを目指しています。asdf
でそのようなことはできません。NixOSは、独自のプログラミング言語、たくさんのCLIツール、そして60,000を超えるパッケージコレクションによって、それらの機能を支えています。
繰り返しになりますが、asdf
は上位の依存関係を管理することはしませんし、パッケージマネージャでもありません。
詳しくはNixOSのドキュメントをご覧ください。
asdf
は、プラグインシステムによって多くのツールをサポートしており、シェル構成にたった1行のシェルスクリプトを記述するだけで使えるというシンプルさ・親しみやすさによって、チームが確実に同じバージョンのツールを使用することを保証できます。
Note
asdf
はシステムのパッケージマネージャになることを目指してはいません。あくまで、ツールのバージョンマネージャです。プラグインを作成することで、どのようなツールでもasdf
で管理できるようになりますが、それがそのツールにとって最善の方法であるとは限りませんのでご注意ください。
asdf
で利用可能なすべてのコマンドの一覧です。この一覧は、asdf help
コマンドで表示されるテキストです。
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>] Add a plugin from the plugin repo OR,
+ add a Git repo as a plugin by
+ specifying the name and repo url
+asdf plugin list [--urls] [--refs] List installed plugins. Optionally show
+ git urls and git-ref
+asdf plugin list all List plugins registered on asdf-plugins
+ repository with URLs
+asdf plugin remove <name> Remove plugin and package versions
+asdf plugin update <name> [<git-ref>] Update a plugin to latest commit on
+ default branch or a particular git-ref
+asdf plugin update --all Update all plugins to latest commit on
+ default branch
+
+
+MANAGE PACKAGES
+asdf current Display current version set or being
+ used for all packages
+asdf current <name> Display current version set or being
+ used for package
+asdf global <name> <version> Set the package global version
+asdf global <name> latest[:<version>] Set the package global version to the
+ latest provided version
+asdf help <name> [<version>] Output documentation for plugin and tool
+asdf install Install all the package versions listed
+ in the .tool-versions file
+asdf install <name> Install one tool at the version
+ specified in the .tool-versions file
+asdf install <name> <version> Install a specific version of a package
+asdf install <name> latest[:<version>] Install the latest stable version of a
+ package, or with optional version,
+ install the latest stable version that
+ begins with the given string
+asdf latest <name> [<version>] Show latest stable version of a package
+asdf latest --all Show latest stable version of all the
+ packages and if they are installed
+asdf list <name> [version] List installed versions of a package and
+ optionally filter the versions
+asdf list all <name> [<version>] List all versions of a package and
+ optionally filter the returned versions
+asdf local <name> <version> Set the package local version
+asdf local <name> latest[:<version>] Set the package local version to the
+ latest provided version
+asdf shell <name> <version> Set the package version to
+ \`ASDF_\${LANG}_VERSION\` in the current shell
+asdf uninstall <name> <version> Remove a specific version of a package
+asdf where <name> [<version>] Display install path for an installed
+ or current version
+asdf which <command> Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...] Executes the command shim for current version
+asdf env <command> [util] Runs util (default: \`env\`) inside the
+ environment used for command shim execution.
+asdf info Print OS, Shell and ASDF debug information.
+asdf version Print the currently installed version of ASDF
+asdf reshim <name> <version> Recreate shims for version of a package
+asdf shim-versions <command> List the plugins and versions that
+ provide a command
+asdf update Update asdf to the latest stable release
+asdf update --head Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs: https://asdf-vm.com
asdf
で利用可能なすべてのコマンドの一覧です。この一覧は、asdf help
コマンドで表示されるテキストです。
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>] Add a plugin from the plugin repo OR,
+ add a Git repo as a plugin by
+ specifying the name and repo url
+asdf plugin list [--urls] [--refs] List installed plugins. Optionally show
+ git urls and git-ref
+asdf plugin list all List plugins registered on asdf-plugins
+ repository with URLs
+asdf plugin remove <name> Remove plugin and package versions
+asdf plugin update <name> [<git-ref>] Update a plugin to latest commit on
+ default branch or a particular git-ref
+asdf plugin update --all Update all plugins to latest commit on
+ default branch
+
+
+MANAGE PACKAGES
+asdf current Display current version set or being
+ used for all packages
+asdf current <name> Display current version set or being
+ used for package
+asdf global <name> <version> Set the package global version
+asdf global <name> latest[:<version>] Set the package global version to the
+ latest provided version
+asdf help <name> [<version>] Output documentation for plugin and tool
+asdf install Install all the package versions listed
+ in the .tool-versions file
+asdf install <name> Install one tool at the version
+ specified in the .tool-versions file
+asdf install <name> <version> Install a specific version of a package
+asdf install <name> latest[:<version>] Install the latest stable version of a
+ package, or with optional version,
+ install the latest stable version that
+ begins with the given string
+asdf latest <name> [<version>] Show latest stable version of a package
+asdf latest --all Show latest stable version of all the
+ packages and if they are installed
+asdf list <name> [version] List installed versions of a package and
+ optionally filter the versions
+asdf list all <name> [<version>] List all versions of a package and
+ optionally filter the returned versions
+asdf local <name> <version> Set the package local version
+asdf local <name> latest[:<version>] Set the package local version to the
+ latest provided version
+asdf shell <name> <version> Set the package version to
+ \`ASDF_\${LANG}_VERSION\` in the current shell
+asdf uninstall <name> <version> Remove a specific version of a package
+asdf where <name> [<version>] Display install path for an installed
+ or current version
+asdf which <command> Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...] Executes the command shim for current version
+asdf env <command> [util] Runs util (default: \`env\`) inside the
+ environment used for command shim execution.
+asdf info Print OS, Shell and ASDF debug information.
+asdf version Print the currently installed version of ASDF
+asdf reshim <name> <version> Recreate shims for version of a package
+asdf shim-versions <command> List the plugins and versions that
+ provide a command
+asdf update Update asdf to the latest stable release
+asdf update --head Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs: https://asdf-vm.com
asdf
の構成設定には、他人と共有可能な.tool-versions
ファイルと、.asdfrc
や環境変数によってカスタマイズ可能なユーザ固有の設定とがあります。
.tool-versions
.tool-versions
ファイルがディレクトリに存在する場合、当該ディレクトリおよびサブディレクトリで、ファイル内で宣言しているツールのバージョンが使用されます。
備考
グローバルのデフォルト値は、$HOME/.tool-versions
ファイルで設定できます。
.tool-versions
ファイル内は下記のような記述となっています:
ruby 2.5.3
+nodejs 10.15.0
コメントを含めることもできます:
ruby 2.5.3 # This is a comment
+# This is another comment
+nodejs 10.15.0
バージョンの表記は下記の形式があります:
10.15.0
- 実バージョンの表記です。バイナリのダウンロードに対応しているプラグインの場合、バイナリがダウンロードされます。ref:v1.0.2-a
or ref:39cb398vb39
- 指定されたタグ/コミット/ブランチをgithubからダウンロードし、コンパイルされます。path:~/src/elixir
- 使用するツールをカスタムコンパイルしたバージョンへのパスです。言語開発者などが使用します。system
- このキーワードを指定した場合、asdfが管理していない、システム上のツールバージョンへパススルーします。ヒント
スペースで区切れば、複数のバージョンを指定できます。例えば、Python 3.7.2
を使用し、Python 2.7.15
にフォールバックし、最終的にsystem
のPythonにフォールバックさせるには、.tool-versions
に下記の行を追記します。
python 3.7.2 2.7.15 system
.tool-versions
ファイルで定義されているすべてのツールをインストールするには、.tool-versions
ファイルを含むディレクトリで、asdf install
コマンドを引数を指定せずに実行します。
.tool-versions
ファイルで定義されている単一のツールをインストールするには、.tool-versions
ファイルを含むディレクトリで、asdf install <name>
コマンドを実行します。ツールは、.tool-versions
ファイルで指定されたバージョンでインストールされます。
ファイルは、直接編集するか、asdf local
コマンド(またはasdf global
コマンド)を使用して更新してください。
.asdfrc
.asdfrc
では、ユーザのマシン固有の構成を設定します。
asdfはデフォルトで\${HOME}/.asdfrc
に構成ファイルを配置します。ファイルの場所は、ASDF_CONFIG_FILE
環境変数で設定できます。
下記は、構成に必要な項目とそのデフォルト値を示しています:
legacy_version_file = no
+use_release_candidates = no
+always_keep_download = no
+plugin_repository_last_check_duration = 60
+disable_plugin_short_name_repository = no
+concurrency = auto
legacy_version_file
対応しているプラグインの場合、他のバージョンマネージャで使用されているバージョンファイルを読み込むことができます。例えば、Rubyのrbenv
であれば.ruby-version
ファイルを読み込みます。
同期は、以下のコマンドが実行されたときに発生します:
asdf plugin add <name>
asdf plugin list all
asdf plugin add <name> <git-url>
コマンドでは、プラグインの同期はトリガーされません。
備考
値をnever
にしても、プラグインリポジトリの初期同期は停止されません。この動作については、disable_plugin_short_name_repository
の節をご覧ください。
disable_plugin_short_name_repository
asdfプラグインのショートネームリポジトリの同期を無効化します。ショートネームリポジトリが無効となっている場合、同期イベントはすぐに終了します。
',6)),e("table",m,[t[31]||(t[31]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"オプション"),e("th",{style:{"text-align":"left"}},"説明")])],-1)),e("tbody",null,[e("tr",null,[e("td",v,[t[27]||(t[27]=e("code",null,"no",-1)),t[28]||(t[28]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"})]),t[29]||(t[29]=e("td",{style:{"text-align":"left"}},"同期イベントが発生した際に、asdfプラグインリポジトリをクローンまたは更新します",-1))]),t[30]||(t[30]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"プラグインショートネームリポジトリを無効化します")],-1))])]),t[40]||(t[40]=a('同期は、以下のコマンドが実行されたときに発生します:
asdf plugin add <name>
asdf plugin list all
asdf plugin add <name> <git-url>
コマンドでは、プラグインの同期はトリガーされません。
備考
プラグインショートネームリポジトリを無効化しても、すでに同期されたリポジトリは削除されません。プラグインリポジトリを削除するには、rm --recursive --trash $ASDF_DATA_DIR/repository
コマンドを実行してください。
また、プラグインショートネームリポジトリを無効化しても、以前にこのソースからインストールされたプラグインは削除されません。プラグインを削除するには、asdf plugin remove <name>
コマンドを実行してください。プラグインを削除すると、そのプラグインでインストールされたすべてのツールバージョンが削除されます。
concurrency
コンパイル時に使用するデフォルトのコア数です。
Options | Description |
---|---|
整数値 | ソースコードのコンパイル時に使用するコア数です |
auto | nproc 、sysctl hw.ncpu 、/proc/cpuinfo 、または1 、の優先順でコア数を計算します |
備考: ASDF_CONCURRENCY
環境変数が設定されている場合はそちらが優先されます。
環境変数の設定値は、お使いのシステムやシェルによって異なります。デフォルトロケーションは、インストールした場所や方法(Gitクローン、Homebrew、AUR)によって異なります。
環境変数は通常、asdf.sh
/asdf.fish
などをsourceする前に設定する必要があります。Elvishの場合は、use asdf
の上側に設定します。
以下では、Bashシェルでの使用方法について説明します。
ASDF_CONFIG_FILE
.asdfrc
構成ファイルへのパスです。任意の場所に設定できます。必ず絶対パスで設定してください。
$HOME/.asdfrc
の値が使用されます。export ASDF_CONFIG_FILE=/home/john_doe/.config/asdf/.asdfrc
ASDF_DEFAULT_TOOL_VERSIONS_FILENAME
ツール名とバージョンの情報を格納するファイルのファイル名です。有効なファイル名であれば何でも設定できます。通常、.tool-versions
ファイルを無視したい場合を除き、この値を変更するべきではありません。
.tool-versions
の値が使用されます。export ASDF_DEFAULT_TOOL_VERSIONS_FILENAME=tool_versions
ASDF_DIR
asdf
のコアスクリプト場所です。任意の場所に設定できます。必ず絶対パスで設定してください。
bin/asdf
実行ファイルの親ディレクトリが使用されます。export ASDF_DIR=/home/john_doe/.config/asdf
ASDF_DATA_DIR
asdf
がプラグイン、Shim、ツールのバージョンをインストールする場所です。任意の場所に設定できます。必ず絶対パスで設定してください。
$HOME/.asdf
ディレクトリが存在すればその場所、存在しない場合はASDF_DIR
の値を使用します。export ASDF_DATA_DIR=/home/john_doe/.asdf
ASDF_CONCURRENCY
ソースコードのコンパイル時に使用するコア数です。この環境変数の値は、asdf構成ファイルのconcurrency
の値よりも優先されます。
concurrency
の値が使用されます。export ASDF_CONCURRENCY=32
ASDF_FORCE_PREPEND
asdf
のShimやパスのディレクトリをPATH
の先頭(最高優先度)に追加するかどうかを設定します。
yes
、その他のシステムでのデフォルト値はno
です。yes
の場合: asdf
ディレクトリを強制的にPATH
の先頭に配置します。yes
以外の文字列を設定した場合: asdf
ディレクトリを強制的にPATH
の先頭に配置することは しません 。ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"
下記のように、asdfをシンプルにセットアップしたとします:
$HOME/.asdf
.asdfrc
ファイルは何もカスタマイズしていないすると、結果として以下のような構成となります:
構成 | 値 | 値がセットされる過程 |
---|---|---|
config file location | $HOME/.asdfrc | ASDF_CONFIG_FILE は空なので、$HOME/.asdfrc が使用されます。 |
default tool versions filename | .tool-versions | ASDF_DEFAULT_TOOL_VERSIONS_FILENAME は空なので、.tool-versions が使用されます。 |
asdf dir | $HOME/.asdf | ASDF_DIR は空なので、bin/asdf の親ディレクトリが使用されます。 |
asdf data dir | $HOME/.asdf | ASDF_DATA_DIR は空であり、$HOME が存在するので、$HOME/.asdf が使用されます。 |
concurrency | auto | ASDF_CONCURRENCY は空なので、デフォルト構成のconcurrency の値に依存します。 |
legacy_version_file | no | .asdfrc をカスタマイズしていないので、デフォルト構成を使用します。 |
use_release_candidates | no | .asdfrc をカスタマイズしていないので、デフォルト構成を使用します。 |
always_keep_download | no | .asdfrc をカスタマイズしていないので、デフォルト構成を使用します。 |
plugin_repository_last_check_duration | 60 | .asdfrc をカスタマイズしていないので、デフォルト構成を使用します。 |
disable_plugin_short_name_repository | no | .asdfrc をカスタマイズしていないので、デフォルト構成を使用します。 |
この節では、パッケージマネージャやインテグレータ向けのasdf
の内部構成について記述しているため、ユーザが気にする必要はありません。
$ASDF_DIR/asdf_updates_disabled
: このファイルが存在する場合、asdf update
コマンドによる更新は無効になります(ファイル内容は関係ありません)。これは、PacmanやHomebrewのようなパッケージマネージャによって使用され、特定のインストールに対して正しい更新方法を適用するようにします。asdf
の構成設定には、他人と共有可能な.tool-versions
ファイルと、.asdfrc
や環境変数によってカスタマイズ可能なユーザ固有の設定とがあります。
.tool-versions
.tool-versions
ファイルがディレクトリに存在する場合、当該ディレクトリおよびサブディレクトリで、ファイル内で宣言しているツールのバージョンが使用されます。
備考
グローバルのデフォルト値は、$HOME/.tool-versions
ファイルで設定できます。
.tool-versions
ファイル内は下記のような記述となっています:
ruby 2.5.3
+nodejs 10.15.0
コメントを含めることもできます:
ruby 2.5.3 # This is a comment
+# This is another comment
+nodejs 10.15.0
バージョンの表記は下記の形式があります:
10.15.0
- 実バージョンの表記です。バイナリのダウンロードに対応しているプラグインの場合、バイナリがダウンロードされます。ref:v1.0.2-a
or ref:39cb398vb39
- 指定されたタグ/コミット/ブランチをgithubからダウンロードし、コンパイルされます。path:~/src/elixir
- 使用するツールをカスタムコンパイルしたバージョンへのパスです。言語開発者などが使用します。system
- このキーワードを指定した場合、asdfが管理していない、システム上のツールバージョンへパススルーします。ヒント
スペースで区切れば、複数のバージョンを指定できます。例えば、Python 3.7.2
を使用し、Python 2.7.15
にフォールバックし、最終的にsystem
のPythonにフォールバックさせるには、.tool-versions
に下記の行を追記します。
python 3.7.2 2.7.15 system
.tool-versions
ファイルで定義されているすべてのツールをインストールするには、.tool-versions
ファイルを含むディレクトリで、asdf install
コマンドを引数を指定せずに実行します。
.tool-versions
ファイルで定義されている単一のツールをインストールするには、.tool-versions
ファイルを含むディレクトリで、asdf install <name>
コマンドを実行します。ツールは、.tool-versions
ファイルで指定されたバージョンでインストールされます。
ファイルは、直接編集するか、asdf local
コマンド(またはasdf global
コマンド)を使用して更新してください。
.asdfrc
.asdfrc
では、ユーザのマシン固有の構成を設定します。
asdfはデフォルトで\${HOME}/.asdfrc
に構成ファイルを配置します。ファイルの場所は、ASDF_CONFIG_FILE
環境変数で設定できます。
下記は、構成に必要な項目とそのデフォルト値を示しています:
legacy_version_file = no
+use_release_candidates = no
+always_keep_download = no
+plugin_repository_last_check_duration = 60
+disable_plugin_short_name_repository = no
+concurrency = auto
legacy_version_file
対応しているプラグインの場合、他のバージョンマネージャで使用されているバージョンファイルを読み込むことができます。例えば、Rubyのrbenv
であれば.ruby-version
ファイルを読み込みます。
同期は、以下のコマンドが実行されたときに発生します:
asdf plugin add <name>
asdf plugin list all
asdf plugin add <name> <git-url>
コマンドでは、プラグインの同期はトリガーされません。
備考
値をnever
にしても、プラグインリポジトリの初期同期は停止されません。この動作については、disable_plugin_short_name_repository
の節をご覧ください。
disable_plugin_short_name_repository
asdfプラグインのショートネームリポジトリの同期を無効化します。ショートネームリポジトリが無効となっている場合、同期イベントはすぐに終了します。
',6)),e("table",m,[t[31]||(t[31]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"オプション"),e("th",{style:{"text-align":"left"}},"説明")])],-1)),e("tbody",null,[e("tr",null,[e("td",v,[t[27]||(t[27]=e("code",null,"no",-1)),t[28]||(t[28]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"})]),t[29]||(t[29]=e("td",{style:{"text-align":"left"}},"同期イベントが発生した際に、asdfプラグインリポジトリをクローンまたは更新します",-1))]),t[30]||(t[30]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"プラグインショートネームリポジトリを無効化します")],-1))])]),t[40]||(t[40]=a('同期は、以下のコマンドが実行されたときに発生します:
asdf plugin add <name>
asdf plugin list all
asdf plugin add <name> <git-url>
コマンドでは、プラグインの同期はトリガーされません。
備考
プラグインショートネームリポジトリを無効化しても、すでに同期されたリポジトリは削除されません。プラグインリポジトリを削除するには、rm --recursive --trash $ASDF_DATA_DIR/repository
コマンドを実行してください。
また、プラグインショートネームリポジトリを無効化しても、以前にこのソースからインストールされたプラグインは削除されません。プラグインを削除するには、asdf plugin remove <name>
コマンドを実行してください。プラグインを削除すると、そのプラグインでインストールされたすべてのツールバージョンが削除されます。
concurrency
コンパイル時に使用するデフォルトのコア数です。
Options | Description |
---|---|
整数値 | ソースコードのコンパイル時に使用するコア数です |
auto | nproc 、sysctl hw.ncpu 、/proc/cpuinfo 、または1 、の優先順でコア数を計算します |
備考: ASDF_CONCURRENCY
環境変数が設定されている場合はそちらが優先されます。
環境変数の設定値は、お使いのシステムやシェルによって異なります。デフォルトロケーションは、インストールした場所や方法(Gitクローン、Homebrew、AUR)によって異なります。
環境変数は通常、asdf.sh
/asdf.fish
などをsourceする前に設定する必要があります。Elvishの場合は、use asdf
の上側に設定します。
以下では、Bashシェルでの使用方法について説明します。
ASDF_CONFIG_FILE
.asdfrc
構成ファイルへのパスです。任意の場所に設定できます。必ず絶対パスで設定してください。
$HOME/.asdfrc
の値が使用されます。export ASDF_CONFIG_FILE=/home/john_doe/.config/asdf/.asdfrc
ASDF_DEFAULT_TOOL_VERSIONS_FILENAME
ツール名とバージョンの情報を格納するファイルのファイル名です。有効なファイル名であれば何でも設定できます。通常、.tool-versions
ファイルを無視したい場合を除き、この値を変更するべきではありません。
.tool-versions
の値が使用されます。export ASDF_DEFAULT_TOOL_VERSIONS_FILENAME=tool_versions
ASDF_DIR
asdf
のコアスクリプト場所です。任意の場所に設定できます。必ず絶対パスで設定してください。
bin/asdf
実行ファイルの親ディレクトリが使用されます。export ASDF_DIR=/home/john_doe/.config/asdf
ASDF_DATA_DIR
asdf
がプラグイン、Shim、ツールのバージョンをインストールする場所です。任意の場所に設定できます。必ず絶対パスで設定してください。
$HOME/.asdf
ディレクトリが存在すればその場所、存在しない場合はASDF_DIR
の値を使用します。export ASDF_DATA_DIR=/home/john_doe/.asdf
ASDF_CONCURRENCY
ソースコードのコンパイル時に使用するコア数です。この環境変数の値は、asdf構成ファイルのconcurrency
の値よりも優先されます。
concurrency
の値が使用されます。export ASDF_CONCURRENCY=32
ASDF_FORCE_PREPEND
asdf
のShimやパスのディレクトリをPATH
の先頭(最高優先度)に追加するかどうかを設定します。
yes
、その他のシステムでのデフォルト値はno
です。yes
の場合: asdf
ディレクトリを強制的にPATH
の先頭に配置します。yes
以外の文字列を設定した場合: asdf
ディレクトリを強制的にPATH
の先頭に配置することは しません 。ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"
下記のように、asdfをシンプルにセットアップしたとします:
$HOME/.asdf
.asdfrc
ファイルは何もカスタマイズしていないすると、結果として以下のような構成となります:
構成 | 値 | 値がセットされる過程 |
---|---|---|
config file location | $HOME/.asdfrc | ASDF_CONFIG_FILE は空なので、$HOME/.asdfrc が使用されます。 |
default tool versions filename | .tool-versions | ASDF_DEFAULT_TOOL_VERSIONS_FILENAME は空なので、.tool-versions が使用されます。 |
asdf dir | $HOME/.asdf | ASDF_DIR は空なので、bin/asdf の親ディレクトリが使用されます。 |
asdf data dir | $HOME/.asdf | ASDF_DATA_DIR は空であり、$HOME が存在するので、$HOME/.asdf が使用されます。 |
concurrency | auto | ASDF_CONCURRENCY は空なので、デフォルト構成のconcurrency の値に依存します。 |
legacy_version_file | no | .asdfrc をカスタマイズしていないので、デフォルト構成を使用します。 |
use_release_candidates | no | .asdfrc をカスタマイズしていないので、デフォルト構成を使用します。 |
always_keep_download | no | .asdfrc をカスタマイズしていないので、デフォルト構成を使用します。 |
plugin_repository_last_check_duration | 60 | .asdfrc をカスタマイズしていないので、デフォルト構成を使用します。 |
disable_plugin_short_name_repository | no | .asdfrc をカスタマイズしていないので、デフォルト構成を使用します。 |
この節では、パッケージマネージャやインテグレータ向けのasdf
の内部構成について記述しているため、ユーザが気にする必要はありません。
$ASDF_DIR/asdf_updates_disabled
: このファイルが存在する場合、asdf update
コマンドによる更新は無効になります(ファイル内容は関係ありません)。これは、PacmanやHomebrewのようなパッケージマネージャによって使用され、特定のインストールに対して正しい更新方法を適用するようにします。コアとなるasdf
のコマンドはかなり少量ですが、多くのワークフローを円滑に進めることができます。
はじめようのガイドで説明されています。
asdf exec <command> [args...]
現在のバージョンのShimでコマンドを実行します。
asdf env <command> [util]
asdf info
OS、シェル、およびasdf
のデバッグ情報を表示するヘルパーコマンドです。バグレポート作成時に共有してください。
asdf reshim <name> <version>
特定のパッケージ・バージョンのShimを再作成します。デフォルトでは、Shimはプラグインによってツールのインストール中に作成されます。npm CLIなどのツールは、実行ファイルをグローバルインストールができます(例:npm install -g yarn
コマンドでYarnをインストール)が、これらの実行ファイルはプラグインのライフサイクルを通してインストールされないため、Shimはまだ存在しません。そのような時に、例えばasdf reshim nodejs <version>
を実行すると、nodejs
の<version>
に対して、yarn
のような新しい実行ファイルのShimを強制的に再作成させることができます。
asdf shim-versions <command>
<command>
のShimを提供するプラグインおよびバージョンを一覧で表示します。
例えば、Node.jsにはnode
とnpm
という2つの実行ファイルが提供されています。asdf-nodejs
プラグインで、複数のバージョンのツールがインストールされている場合、shim-versions
は下記のような一覧を返します:
➜ asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
➜ asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
asdf
には、Git依存のアップデートコマンドが用意されています(推奨されるインストール方法を使用した場合)。別の方法でインストールした場合、その方法の手順に従ってください:
方法 | 最新の安定リリース | master ブランチの最新コミット |
---|---|---|
asdf (Git経由) | asdf update | asdf update --head |
Homebrew | brew upgrade asdf | brew upgrade asdf --fetch-HEAD |
Pacman | 新しいPKGBUILD をダウンロードしてリビルド、または好みのAURヘルパーを使用 |
asdf
をアンインストールするには以下の手順に従ってください:
~/.bashrc
で、asdf.sh
およびコマンド補完をsourceしている行を削除します:. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
$HOME/.asdf
ディレクトリを削除します:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bash_profile
で、asdf.sh
およびコマンド補完をsourceしている行を削除します:. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
$HOME/.asdf
ディレクトリを削除します:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bashrc
で、asdf.sh
およびコマンド補完をsourceしている行を削除します:. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash
コマンド補完については、Homebrewで説明されている方法で設定されている可能性があるため、そちらのガイドに従って削除する行を見つけてください。
brew uninstall asdf --force
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
macOS Catalina以降では、デフォルトのシェルがZSHに変更されました。もし、~/.bash_profile
に設定が見つからない場合は、~/.zshrc
にある可能性があります。その場合は、ZSHの手順をご覧ください。
~/.bash_profile
で、asdf.sh
およびコマンド補完をsourceしている行を削除します:. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash
コマンド補完については、Homebrewで説明されている方法で設定されている可能性があるため、そちらのガイドに従って削除する行を見つけてください。
brew uninstall asdf --force
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bashrc
で、asdf.sh
およびコマンド補完をsourceしている行を削除します:. /opt/asdf-vm/asdf.sh
pacman -Rs asdf-vm
$HOME/.asdf
ディレクトリを削除します:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
で、asdf.fish
をsourceしている行を削除します:source ~/.asdf/asdf.fish
そして、次のコマンドで、コマンド補完を削除します:
rm -rf ~/.config/fish/completions/asdf.fish
$HOME/.asdf
ディレクトリを削除します:rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
で、asdf.fish
をsourceしている行を削除します:source "(brew --prefix asdf)"/libexec/asdf.fish
brew uninstall asdf --force
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
で、asdf.fish
をsourceしている行を削除します:source /opt/asdf-vm/asdf.fish
pacman -Rs asdf-vm
$HOME/.asdf
ディレクトリを削除します:rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
で、asdf
モジュールを使用している行を削除します:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
そして、次のコマンドで、asdf
モジュールを削除します:
rm -f ~/.config/elvish/lib/asdf.elv
$HOME/.asdf
ディレクトリを削除します:if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
で、asdf
モジュールを使用している行を削除します:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
そして、次のコマンドで、asdf
モジュールを削除します:
rm -f ~/.config/elvish/lib/asdf.elv
brew uninstall asdf --force
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
で、asdf
モジュールを使用している行を削除します:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
そして、次のコマンドで、asdf
モジュールを削除します:
rm -f ~/.config/elvish/lib/asdf.elv
pacman -Rs asdf-vm
$HOME/.asdf
ディレクトリを削除します:if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
で、asdf.sh
およびコマンド補完をsourceしている行を削除します:. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit
または、ZSHフレームワークプラグインを使用します。
$HOME/.asdf
ディレクトリを削除します:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
で、asdf.sh
をsourceしている行を削除します:. $(brew --prefix asdf)/libexec/asdf.sh
brew uninstall asdf --force && brew autoremove
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
で、asdf.sh
をsourceしている行を削除します:. /opt/asdf-vm/asdf.sh
pacman -Rs asdf-vm
$HOME/.asdf
ディレクトリを削除します:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
たったこれだけです! 🎉
`,41)]))}const F=i(h,[["render",e]]);export{c as __pageData,F as default}; diff --git a/assets/ja-jp_manage_core.md.B1eqmXXm.lean.js b/assets/ja-jp_manage_core.md.B1eqmXXm.lean.js new file mode 100644 index 00000000..6d0767ac --- /dev/null +++ b/assets/ja-jp_manage_core.md.B1eqmXXm.lean.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as l,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"コア","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/manage/core.md","filePath":"ja-jp/manage/core.md","lastUpdated":1704890757000}'),h={name:"ja-jp/manage/core.md"};function e(n,s,p,k,d,o){return t(),a("div",null,s[0]||(s[0]=[l(`コアとなるasdf
のコマンドはかなり少量ですが、多くのワークフローを円滑に進めることができます。
はじめようのガイドで説明されています。
asdf exec <command> [args...]
現在のバージョンのShimでコマンドを実行します。
asdf env <command> [util]
asdf info
OS、シェル、およびasdf
のデバッグ情報を表示するヘルパーコマンドです。バグレポート作成時に共有してください。
asdf reshim <name> <version>
特定のパッケージ・バージョンのShimを再作成します。デフォルトでは、Shimはプラグインによってツールのインストール中に作成されます。npm CLIなどのツールは、実行ファイルをグローバルインストールができます(例:npm install -g yarn
コマンドでYarnをインストール)が、これらの実行ファイルはプラグインのライフサイクルを通してインストールされないため、Shimはまだ存在しません。そのような時に、例えばasdf reshim nodejs <version>
を実行すると、nodejs
の<version>
に対して、yarn
のような新しい実行ファイルのShimを強制的に再作成させることができます。
asdf shim-versions <command>
<command>
のShimを提供するプラグインおよびバージョンを一覧で表示します。
例えば、Node.jsにはnode
とnpm
という2つの実行ファイルが提供されています。asdf-nodejs
プラグインで、複数のバージョンのツールがインストールされている場合、shim-versions
は下記のような一覧を返します:
➜ asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
➜ asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
asdf
には、Git依存のアップデートコマンドが用意されています(推奨されるインストール方法を使用した場合)。別の方法でインストールした場合、その方法の手順に従ってください:
方法 | 最新の安定リリース | master ブランチの最新コミット |
---|---|---|
asdf (Git経由) | asdf update | asdf update --head |
Homebrew | brew upgrade asdf | brew upgrade asdf --fetch-HEAD |
Pacman | 新しいPKGBUILD をダウンロードしてリビルド、または好みのAURヘルパーを使用 |
asdf
をアンインストールするには以下の手順に従ってください:
~/.bashrc
で、asdf.sh
およびコマンド補完をsourceしている行を削除します:. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
$HOME/.asdf
ディレクトリを削除します:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bash_profile
で、asdf.sh
およびコマンド補完をsourceしている行を削除します:. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
$HOME/.asdf
ディレクトリを削除します:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bashrc
で、asdf.sh
およびコマンド補完をsourceしている行を削除します:. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash
コマンド補完については、Homebrewで説明されている方法で設定されている可能性があるため、そちらのガイドに従って削除する行を見つけてください。
brew uninstall asdf --force
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
macOS Catalina以降では、デフォルトのシェルがZSHに変更されました。もし、~/.bash_profile
に設定が見つからない場合は、~/.zshrc
にある可能性があります。その場合は、ZSHの手順をご覧ください。
~/.bash_profile
で、asdf.sh
およびコマンド補完をsourceしている行を削除します:. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash
コマンド補完については、Homebrewで説明されている方法で設定されている可能性があるため、そちらのガイドに従って削除する行を見つけてください。
brew uninstall asdf --force
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bashrc
で、asdf.sh
およびコマンド補完をsourceしている行を削除します:. /opt/asdf-vm/asdf.sh
pacman -Rs asdf-vm
$HOME/.asdf
ディレクトリを削除します:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
で、asdf.fish
をsourceしている行を削除します:source ~/.asdf/asdf.fish
そして、次のコマンドで、コマンド補完を削除します:
rm -rf ~/.config/fish/completions/asdf.fish
$HOME/.asdf
ディレクトリを削除します:rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
で、asdf.fish
をsourceしている行を削除します:source "(brew --prefix asdf)"/libexec/asdf.fish
brew uninstall asdf --force
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
で、asdf.fish
をsourceしている行を削除します:source /opt/asdf-vm/asdf.fish
pacman -Rs asdf-vm
$HOME/.asdf
ディレクトリを削除します:rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
で、asdf
モジュールを使用している行を削除します:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
そして、次のコマンドで、asdf
モジュールを削除します:
rm -f ~/.config/elvish/lib/asdf.elv
$HOME/.asdf
ディレクトリを削除します:if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
で、asdf
モジュールを使用している行を削除します:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
そして、次のコマンドで、asdf
モジュールを削除します:
rm -f ~/.config/elvish/lib/asdf.elv
brew uninstall asdf --force
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
で、asdf
モジュールを使用している行を削除します:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
そして、次のコマンドで、asdf
モジュールを削除します:
rm -f ~/.config/elvish/lib/asdf.elv
pacman -Rs asdf-vm
$HOME/.asdf
ディレクトリを削除します:if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
で、asdf.sh
およびコマンド補完をsourceしている行を削除します:. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit
または、ZSHフレームワークプラグインを使用します。
$HOME/.asdf
ディレクトリを削除します:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
で、asdf.sh
をsourceしている行を削除します:. $(brew --prefix asdf)/libexec/asdf.sh
brew uninstall asdf --force && brew autoremove
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
で、asdf.sh
をsourceしている行を削除します:. /opt/asdf-vm/asdf.sh
pacman -Rs asdf-vm
$HOME/.asdf
ディレクトリを削除します:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
のすべての構成ファイルを削除するために次のコマンドを実行します:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
たったこれだけです! 🎉
`,41)]))}const F=i(h,[["render",e]]);export{c as __pageData,F as default}; diff --git a/assets/ja-jp_manage_plugins.md.Cbru-sBo.js b/assets/ja-jp_manage_plugins.md.Cbru-sBo.js new file mode 100644 index 00000000..f762586d --- /dev/null +++ b/assets/ja-jp_manage_plugins.md.Cbru-sBo.js @@ -0,0 +1,11 @@ +import{_ as a,c as i,a2 as l,o as e}from"./chunks/framework.C9NVOr0y.js";const g=JSON.parse('{"title":"プラグイン","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/manage/plugins.md","filePath":"ja-jp/manage/plugins.md","lastUpdated":1704890757000}'),t={name:"ja-jp/manage/plugins.md"};function n(h,s,p,d,k,r){return e(),i("div",null,s[0]||(s[0]=[l(`プラグインは、asdf
がNode.jsやRuby、Elixirなどの様々なツールを取り扱えるようにするためのものです。
様々なツールをサポートするために使用されるプラグインAPIについては、プラグインの作成をご覧ください。
下記コマンドでは、GitのURLからプラグインを追加します:
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm
または下記のコマンドで、プラグインリポジトリのショートネームを指定して追加します:
asdf plugin add <name>
+# asdf plugin add erlang
推奨
リポジトリのショートネームに依存しないために、git-url
を使用することを推奨します。
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
asdf plugin list --urls
+# asdf plugin list
+# java https://github.com/halcyon/asdf-java.git
+# nodejs https://github.com/asdf-vm/asdf-nodejs.git
asdf plugin list all
全プラグインのショートネーム一覧については、プラグインショートネームの一覧もご覧ください。
asdf plugin update --all
特定のプラグインパッケージを更新したい場合は、下記のように指定してください。
asdf plugin update <name>
+# asdf plugin update erlang
この更新コマンドは、プラグインリポジトリの origin の デフォルトブランチ における 最新コミット を取得します。バージョニングされたプラグインの更新機能については、現在開発中です(#916)。
asdf plugin remove <name>
+# asdf plugin remove erlang
プラグインを削除すると、当該プラグインでインストールされたすべてのツールが削除されます。これは、各ツールの未使用バージョンを手っ取り早くクリーンアップ/プルーニングするのに有用です。
ショートネームリポジトリはローカルマシンに同期され、定期的に更新されます。同期のタイミングの条件は、次のとおりです:
asdf plugin add <name>
asdf plugin list all
disable_plugin_short_name_repository
オプションがyes
の場合、同期は中止されます。詳しくはasdfの構成設定のリファレンスをご覧ください。X
分の間に同期が行われていない場合、同期が開始されます。 X
のデフォルト値は60
ですが、.asdfrc
ファイルのplugin_repository_last_check_duration
オプションで変更することができます。詳しくはasdfの構成設定のリファレンスをご覧ください。プラグインは、asdf
がNode.jsやRuby、Elixirなどの様々なツールを取り扱えるようにするためのものです。
様々なツールをサポートするために使用されるプラグインAPIについては、プラグインの作成をご覧ください。
下記コマンドでは、GitのURLからプラグインを追加します:
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm
または下記のコマンドで、プラグインリポジトリのショートネームを指定して追加します:
asdf plugin add <name>
+# asdf plugin add erlang
推奨
リポジトリのショートネームに依存しないために、git-url
を使用することを推奨します。
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
asdf plugin list --urls
+# asdf plugin list
+# java https://github.com/halcyon/asdf-java.git
+# nodejs https://github.com/asdf-vm/asdf-nodejs.git
asdf plugin list all
全プラグインのショートネーム一覧については、プラグインショートネームの一覧もご覧ください。
asdf plugin update --all
特定のプラグインパッケージを更新したい場合は、下記のように指定してください。
asdf plugin update <name>
+# asdf plugin update erlang
この更新コマンドは、プラグインリポジトリの origin の デフォルトブランチ における 最新コミット を取得します。バージョニングされたプラグインの更新機能については、現在開発中です(#916)。
asdf plugin remove <name>
+# asdf plugin remove erlang
プラグインを削除すると、当該プラグインでインストールされたすべてのツールが削除されます。これは、各ツールの未使用バージョンを手っ取り早くクリーンアップ/プルーニングするのに有用です。
ショートネームリポジトリはローカルマシンに同期され、定期的に更新されます。同期のタイミングの条件は、次のとおりです:
asdf plugin add <name>
asdf plugin list all
disable_plugin_short_name_repository
オプションがyes
の場合、同期は中止されます。詳しくはasdfの構成設定のリファレンスをご覧ください。X
分の間に同期が行われていない場合、同期が開始されます。 X
のデフォルト値は60
ですが、.asdfrc
ファイルのplugin_repository_last_check_duration
オプションで変更することができます。詳しくはasdfの構成設定のリファレンスをご覧ください。asdf install <name> <version>
+# asdf install erlang 17.3
プラグインが、ソースコードからのダウンロード・コンパイルをサポートしている場合、ref:foo
の形式(foo
は特定のブランチ、タグ、またはコミット)でバージョンを指定できます。アンインストールするときも、同じ名前とバージョンを指定する必要があります。
asdf install <name> latest
+# asdf install erlang latest
下記のように、特定のプレフィックスでの最新安定バージョンをインストールすることもできます。
asdf install <name> latest:<version>
+# asdf install erlang latest:17
asdf list <name>
+# asdf list erlang
下記のように、特定のプレフィックスでのバージョンでフィルタすることもできます。
asdf list <name> <version>
+# asdf list erlang 17
asdf list all <name>
+# asdf list all erlang
下記のように、特定のプレフィックスでのバージョンでフィルタすることもできます。
asdf list all <name> <version>
+# asdf list all erlang 17
asdf latest <name>
+# asdf latest erlang
下記のように、特定のプレフィックスでの最新安定バージョンで表示することもできます。
asdf latest <name> <version>
+# asdf latest erlang 17
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest
global
の場合、バージョンは$HOME/.tool-versions
ファイルに書き込まれます。
shell
の場合、バージョンはASDF_\${TOOL}_VERSION
という環境変数に設定され、現在のシェルセッションでのみ有効となります。
local
の場合、バージョンは$PWD/.tool-versions
ファイルに書き込まれます。存在しない場合は作成されます。
.tool-versions
ファイルについて詳しくは、構成設定のリファレンスをご覧ください。
代替手段
現在のシェルセッションでのみバージョンを設定したい場合、 または、特定のツールバージョンでコマンドを実行するだけのためにバージョンを設定したい場合は、 ASDF_\${TOOL}_VERSION
という環境変数で設定することができます。
下記の例では、バージョン1.4.0
のElixirプロジェクトに対して、テストを実行させています。 バージョンの表記形式は、.tool-versions
ファイルでサポートされているものと同じです。
ASDF_ELIXIR_VERSION=1.4.0 mix test
asdfで管理されているバージョンではなく、<name>
で指定されたツールのシステムバージョンを使用するには、バージョンとしてsystem
を指定します。
カレントバージョンのセットと同様の方法で、global
、local
、またはshell
のいずれかにsystem
をセットしてください。
asdf local <name> system
+# asdf local python system
asdf current
+# asdf current
+# erlang 17.3 /Users/kim/.tool-versions
+# nodejs 6.11.5 /Users/kim/cool-node-project/.tool-versions
+
+asdf current <name>
+# asdf current erlang
+# erlang 17.3 /Users/kim/.tool-versions
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3
asdfがパッケージをインストールすると、そのパッケージに含まれるすべての実行プログラムのShimが$ASDF_DATA_DIR/shims
ディレクトリ(デフォルトは~/.asdf/shims
)に作成されます。このディレクトリが(asdf.sh
やasdf.fish
などによって)$PATH
に設定されることで、インストールされているプログラムが当該環境で利用できるようになります。
Shim自体は非常に単純なラッパーであり、asdf exec
というヘルパープログラムに、プラグイン名と、Shimがラップしているインストール済みパッケージの実行ファイルのパスを渡して、exec
します。
asdf exec
ヘルパーは、使用するパッケージのバージョン(.tool-versions
ファイルで指定されたもの、またはasdf local ...
かasdf global ...
で指定されたもの)、パッケージのインストールディレクトリにある実行ファイルの完全パス(プラグインのexec-path
コールバックで操作可能)、および実行環境(プラグインのexec-env
スクリプトで提供)を決定し、実行します。
備考
本システムはexec
呼び出しを使用するため、シェルによってsourceされるパッケージ内のスクリプトは、Shimラッパーを経由させずに直接アクセスする必要があります。asdf
で用意されているwhich
およびwhere
コマンドは、下記のように、インストールされたパッケージへのパスを返すため、この状況を解決するのに役立ちます:
# returns path to main executable in current version
+source $(asdf which \${PLUGIN})/../script.sh
+
+# returns path to the package installation directory
+source $(asdf where \${PLUGIN})/bin/script.sh
何らかの理由でasdfのShimをバイパスしたい場合や、プロジェクトのディレクトリに移動した際に自動的に環境変数を設定したい場合は、asdf-direnvプラグインが役に立ちます。詳細はREADMEをご確認ください。
`,45)]))}const c=i(t,[["render",n]]);export{o as __pageData,c as default}; diff --git a/assets/ja-jp_manage_versions.md.Dxk0G51J.lean.js b/assets/ja-jp_manage_versions.md.Dxk0G51J.lean.js new file mode 100644 index 00000000..3ab74973 --- /dev/null +++ b/assets/ja-jp_manage_versions.md.Dxk0G51J.lean.js @@ -0,0 +1,30 @@ +import{_ as i,c as a,a2 as l,o as h}from"./chunks/framework.C9NVOr0y.js";const o=JSON.parse('{"title":"バージョン","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/manage/versions.md","filePath":"ja-jp/manage/versions.md","lastUpdated":1704890757000}'),t={name:"ja-jp/manage/versions.md"};function n(e,s,p,k,d,r){return h(),a("div",null,s[0]||(s[0]=[l(`asdf install <name> <version>
+# asdf install erlang 17.3
プラグインが、ソースコードからのダウンロード・コンパイルをサポートしている場合、ref:foo
の形式(foo
は特定のブランチ、タグ、またはコミット)でバージョンを指定できます。アンインストールするときも、同じ名前とバージョンを指定する必要があります。
asdf install <name> latest
+# asdf install erlang latest
下記のように、特定のプレフィックスでの最新安定バージョンをインストールすることもできます。
asdf install <name> latest:<version>
+# asdf install erlang latest:17
asdf list <name>
+# asdf list erlang
下記のように、特定のプレフィックスでのバージョンでフィルタすることもできます。
asdf list <name> <version>
+# asdf list erlang 17
asdf list all <name>
+# asdf list all erlang
下記のように、特定のプレフィックスでのバージョンでフィルタすることもできます。
asdf list all <name> <version>
+# asdf list all erlang 17
asdf latest <name>
+# asdf latest erlang
下記のように、特定のプレフィックスでの最新安定バージョンで表示することもできます。
asdf latest <name> <version>
+# asdf latest erlang 17
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest
global
の場合、バージョンは$HOME/.tool-versions
ファイルに書き込まれます。
shell
の場合、バージョンはASDF_\${TOOL}_VERSION
という環境変数に設定され、現在のシェルセッションでのみ有効となります。
local
の場合、バージョンは$PWD/.tool-versions
ファイルに書き込まれます。存在しない場合は作成されます。
.tool-versions
ファイルについて詳しくは、構成設定のリファレンスをご覧ください。
代替手段
現在のシェルセッションでのみバージョンを設定したい場合、 または、特定のツールバージョンでコマンドを実行するだけのためにバージョンを設定したい場合は、 ASDF_\${TOOL}_VERSION
という環境変数で設定することができます。
下記の例では、バージョン1.4.0
のElixirプロジェクトに対して、テストを実行させています。 バージョンの表記形式は、.tool-versions
ファイルでサポートされているものと同じです。
ASDF_ELIXIR_VERSION=1.4.0 mix test
asdfで管理されているバージョンではなく、<name>
で指定されたツールのシステムバージョンを使用するには、バージョンとしてsystem
を指定します。
カレントバージョンのセットと同様の方法で、global
、local
、またはshell
のいずれかにsystem
をセットしてください。
asdf local <name> system
+# asdf local python system
asdf current
+# asdf current
+# erlang 17.3 /Users/kim/.tool-versions
+# nodejs 6.11.5 /Users/kim/cool-node-project/.tool-versions
+
+asdf current <name>
+# asdf current erlang
+# erlang 17.3 /Users/kim/.tool-versions
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3
asdfがパッケージをインストールすると、そのパッケージに含まれるすべての実行プログラムのShimが$ASDF_DATA_DIR/shims
ディレクトリ(デフォルトは~/.asdf/shims
)に作成されます。このディレクトリが(asdf.sh
やasdf.fish
などによって)$PATH
に設定されることで、インストールされているプログラムが当該環境で利用できるようになります。
Shim自体は非常に単純なラッパーであり、asdf exec
というヘルパープログラムに、プラグイン名と、Shimがラップしているインストール済みパッケージの実行ファイルのパスを渡して、exec
します。
asdf exec
ヘルパーは、使用するパッケージのバージョン(.tool-versions
ファイルで指定されたもの、またはasdf local ...
かasdf global ...
で指定されたもの)、パッケージのインストールディレクトリにある実行ファイルの完全パス(プラグインのexec-path
コールバックで操作可能)、および実行環境(プラグインのexec-env
スクリプトで提供)を決定し、実行します。
備考
本システムはexec
呼び出しを使用するため、シェルによってsourceされるパッケージ内のスクリプトは、Shimラッパーを経由させずに直接アクセスする必要があります。asdf
で用意されているwhich
およびwhere
コマンドは、下記のように、インストールされたパッケージへのパスを返すため、この状況を解決するのに役立ちます:
# returns path to main executable in current version
+source $(asdf which \${PLUGIN})/../script.sh
+
+# returns path to the package installation directory
+source $(asdf where \${PLUGIN})/bin/script.sh
何らかの理由でasdfのShimをバイパスしたい場合や、プロジェクトのディレクトリに移動した際に自動的に環境変数を設定したい場合は、asdf-direnvプラグインが役に立ちます。詳細はREADMEをご確認ください。
`,45)]))}const c=i(t,[["render",n]]);export{o as __pageData,c as default}; diff --git a/assets/ja-jp_more_community-projects.md.Drt5Trip.js b/assets/ja-jp_more_community-projects.md.Drt5Trip.js new file mode 100644 index 00000000..127c93ca --- /dev/null +++ b/assets/ja-jp_more_community-projects.md.Drt5Trip.js @@ -0,0 +1 @@ +import{_ as t,c as a,a2 as o,o as r}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"コミュニティプロジェクト","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/more/community-projects.md","filePath":"ja-jp/more/community-projects.md","lastUpdated":1704890757000}'),s={name:"ja-jp/more/community-projects.md"};function c(n,e,i,d,l,p){return r(),a("div",null,e[0]||(e[0]=[o('asdf
に関連するコミュニティプロジェクトをいくつか紹介します:
備考
asdfコアチームは、これらのプロジェクトやコードを所有していません。 asdfコアでは、ここに掲載されているものに関連する品質やセキュリティについては責任を負いません。
asdf
に関連するコミュニティプロジェクトをいくつか紹介します:
備考
asdfコアチームは、これらのプロジェクトやコードを所有していません。 asdfコアでは、ここに掲載されているものに関連する品質やセキュリティについては責任を負いません。
ここでは、asdf
に関するよくある質問を紹介します。
WSL1 (Windows Subsystem for Linux 1)は公式にはサポートしていません。asdf
は正常に動作しない可能性があります。WSL1を公式にサポートする予定はありません。
WSL2 (Windows Subsystem for Linux 2)では、あなたが選択したWSLディストリビューションに基づいて、セットアップと依存関係の解決を済ませれば、動作するはずです。
重要なのは、WSL2が正常に動作するのは、カレントワークディレクトリがWindowsドライブではなくUnixドライブである場合に 限られる ということです。
GitHub Actionsでホストランナーのサポートが可能になれば、WSL2でテストスイートを実行する予定ですが、現時点ではそうではないようです。
npm install -g yarn
を実行したにも関わらず、yarn
が実行できません。どうなっているの?
asdf
はShimを使って実行ファイルを管理しています。プラグインによってインストールされるものは、自動的にShimが作成されますが、asdf
が管理しているツールによって実行ファイルがインストールされた場合は、Shimを作成しなければならないということをasdf
に通知する必要があります。上記の例では、YarnのShimを作成しなければいけません。詳しくは、asdf reshim
コマンドのドキュメントをご覧ください。
asdf reshim
コマンドを実行しても問題が解決しない場合、asdf.sh
やasdf.fish
のsourceが、シェルの構成ファイル(.bash_profile
、.zshrc
、config.fish
など)の一番下にないことが原因である可能性があります。$PATH
を設定した後、そしてフレームワーク(oh-my-zshなど)を使用しているのれあればそれをsourceした後に、sourceする必要があります。
ここでは、asdf
に関するよくある質問を紹介します。
WSL1 (Windows Subsystem for Linux 1)は公式にはサポートしていません。asdf
は正常に動作しない可能性があります。WSL1を公式にサポートする予定はありません。
WSL2 (Windows Subsystem for Linux 2)では、あなたが選択したWSLディストリビューションに基づいて、セットアップと依存関係の解決を済ませれば、動作するはずです。
重要なのは、WSL2が正常に動作するのは、カレントワークディレクトリがWindowsドライブではなくUnixドライブである場合に 限られる ということです。
GitHub Actionsでホストランナーのサポートが可能になれば、WSL2でテストスイートを実行する予定ですが、現時点ではそうではないようです。
npm install -g yarn
を実行したにも関わらず、yarn
が実行できません。どうなっているの?
asdf
はShimを使って実行ファイルを管理しています。プラグインによってインストールされるものは、自動的にShimが作成されますが、asdf
が管理しているツールによって実行ファイルがインストールされた場合は、Shimを作成しなければならないということをasdf
に通知する必要があります。上記の例では、YarnのShimを作成しなければいけません。詳しくは、asdf reshim
コマンドのドキュメントをご覧ください。
asdf reshim
コマンドを実行しても問題が解決しない場合、asdf.sh
やasdf.fish
のsourceが、シェルの構成ファイル(.bash_profile
、.zshrc
、config.fish
など)の一番下にないことが原因である可能性があります。$PATH
を設定した後、そしてフレームワーク(oh-my-zshなど)を使用しているのれあればそれをsourceした後に、sourceする必要があります。
このページを借りて、asdfのオーサーおよびコントリビューターの皆様に感謝を申し上げます!
私 (@HashNuke)、高熱、風邪、咳。
コピーライト 2014年から今まで (MIT License)
GitHubのコントリビューターリスト🙏をご覧ください。
',9)]))}const u=e(o,[["render",l]]);export{f as __pageData,u as default}; diff --git a/assets/ja-jp_more_thanks.md.DgZpeSyP.lean.js b/assets/ja-jp_more_thanks.md.DgZpeSyP.lean.js new file mode 100644 index 00000000..f4e87cb7 --- /dev/null +++ b/assets/ja-jp_more_thanks.md.DgZpeSyP.lean.js @@ -0,0 +1 @@ +import{_ as e,c as r,a2 as t,o as h}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"謝辞","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/more/thanks.md","filePath":"ja-jp/more/thanks.md","lastUpdated":1704890757000}'),o={name:"ja-jp/more/thanks.md"};function l(s,a,n,i,d,p){return h(),r("div",null,a[0]||(a[0]=[t('このページを借りて、asdfのオーサーおよびコントリビューターの皆様に感謝を申し上げます!
私 (@HashNuke)、高熱、風邪、咳。
コピーライト 2014年から今まで (MIT License)
GitHubのコントリビューターリスト🙏をご覧ください。
',9)]))}const u=e(o,[["render",l]]);export{f as __pageData,u as default}; diff --git a/assets/ja-jp_plugins_create.md.CF7Jmvco.js b/assets/ja-jp_plugins_create.md.CF7Jmvco.js new file mode 100644 index 00000000..c0407b0a --- /dev/null +++ b/assets/ja-jp_plugins_create.md.CF7Jmvco.js @@ -0,0 +1,35 @@ +import{_ as n,c as p,a2 as e,j as i,a,G as l,B as d,o}from"./chunks/framework.C9NVOr0y.js";const x=JSON.parse('{"title":"プラグインの作成","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/plugins/create.md","filePath":"ja-jp/plugins/create.md","lastUpdated":1704890757000}'),h={name:"ja-jp/plugins/create.md"},r={tabindex:"0"},k={style:{"text-align":"left"}},g={style:{"text-align":"left"}},c={style:{"text-align":"left"}},u={style:{"text-align":"left"}},b={id:"bin-list-all",tabindex:"-1"},F={id:"bin-download",tabindex:"-1"},E={id:"bin-install",tabindex:"-1"},y={id:"bin-latest-stable",tabindex:"-1"},m={id:"asdf-cliの拡張コマンド",tabindex:"-1"},f={id:"カスタムshimテンプレート",tabindex:"-1"};function v(A,s,_,C,S,D){const t=d("Badge");return o(),p("div",null,[s[48]||(s[48]=e('プラグインとは、 言語/ツールのバージョン管理をサポートするための実行スクリプトを含めたGitリポジトリのことです。 これらのスクリプトは、asdf list-all <name>
やasdf install <name> <version>
などの機能をサポートするコマンドを使って、 asdfによって実行されます。
オリジナルのプラグインを作成するには、次の2つの方法があります:
asdf-<tool_name>
)を 生成 します。 生成できたら、 そのリポジトリをクローンしてsetup.bash
のスクリプトを実行し、 テンプレートを対話的に更新していきます。asdf-<tool_name>
という名前のリポジトリを自分で立ち上げ、 以降に記載されている必要なスクリプトを実装します。asdf
コマンドを呼び出してはいけません。sort -V
などです。 asdfコアの禁止コマンド一覧もご覧ください。以下は、asdfから呼び出せるスクリプトの全リストです。
',9)),i("table",r,[s[25]||(s[25]=i("thead",null,[i("tr",null,[i("th",{style:{"text-align":"left"}},"スクリプト"),i("th",{style:{"text-align":"left"}},"説明")])],-1)),i("tbody",null,[i("tr",null,[i("td",k,[s[0]||(s[0]=i("a",{href:"#bin-list-all"},"bin/list-all",-1)),s[1]||(s[1]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"})]),s[2]||(s[2]=i("td",{style:{"text-align":"left"}},"インストール可能なすべてのバージョンをリストします。",-1))]),i("tr",null,[i("td",g,[s[3]||(s[3]=i("a",{href:"#bin-download"},"bin/download",-1)),s[4]||(s[4]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"})]),s[5]||(s[5]=i("td",{style:{"text-align":"left"}},"ツールの特定バージョンのソースコードまたはバイナリをダウンロードします。",-1))]),i("tr",null,[i("td",c,[s[6]||(s[6]=i("a",{href:"#bin-install"},"bin/install",-1)),s[7]||(s[7]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"})]),s[8]||(s[8]=i("td",{style:{"text-align":"left"}},"ツールの特定バージョンをインストールします。",-1))]),i("tr",null,[i("td",u,[s[9]||(s[9]=i("a",{href:"#bin-latest-stable"},"bin/latest-stable",-1)),s[10]||(s[10]=a()),l(t,{type:"warning",text:"推奨",vertical:"middle"})]),s[11]||(s[11]=i("td",{style:{"text-align":"left"}},"指定されたツールの最新安定バージョンをリストします。",-1))]),s[12]||(s[12]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-help.overview"},"bin/help.overview")]),i("td",{style:{"text-align":"left"}},"プラグインおよびツールに関する概要説明を出力します。")],-1)),s[13]||(s[13]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-help.deps"},"bin/help.deps")]),i("td",{style:{"text-align":"left"}},"オペレーティングシステムに合わせた依存関係のリストを出力します。")],-1)),s[14]||(s[14]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-help.config"},"bin/help.config")]),i("td",{style:{"text-align":"left"}},"プラグインおよびツールの構成設定一覧を出力します。")],-1)),s[15]||(s[15]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-help.links"},"bin/help.links")]),i("td",{style:{"text-align":"left"}},"プラグインとツールに関連するリンクリストを出力します。")],-1)),s[16]||(s[16]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-list-bin-paths"},"bin/list-bin-paths")]),i("td",{style:{"text-align":"left"}},"Shimを作成するバイナリが存在するディレクトリへの相対パスの一覧を出力します。")],-1)),s[17]||(s[17]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-exec-env"},"bin/exec-env")]),i("td",{style:{"text-align":"left"}},"ツールのバイナリのShimを実行する前に環境を準備します。")],-1)),s[18]||(s[18]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-exec-path"},"bin/exec-path")]),i("td",{style:{"text-align":"left"}},"ツールの特定バージョンの実行ファイルパスを出力します。")],-1)),s[19]||(s[19]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-uninstall"},"bin/uninstall")]),i("td",{style:{"text-align":"left"}},"ツールの特定バージョンをアンインストールします。")],-1)),s[20]||(s[20]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-list-legacy-filenames"},"bin/list-legacy-filenames")]),i("td",{style:{"text-align":"left"}},[i("code",null,".ruby-version"),a("のような、レガシー構成ファイルのリストを出力します。")])],-1)),s[21]||(s[21]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-parse-legacy-file"},"bin/parse-legacy-file")]),i("td",{style:{"text-align":"left"}},"レガシーバージョンファイルのカスタムパーサーです。")],-1)),s[22]||(s[22]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-post-plugin-add"},"bin/post-plugin-add")]),i("td",{style:{"text-align":"left"}},"プラグインが追加された後に実行されるフックです。")],-1)),s[23]||(s[23]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-post-plugin-update"},"bin/post-plugin-update")]),i("td",{style:{"text-align":"left"}},"プラグインが更新された後に実行されるフックです。")],-1)),s[24]||(s[24]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-pre-plugin-remove"},"bin/pre-plugin-remove")]),i("td",{style:{"text-align":"left"}},"プラグインが削除される前に実行されるフックです。")],-1))])]),s[49]||(s[49]=e('どのコマンドがどのスクリプトを呼び出すかについては、 各スクリプトの詳細なドキュメントを参照してください。
以下は、すべてのスクリプトで使用される環境変数の全リストです。
環境変数 | 説明 |
---|---|
ASDF_INSTALL_TYPE | version またはref です。 |
ASDF_INSTALL_VERSION | ASDF_INSTALL_TYPE に応じてフルバージョンナンバーまたはGit Refの値が入ります。 |
ASDF_INSTALL_PATH | ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。 |
ASDF_CONCURRENCY | ソースコードのコンパイル時に使用するコア数です。make -j のようなフラグを設定する際に便利です。 |
ASDF_DOWNLOAD_PATH | bin/download によってソースコードまたはバイナリがダウンロードされる場所へのパスです。 |
ASDF_PLUGIN_PATH | プラグインがインストールされている場所へのパスです。 |
ASDF_PLUGIN_SOURCE_URL | プラグインソースのURLです。 |
ASDF_PLUGIN_PREV_REF | プラグインの以前のgit-ref です。 |
ASDF_PLUGIN_POST_REF | 更新後のプラグインのgit-ref です。 |
ASDF_CMD_FILE | ソースとなるファイルのフルパスに解決されます。 |
備考
すべてのスクリプトですべての環境変数が使用できるわけではありません。 以下の各スクリプトのドキュメントで、そのスクリプトで利用可能な環境変数を確認してください。
説明
インストール可能なすべてのバージョンをリストします。
出力フォーマット
スペース区切りのバージョンリストの文字列を出力する必要があります。例えば次のとおりです:
1.0.1 1.0.2 1.3.0 1.4
最新バージョンが末尾にくる必要があります。
asdfコアは各バージョンを1行ずつ表示するため、 いくつかのバージョンは画面外にはみ出る場合があります。
並べ替え
ウェブサイト上のリリースページからバージョンを取得する場合、 提供されている順序は正しいリリース順となっていることが多いため、 そのままの順序を使用することを推奨します。 逆順にしたければ、tsc
をパイプで通すだけで十分です。
どうしても並べ替えが避けられない場合、sort -V
は移植性が無いため、次のいずれかの方法を使用することを推奨します:
v2.18.0
以上が必要です)sed
、sort
、およびawk
が必要です)スクリプトで使用できる環境変数
このスクリプトに環境変数は提供されません。
このスクリプトを呼び出すコマンド
asdf list all <name> [version]
asdf list all nodejs
: このスクリプトで返されるすべてのバージョンを、 1行ずつリストします。asdf list all nodejs 18
: このスクリプトで返されるすべてのバージョンから、 18
で始まるバージョンのみフィルタし、1行ずつリストします。asdfからの呼び出しシグネチャ
引数はありません。
"${plugin_path}/bin/list-all"
説明
ツールの特定バージョンのソースコードまたはバイナリを、指定された場所にダウンロードします。
実装内容
ASDF_DOWNLOAD_PATH
で指定されたディレクトリに、ソースコードまたはバイナリをダウンロードする必要があります。ASDF_DOWNLOAD_PATH
ディレクトリに配置する必要があります。ASDF_DOWNLOAD_PATH
ディレクトリ内に何もファイルを配置しないようにしてください。0
としてください。レガシープラグイン
このスクリプトはすべてのプラグインで 必須 とされていますが、このスクリプトが導入される以前の"レガシー"プラグインでは、 オプション となっていました。
このスクリプトが存在しない場合、asdfはbin/install
スクリプトがあると想定して、バージョンのダウンロード、かつ、インストールが実行されます。
レガシープラグインのサポートは最終的に削除される予定のため、今後作成するすべてのプラグインでこのスクリプトを含めるようにしてください。
スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。ASDF_DOWNLOAD_PATH
: ソースコードまたはバイナリのダウンロード先のパスです。このスクリプトを呼び出すコマンド
asdf install <tool> [version]
asdf install <tool> latest[:version]
asdf install nodejs 18.0.0
: Node.jsのバージョン18.0.0
のソースコードまたはバイナリをダウンロードし、ASDF_DOWNLOAD_PATH
ディレクトリに配置します。 そしてbin/install
スクリプトを実行します。asdfからの呼び出しシグネチャ
引数はありません。
"${plugin_path}"/bin/download
説明
ツールの特定バージョンを指定された場所にインストールします。
実装内容
ASDF_INSTALL_PATH
のパスのディレクトリにインストールする必要があります。$ASDF_INSTALL_PATH/bin
内にあるファイルに対して作成されます。 この動作は、オプションのbin/list-bin-pathsスクリプトでカスタマイズできます。0
としてください。ASDF_INSTALL_PATH
にファイルを配置するようなスクリプトとしてください。レガシープラグイン
bin/download
スクリプトが存在しない場合、このスクリプトでは、指定されたバージョンをダウンロード、かつ、インストールをする必要があります。
0.7._
以前と0.8._
以降のasdfコアの互換性を保つために、ASDF_DOWNLOAD_PATH
環境変数が設定されているかを確認してください。 設定されている場合は、bin/download
スクリプトがすでにバージョンをダウンロードしていると想定し、設定されていない場合は、bin/install
でソースコードをダウンロードするようにしてください。
スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。ASDF_CONCURRENCY
: ソースコードのコンパイル時に使用するコア数です。make -j
のようなフラグを設定する際に便利です。ASDF_DOWNLOAD_PATH
: ソースコードまたはバイナリのダウンロード先のパスです。このスクリプトを呼び出すコマンド
asdf install
asdf install <tool>
asdf install <tool> [version]
asdf install <tool> latest[:version]
asdf install nodejs 18.0.0
: ASDF_INSTALL_PATH
ディレクトリに、 Node.jsのバージョン18.0.0
をインストールします。asdfからの呼び出しシグネチャ
引数はありません。
"${plugin_path}"/bin/install
説明
ツールの最新安定バージョンを判定します。このスクリプトが存在しない場合、asdfコアはbin/list-all
の出力をtail
した結果をもとに判定しますが、ツールによってはこれが望ましくないことがあります。
実装内容
asdf list all ruby
の出力は、jruby
やrbx
、truffleruby
などの多くのプロバイダのRubyバージョンをリストアップします。ユーザが提供したフィルタは、セマンティックバージョンやプロバイダをフィルタするために、プラグインで使用できます。> asdf latest ruby\n3.2.2\n> asdf latest ruby 2\n2.7.8\n> asdf latest ruby truffleruby\ntruffleruby+graalvm-22.3.1
0
としてください。スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。このスクリプトを呼び出すコマンド
asdf global <tool> latest
: ツールのグローバルバージョンとして、当該ツールの最新安定バージョンにセットします。asdf local <name> latest
: ツールのローカルバージョンとして、当該ツールの最新安定バージョンにセットします。asdf install <tool> latest
: ツールの最新安定バージョンをインストールします。asdf latest <tool> [<version>]
: オプションのフィルタに基づいて、ツールの最新バージョンを出力します。asdf latest --all
: asdfによって管理されているすべてのツールの最新バージョンと、それらがインストールされているかどうかを出力します。asdfからの呼び出しシグネチャ
このスクリプトは、フィルタクエリという1つの引数を受け取ります。
"${plugin_path}"/bin/latest-stable "$query"
bin/help.overview
説明
プラグインおよび管理されているツールに関する概要説明を出力します。
実装内容
ASDF_INSTALL_VERSION
およびASDF_INSTALL_TYPE
環境変数の値を使用してください)。0
としてください。スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。このスクリプトを呼び出すコマンド
asdf help <name> [<version>]
: プラグインおよびツールのドキュメントを出力します。asdfからの呼び出しシグネチャ
"${plugin_path}"/bin/help.overview
bin/help.deps
説明
オペレーティングシステムに合わせた依存関係のリストを出力します。依存関係を1行ごとに出力します。
git\ncurl\nsed
実装内容
bin/help.overview
を用意する必要があります。ASDF_INSTALL_VERSION
およびASDF_INSTALL_TYPE
環境変数の値を使用してください)。0
としてください。スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。このスクリプトを呼び出すコマンド
asdf help <name> [<version>]
: プラグインおよびツールのドキュメントを出力します。asdfからの呼び出しシグネチャ
"${plugin_path}"/bin/help.deps
bin/help.config
説明
プラグインおよびツールで設定必須または任意設定可能な構成設定一覧を出力します。例えば、ツールのインストール・コンパイルに必要な環境変数やその他フラグについて説明します。
実装内容
bin/help.overview
を用意する必要があります。ASDF_INSTALL_VERSION
およびASDF_INSTALL_TYPE
環境変数の値を使用してください)。0
としてください。スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。このスクリプトを呼び出すコマンド
asdf help <name> [<version>]
: プラグインおよびツールのドキュメントを出力します。asdfからの呼び出しシグネチャ
"${plugin_path}"/bin/help.config
bin/help.links
説明
プラグインとツールに関連するリンクリストを出力します。リンクを1行ごとに出力します。
Git Repository: https://github.com/vlang/v\nDocumentation: https://vlang.io
実装内容
bin/help.overview
を用意する必要があります。<title>: <link>
<link>
のみASDF_INSTALL_VERSION
およびASDF_INSTALL_TYPE
環境変数の値を使用してください)。0
としてください。スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。このスクリプトを呼び出すコマンド
asdf help <name> [<version>]
: プラグインおよびツールのドキュメントを出力します。asdfからの呼び出しシグネチャ
"${plugin_path}"/bin/help.links
bin/list-bin-paths
説明
ツールの特定バージョンにおける、実行ファイルが含まれるディレクトリの一覧を出力します。
実装内容
"${ASDF_INSTALL_PATH}"/bin
ディレクトリ内にあるバイナリを探し、そのバイナリ向けのShimを作成します。ASDF_INSTALL_PATH
からの相対パスである必要があります。例えば、次のような出力となります:bin tools veggies
以上の場合、下記ディレクトリ内のファイルへのShimを作成するよう、asdfへ指示されます:
"${ASDF_INSTALL_PATH}"/bin
"${ASDF_INSTALL_PATH}"/tools
"${ASDF_INSTALL_PATH}"/veggies
スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。このスクリプトを呼び出すコマンド
asdf install <tool> [version]
: バイナリへのShimを初期作成します。asdf reshim <tool> <version>
: バイナリへのShimを再作成します。asdfからの呼び出しシグネチャ
"${plugin_path}/bin/list-bin-paths"
bin/exec-env
説明
ツールのバイナリのShimを実行する前に環境を準備します。
スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。このスクリプトを呼び出すコマンド
asdf which <command>
: 実行ファイルのパスを表示します。asdf exec <command> [args...]
: 現在のバージョンでShimコマンドを実行します。asdf env <command> [util]
: Shimコマンドの実行時に使用される環境において、util(デフォルト: env
)を実行します。asdfからの呼び出しシグネチャ
"${plugin_path}/bin/exec-env"
bin/exec-path
ツールの特定バージョンの実行ファイルパスを取得します。 実行ファイルへの相対パスを文字列で出力する必要があります。 これにより、プラグインはShimで指定された実行ファイルパスを条件付きで上書きして返すか、 そうでなければ、Shimで指定されたデフォルトのパスを返すことができます。
説明
ツールの特定バージョンの実行ファイルパスを取得します。
実装内容
Usage:\n plugin/bin/exec-path <install-path> <command> <executable-path>\n\nExample Call:\n ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"\n\nOutput:\n bin/foox
スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。このスクリプトを呼び出すコマンド
asdf which <command>
: 実行ファイルのパスを表示します。asdf exec <command> [args...]
: 現在のバージョンでShimコマンドを実行します。asdf env <command> [util]
: Shimコマンドの実行時に使用される環境において、util(デフォルト: env
)を実行します。asdfからの呼び出しシグネチャ
"${plugin_path}/bin/exec-path" "$install_path" "$cmd" "$relative_path"
bin/uninstall
説明
ツールの特定バージョンをアンインストールします。
出力フォーマット
ユーザへの出力は、stdout
またはstderr
へ適切に送信してください。後続のコア実行によってこれらの出力が読み取られることはありません。
スクリプトで使用できる環境変数
このスクリプトに環境変数は提供されません。
このスクリプトを呼び出すコマンド
asdf list all <name> <version>
asdf uninstall nodejs 18.15.0
: nodejsのバージョン18.15.0
をアンインストールし、npm i -g
でグローバルにインストールしたものを含むすべてのShimを削除します。asdfからの呼び出しシグネチャ
引数はありません。
"${plugin_path}/bin/uninstall"
bin/list-legacy-filenames
説明
ツールのバージョンを決定するために使用されるレガシー構成ファイルのリストを出力します。
実装内容
.ruby-version .rvmrc
"${HOME}"/.asdfrc
内のlegacy_version_file
オプションを有効にしたユーザにのみ適用されます。スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。このスクリプトを呼び出すコマンド
ツールのバージョンを読み込むすべてのコマンドから呼び出されます。
asdfからの呼び出しシグネチャ
引数はありません。
"${plugin_path}/bin/list-legacy-filenames"
bin/parse-legacy-file
説明
asdfによって発見されたレガシーファイルをパースして、ツールのバージョンを決定します。JavaScriptのpackage.json
や、Go言語のgo.mod
のようなファイルから、バージョン番号を抽出するのに役立ちます。
実装内容
cat
してバージョンを決定します。1.2.3
スクリプトで使用できる環境変数
このスクリプトが呼び出される前に、環境変数が設定されることはありません。
このスクリプトを呼び出すコマンド
ツールのバージョンを読み込むすべてのコマンドから呼び出されます。
asdfからの呼び出しシグネチャ
このスクリプトは、レガシーファイルの内容を読み込むために、レガシーファイルのパスという1つの引数を受け取ります。
"${plugin_path}/bin/parse-legacy-file" "$file_path"
bin/post-plugin-add
説明
このスクリプトは、asdfのasdf plugin add <tool>
コマンドで、プラグインが 追加 された 後に 呼び出されます。
関連するコマンドフックについても参照してください:
pre_asdf_plugin_add
pre_asdf_plugin_add_${plugin_name}
post_asdf_plugin_add
post_asdf_plugin_add_${plugin_name}
スクリプトで使用できる環境変数
ASDF_PLUGIN_PATH
: プラグインがインストールされている場所へのパスです。ASDF_PLUGIN_SOURCE_URL
: プラグインソースのURLです。ローカルディレクトリパスを指定することもできます。asdfからの呼び出しシグネチャ
引数はありません。
"${plugin_path}/bin/post-plugin-add"
bin/post-plugin-update
説明
このスクリプトは、asdfのasdf plugin update <tool> [<git-ref>]
コマンドで、 更新 されたプラグインがダウンロードされた 後に 呼び出されます。
関連するコマンドフックについても参照してください:
pre_asdf_plugin_updated
pre_asdf_plugin_updated_${plugin_name}
post_asdf_plugin_updated
post_asdf_plugin_updated_${plugin_name}
スクリプトで使用できる環境変数
ASDF_PLUGIN_PATH
: プラグインがインストールされている場所へのパスです。ASDF_PLUGIN_PREV_REF
: プラグインの以前のgit-refです。ASDF_PLUGIN_POST_REF
: 更新後のプラグインのgit-refです。asdfからの呼び出しシグネチャ
引数はありません。
"${plugin_path}/bin/post-plugin-update"
bin/pre-plugin-remove
説明
このスクリプトは、asdfのasdf plugin remove <tool>
コマンドで、プラグインが 削除 される 前に 呼び出されます。
関連するコマンドフックについても参照してください:
pre_asdf_plugin_remove
pre_asdf_plugin_remove_${plugin_name}
post_asdf_plugin_remove
post_asdf_plugin_remove_${plugin_name}
スクリプトで使用できる環境変数
ASDF_PLUGIN_PATH
: プラグインがインストールされている場所へのパスです。asdfからの呼び出しシグネチャ
引数はありません。
"${plugin_path}/bin/pre-plugin-remove"
プラグイン名をサブコマンドとして使用し、 asdfコマンドラインインターフェースを通して呼び出すことのできるlib/commands/command*.bash
スクリプトまたは実行ファイルを用意することで、 新しいasdfコマンドを定義することができます。
例えば、foo
というプラグインがあるとすると:
foo/\n lib/commands/\n command.bash\n command-bat.bash\n command-bat-man.bash\n command-help.bash
ユーザは下記コマンドが実行できるようになります:
$ asdf foo # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash`\n$ asdf foo bar # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar`\n$ asdf foo help # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash`\n$ asdf foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash`\n$ asdf foo bat baz # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz`
プラグイン開発者はこの機能を使って、ツールに関連するユーティリティを提供したり、 asdf自体のコマンド拡張プラグインを作成したりすることができます。
実行可能ビット(executable bit)が付与されている場合、 asdfの実行に代わって、当該スクリプトが実行されます。
実行可能ビット(executable bit)が付与されていない場合、asdfは当該スクリプトをBashスクリプトとしてsourceします。
$ASDF_CMD_FILE
環境変数は、ソースとなるファイルのフルパスに解決されます。
haxe
は、 この機能使ったプラグインの素晴らしい例です。 このプラグインは、asdf haxe neko-dylibs-link
を提供しており、 Haxeの実行ファイルが実行ディレクトリから相対的に動的ライブラリを見つけようとしてしまう問題を修正します。
プラグインのREADMEには、asdf拡張コマンドに関することを必ず記載するようにしてください。
',11)),i("h2",f,[s[45]||(s[45]=a("カスタムShimテンプレート ")),l(t,{type:"danger",text:"高度",vertical:"middle"}),s[46]||(s[46]=a()),s[47]||(s[47]=i("a",{class:"header-anchor",href:"#カスタムshimテンプレート","aria-label":'Permalink to "カスタムShimテンプレート警告
どうしても必要な場合にのみ使用してください。
asdfでは、カスタムShimテンプレートを使用することができます。 foo
という実行ファイルに対して、プラグイン内にshims/foo
ファイルが存在すれば、 asdfは標準Shimテンプレートを使用する代わりに、そのファイルをコピーします。
この機能は賢く使う必要があります。
asdfコアチームが把握している限り、 この機能は公式プラグインであるElixirプラグインでのみ使用されています。 実行ファイルは、実行ファイルであると同時に、Elixirファイルとしても読み込まれます。 そのため、標準的なBashのShimを使用できないのです。
asdfでは、プラグインをテストするためのplugin-test
コマンドを用意しており、下記のように使用できます:
asdf plugin test <plugin_name> <plugin_url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git_ref>] [test_command...]
<plugin_name>
と<plugin_url>
は必須です。[--asdf-tool-version <version>]
を指定すると、そのバージョンのツールがインストールされます。 デフォルトは、asdf latest <plugin-name>
です。[--asdf-plugin-gitref <git_ref>]
を指定すると、 そのコミット/ブランチ/タグでプラグイン自体をチェックアウトします。 これは、プラグインのCIにおいて、プルリクエストをテストする際に便利です。[test_command...]
パラメータは、インストールしたツールが正しく動作するかを確認するために実行するコマンドです。 通常は、<tool> --version
または<tool> --help
となります。 例えば、NodeJSプラグインをテストするときは、次のように実行します:# asdf plugin test <plugin_name> <plugin_url> [test_command]
+ asdf plugin test nodejs https://github.com/asdf-vm/asdf-nodejs.git node --version
備考
LinuxとmacOSの両方のCI環境でテストすることを推奨します。
asdf-vm/actionsリポジトリでは、 GitHub上でホストされているプラグインをテストするためのGitHub Actionを提供しています。 \`.github/workflows/test.yamlのActionsワークフローの例は以下のとおりです:
name: Test
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+
+jobs:
+ plugin_test:
+ name: asdf plugin test
+ strategy:
+ matrix:
+ os:
+ - ubuntu-latest
+ - macos-latest
+ runs-on: \${{ matrix.os }}
+ steps:
+ - name: asdf_plugin_test
+ uses: asdf-vm/actions/plugin-test@v2
+ with:
+ command: "<MY_TOOL> --version"
以下は、.travis.yml
ファイルの例です。必要に応じてカスタマイズしてください:
language: c
+script: asdf plugin test <MY_TOOL> $TRAVIS_BUILD_DIR '<MY_TOOL> --version'
+before_script:
+ - git clone https://github.com/asdf-vm/asdf.git asdf
+ - . asdf/asdf.sh
+os:
+ - linux
+ - osx
備考
他のCIを使用する場合、 プラグインの場所への相対パスを渡す必要がある場合があります:
asdf plugin test <tool_name> <path> '<tool_command> --version'
bin/list-all
やbin/latest-stable
のように、コマンドが外部APIへのアクセスに依存している場合、 自動テスト中にレート制限が発生することがあります。 これを軽減するため、環境変数経由で認証トークンを提供するコードパスがあることを確認してください。 以下に例を示します:
cmd="curl --silent"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"
GITHUB_API_TOKEN
GITHUB_API_TOKEN
を利用する際は、 まず、 public_repo
アクセスのみをもつ新しいパーソナルトークンを作成してください。
次に、このトークンをCIパイプライン環境変数に追加してください。
警告
認証トークンをコードリポジトリで公開してはいけません。
ヒント
推奨されるプラグインのインストール方法は、URLをもとに直接インストールする方法です:
# asdf plugin add <name> <git_url>
+ asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs
asdfの各種コマンドでgit_url
が指定されなかった場合、 asdfは正確なgit_url
を決定するために、 ショートネームインデックスリポジトリを使用します。
このリポジトリの指示に従うことで、 あなたが作成したプラグインを、 ショートネームインデックスに追加することができます。
`,27))])}const B=n(h,[["render",v]]);export{x as __pageData,B as default}; diff --git a/assets/ja-jp_plugins_create.md.CF7Jmvco.lean.js b/assets/ja-jp_plugins_create.md.CF7Jmvco.lean.js new file mode 100644 index 00000000..c0407b0a --- /dev/null +++ b/assets/ja-jp_plugins_create.md.CF7Jmvco.lean.js @@ -0,0 +1,35 @@ +import{_ as n,c as p,a2 as e,j as i,a,G as l,B as d,o}from"./chunks/framework.C9NVOr0y.js";const x=JSON.parse('{"title":"プラグインの作成","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/plugins/create.md","filePath":"ja-jp/plugins/create.md","lastUpdated":1704890757000}'),h={name:"ja-jp/plugins/create.md"},r={tabindex:"0"},k={style:{"text-align":"left"}},g={style:{"text-align":"left"}},c={style:{"text-align":"left"}},u={style:{"text-align":"left"}},b={id:"bin-list-all",tabindex:"-1"},F={id:"bin-download",tabindex:"-1"},E={id:"bin-install",tabindex:"-1"},y={id:"bin-latest-stable",tabindex:"-1"},m={id:"asdf-cliの拡張コマンド",tabindex:"-1"},f={id:"カスタムshimテンプレート",tabindex:"-1"};function v(A,s,_,C,S,D){const t=d("Badge");return o(),p("div",null,[s[48]||(s[48]=e('プラグインとは、 言語/ツールのバージョン管理をサポートするための実行スクリプトを含めたGitリポジトリのことです。 これらのスクリプトは、asdf list-all <name>
やasdf install <name> <version>
などの機能をサポートするコマンドを使って、 asdfによって実行されます。
オリジナルのプラグインを作成するには、次の2つの方法があります:
asdf-<tool_name>
)を 生成 します。 生成できたら、 そのリポジトリをクローンしてsetup.bash
のスクリプトを実行し、 テンプレートを対話的に更新していきます。asdf-<tool_name>
という名前のリポジトリを自分で立ち上げ、 以降に記載されている必要なスクリプトを実装します。asdf
コマンドを呼び出してはいけません。sort -V
などです。 asdfコアの禁止コマンド一覧もご覧ください。以下は、asdfから呼び出せるスクリプトの全リストです。
',9)),i("table",r,[s[25]||(s[25]=i("thead",null,[i("tr",null,[i("th",{style:{"text-align":"left"}},"スクリプト"),i("th",{style:{"text-align":"left"}},"説明")])],-1)),i("tbody",null,[i("tr",null,[i("td",k,[s[0]||(s[0]=i("a",{href:"#bin-list-all"},"bin/list-all",-1)),s[1]||(s[1]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"})]),s[2]||(s[2]=i("td",{style:{"text-align":"left"}},"インストール可能なすべてのバージョンをリストします。",-1))]),i("tr",null,[i("td",g,[s[3]||(s[3]=i("a",{href:"#bin-download"},"bin/download",-1)),s[4]||(s[4]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"})]),s[5]||(s[5]=i("td",{style:{"text-align":"left"}},"ツールの特定バージョンのソースコードまたはバイナリをダウンロードします。",-1))]),i("tr",null,[i("td",c,[s[6]||(s[6]=i("a",{href:"#bin-install"},"bin/install",-1)),s[7]||(s[7]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"})]),s[8]||(s[8]=i("td",{style:{"text-align":"left"}},"ツールの特定バージョンをインストールします。",-1))]),i("tr",null,[i("td",u,[s[9]||(s[9]=i("a",{href:"#bin-latest-stable"},"bin/latest-stable",-1)),s[10]||(s[10]=a()),l(t,{type:"warning",text:"推奨",vertical:"middle"})]),s[11]||(s[11]=i("td",{style:{"text-align":"left"}},"指定されたツールの最新安定バージョンをリストします。",-1))]),s[12]||(s[12]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-help.overview"},"bin/help.overview")]),i("td",{style:{"text-align":"left"}},"プラグインおよびツールに関する概要説明を出力します。")],-1)),s[13]||(s[13]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-help.deps"},"bin/help.deps")]),i("td",{style:{"text-align":"left"}},"オペレーティングシステムに合わせた依存関係のリストを出力します。")],-1)),s[14]||(s[14]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-help.config"},"bin/help.config")]),i("td",{style:{"text-align":"left"}},"プラグインおよびツールの構成設定一覧を出力します。")],-1)),s[15]||(s[15]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-help.links"},"bin/help.links")]),i("td",{style:{"text-align":"left"}},"プラグインとツールに関連するリンクリストを出力します。")],-1)),s[16]||(s[16]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-list-bin-paths"},"bin/list-bin-paths")]),i("td",{style:{"text-align":"left"}},"Shimを作成するバイナリが存在するディレクトリへの相対パスの一覧を出力します。")],-1)),s[17]||(s[17]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-exec-env"},"bin/exec-env")]),i("td",{style:{"text-align":"left"}},"ツールのバイナリのShimを実行する前に環境を準備します。")],-1)),s[18]||(s[18]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-exec-path"},"bin/exec-path")]),i("td",{style:{"text-align":"left"}},"ツールの特定バージョンの実行ファイルパスを出力します。")],-1)),s[19]||(s[19]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-uninstall"},"bin/uninstall")]),i("td",{style:{"text-align":"left"}},"ツールの特定バージョンをアンインストールします。")],-1)),s[20]||(s[20]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-list-legacy-filenames"},"bin/list-legacy-filenames")]),i("td",{style:{"text-align":"left"}},[i("code",null,".ruby-version"),a("のような、レガシー構成ファイルのリストを出力します。")])],-1)),s[21]||(s[21]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-parse-legacy-file"},"bin/parse-legacy-file")]),i("td",{style:{"text-align":"left"}},"レガシーバージョンファイルのカスタムパーサーです。")],-1)),s[22]||(s[22]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-post-plugin-add"},"bin/post-plugin-add")]),i("td",{style:{"text-align":"left"}},"プラグインが追加された後に実行されるフックです。")],-1)),s[23]||(s[23]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-post-plugin-update"},"bin/post-plugin-update")]),i("td",{style:{"text-align":"left"}},"プラグインが更新された後に実行されるフックです。")],-1)),s[24]||(s[24]=i("tr",null,[i("td",{style:{"text-align":"left"}},[i("a",{href:"#bin-pre-plugin-remove"},"bin/pre-plugin-remove")]),i("td",{style:{"text-align":"left"}},"プラグインが削除される前に実行されるフックです。")],-1))])]),s[49]||(s[49]=e('どのコマンドがどのスクリプトを呼び出すかについては、 各スクリプトの詳細なドキュメントを参照してください。
以下は、すべてのスクリプトで使用される環境変数の全リストです。
環境変数 | 説明 |
---|---|
ASDF_INSTALL_TYPE | version またはref です。 |
ASDF_INSTALL_VERSION | ASDF_INSTALL_TYPE に応じてフルバージョンナンバーまたはGit Refの値が入ります。 |
ASDF_INSTALL_PATH | ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。 |
ASDF_CONCURRENCY | ソースコードのコンパイル時に使用するコア数です。make -j のようなフラグを設定する際に便利です。 |
ASDF_DOWNLOAD_PATH | bin/download によってソースコードまたはバイナリがダウンロードされる場所へのパスです。 |
ASDF_PLUGIN_PATH | プラグインがインストールされている場所へのパスです。 |
ASDF_PLUGIN_SOURCE_URL | プラグインソースのURLです。 |
ASDF_PLUGIN_PREV_REF | プラグインの以前のgit-ref です。 |
ASDF_PLUGIN_POST_REF | 更新後のプラグインのgit-ref です。 |
ASDF_CMD_FILE | ソースとなるファイルのフルパスに解決されます。 |
備考
すべてのスクリプトですべての環境変数が使用できるわけではありません。 以下の各スクリプトのドキュメントで、そのスクリプトで利用可能な環境変数を確認してください。
説明
インストール可能なすべてのバージョンをリストします。
出力フォーマット
スペース区切りのバージョンリストの文字列を出力する必要があります。例えば次のとおりです:
1.0.1 1.0.2 1.3.0 1.4
最新バージョンが末尾にくる必要があります。
asdfコアは各バージョンを1行ずつ表示するため、 いくつかのバージョンは画面外にはみ出る場合があります。
並べ替え
ウェブサイト上のリリースページからバージョンを取得する場合、 提供されている順序は正しいリリース順となっていることが多いため、 そのままの順序を使用することを推奨します。 逆順にしたければ、tsc
をパイプで通すだけで十分です。
どうしても並べ替えが避けられない場合、sort -V
は移植性が無いため、次のいずれかの方法を使用することを推奨します:
v2.18.0
以上が必要です)sed
、sort
、およびawk
が必要です)スクリプトで使用できる環境変数
このスクリプトに環境変数は提供されません。
このスクリプトを呼び出すコマンド
asdf list all <name> [version]
asdf list all nodejs
: このスクリプトで返されるすべてのバージョンを、 1行ずつリストします。asdf list all nodejs 18
: このスクリプトで返されるすべてのバージョンから、 18
で始まるバージョンのみフィルタし、1行ずつリストします。asdfからの呼び出しシグネチャ
引数はありません。
"${plugin_path}/bin/list-all"
説明
ツールの特定バージョンのソースコードまたはバイナリを、指定された場所にダウンロードします。
実装内容
ASDF_DOWNLOAD_PATH
で指定されたディレクトリに、ソースコードまたはバイナリをダウンロードする必要があります。ASDF_DOWNLOAD_PATH
ディレクトリに配置する必要があります。ASDF_DOWNLOAD_PATH
ディレクトリ内に何もファイルを配置しないようにしてください。0
としてください。レガシープラグイン
このスクリプトはすべてのプラグインで 必須 とされていますが、このスクリプトが導入される以前の"レガシー"プラグインでは、 オプション となっていました。
このスクリプトが存在しない場合、asdfはbin/install
スクリプトがあると想定して、バージョンのダウンロード、かつ、インストールが実行されます。
レガシープラグインのサポートは最終的に削除される予定のため、今後作成するすべてのプラグインでこのスクリプトを含めるようにしてください。
スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。ASDF_DOWNLOAD_PATH
: ソースコードまたはバイナリのダウンロード先のパスです。このスクリプトを呼び出すコマンド
asdf install <tool> [version]
asdf install <tool> latest[:version]
asdf install nodejs 18.0.0
: Node.jsのバージョン18.0.0
のソースコードまたはバイナリをダウンロードし、ASDF_DOWNLOAD_PATH
ディレクトリに配置します。 そしてbin/install
スクリプトを実行します。asdfからの呼び出しシグネチャ
引数はありません。
"${plugin_path}"/bin/download
説明
ツールの特定バージョンを指定された場所にインストールします。
実装内容
ASDF_INSTALL_PATH
のパスのディレクトリにインストールする必要があります。$ASDF_INSTALL_PATH/bin
内にあるファイルに対して作成されます。 この動作は、オプションのbin/list-bin-pathsスクリプトでカスタマイズできます。0
としてください。ASDF_INSTALL_PATH
にファイルを配置するようなスクリプトとしてください。レガシープラグイン
bin/download
スクリプトが存在しない場合、このスクリプトでは、指定されたバージョンをダウンロード、かつ、インストールをする必要があります。
0.7._
以前と0.8._
以降のasdfコアの互換性を保つために、ASDF_DOWNLOAD_PATH
環境変数が設定されているかを確認してください。 設定されている場合は、bin/download
スクリプトがすでにバージョンをダウンロードしていると想定し、設定されていない場合は、bin/install
でソースコードをダウンロードするようにしてください。
スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。ASDF_CONCURRENCY
: ソースコードのコンパイル時に使用するコア数です。make -j
のようなフラグを設定する際に便利です。ASDF_DOWNLOAD_PATH
: ソースコードまたはバイナリのダウンロード先のパスです。このスクリプトを呼び出すコマンド
asdf install
asdf install <tool>
asdf install <tool> [version]
asdf install <tool> latest[:version]
asdf install nodejs 18.0.0
: ASDF_INSTALL_PATH
ディレクトリに、 Node.jsのバージョン18.0.0
をインストールします。asdfからの呼び出しシグネチャ
引数はありません。
"${plugin_path}"/bin/install
説明
ツールの最新安定バージョンを判定します。このスクリプトが存在しない場合、asdfコアはbin/list-all
の出力をtail
した結果をもとに判定しますが、ツールによってはこれが望ましくないことがあります。
実装内容
asdf list all ruby
の出力は、jruby
やrbx
、truffleruby
などの多くのプロバイダのRubyバージョンをリストアップします。ユーザが提供したフィルタは、セマンティックバージョンやプロバイダをフィルタするために、プラグインで使用できます。> asdf latest ruby\n3.2.2\n> asdf latest ruby 2\n2.7.8\n> asdf latest ruby truffleruby\ntruffleruby+graalvm-22.3.1
0
としてください。スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。このスクリプトを呼び出すコマンド
asdf global <tool> latest
: ツールのグローバルバージョンとして、当該ツールの最新安定バージョンにセットします。asdf local <name> latest
: ツールのローカルバージョンとして、当該ツールの最新安定バージョンにセットします。asdf install <tool> latest
: ツールの最新安定バージョンをインストールします。asdf latest <tool> [<version>]
: オプションのフィルタに基づいて、ツールの最新バージョンを出力します。asdf latest --all
: asdfによって管理されているすべてのツールの最新バージョンと、それらがインストールされているかどうかを出力します。asdfからの呼び出しシグネチャ
このスクリプトは、フィルタクエリという1つの引数を受け取ります。
"${plugin_path}"/bin/latest-stable "$query"
bin/help.overview
説明
プラグインおよび管理されているツールに関する概要説明を出力します。
実装内容
ASDF_INSTALL_VERSION
およびASDF_INSTALL_TYPE
環境変数の値を使用してください)。0
としてください。スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。このスクリプトを呼び出すコマンド
asdf help <name> [<version>]
: プラグインおよびツールのドキュメントを出力します。asdfからの呼び出しシグネチャ
"${plugin_path}"/bin/help.overview
bin/help.deps
説明
オペレーティングシステムに合わせた依存関係のリストを出力します。依存関係を1行ごとに出力します。
git\ncurl\nsed
実装内容
bin/help.overview
を用意する必要があります。ASDF_INSTALL_VERSION
およびASDF_INSTALL_TYPE
環境変数の値を使用してください)。0
としてください。スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。このスクリプトを呼び出すコマンド
asdf help <name> [<version>]
: プラグインおよびツールのドキュメントを出力します。asdfからの呼び出しシグネチャ
"${plugin_path}"/bin/help.deps
bin/help.config
説明
プラグインおよびツールで設定必須または任意設定可能な構成設定一覧を出力します。例えば、ツールのインストール・コンパイルに必要な環境変数やその他フラグについて説明します。
実装内容
bin/help.overview
を用意する必要があります。ASDF_INSTALL_VERSION
およびASDF_INSTALL_TYPE
環境変数の値を使用してください)。0
としてください。スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。このスクリプトを呼び出すコマンド
asdf help <name> [<version>]
: プラグインおよびツールのドキュメントを出力します。asdfからの呼び出しシグネチャ
"${plugin_path}"/bin/help.config
bin/help.links
説明
プラグインとツールに関連するリンクリストを出力します。リンクを1行ごとに出力します。
Git Repository: https://github.com/vlang/v\nDocumentation: https://vlang.io
実装内容
bin/help.overview
を用意する必要があります。<title>: <link>
<link>
のみASDF_INSTALL_VERSION
およびASDF_INSTALL_TYPE
環境変数の値を使用してください)。0
としてください。スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。このスクリプトを呼び出すコマンド
asdf help <name> [<version>]
: プラグインおよびツールのドキュメントを出力します。asdfからの呼び出しシグネチャ
"${plugin_path}"/bin/help.links
bin/list-bin-paths
説明
ツールの特定バージョンにおける、実行ファイルが含まれるディレクトリの一覧を出力します。
実装内容
"${ASDF_INSTALL_PATH}"/bin
ディレクトリ内にあるバイナリを探し、そのバイナリ向けのShimを作成します。ASDF_INSTALL_PATH
からの相対パスである必要があります。例えば、次のような出力となります:bin tools veggies
以上の場合、下記ディレクトリ内のファイルへのShimを作成するよう、asdfへ指示されます:
"${ASDF_INSTALL_PATH}"/bin
"${ASDF_INSTALL_PATH}"/tools
"${ASDF_INSTALL_PATH}"/veggies
スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。このスクリプトを呼び出すコマンド
asdf install <tool> [version]
: バイナリへのShimを初期作成します。asdf reshim <tool> <version>
: バイナリへのShimを再作成します。asdfからの呼び出しシグネチャ
"${plugin_path}/bin/list-bin-paths"
bin/exec-env
説明
ツールのバイナリのShimを実行する前に環境を準備します。
スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。このスクリプトを呼び出すコマンド
asdf which <command>
: 実行ファイルのパスを表示します。asdf exec <command> [args...]
: 現在のバージョンでShimコマンドを実行します。asdf env <command> [util]
: Shimコマンドの実行時に使用される環境において、util(デフォルト: env
)を実行します。asdfからの呼び出しシグネチャ
"${plugin_path}/bin/exec-env"
bin/exec-path
ツールの特定バージョンの実行ファイルパスを取得します。 実行ファイルへの相対パスを文字列で出力する必要があります。 これにより、プラグインはShimで指定された実行ファイルパスを条件付きで上書きして返すか、 そうでなければ、Shimで指定されたデフォルトのパスを返すことができます。
説明
ツールの特定バージョンの実行ファイルパスを取得します。
実装内容
Usage:\n plugin/bin/exec-path <install-path> <command> <executable-path>\n\nExample Call:\n ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"\n\nOutput:\n bin/foox
スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。このスクリプトを呼び出すコマンド
asdf which <command>
: 実行ファイルのパスを表示します。asdf exec <command> [args...]
: 現在のバージョンでShimコマンドを実行します。asdf env <command> [util]
: Shimコマンドの実行時に使用される環境において、util(デフォルト: env
)を実行します。asdfからの呼び出しシグネチャ
"${plugin_path}/bin/exec-path" "$install_path" "$cmd" "$relative_path"
bin/uninstall
説明
ツールの特定バージョンをアンインストールします。
出力フォーマット
ユーザへの出力は、stdout
またはstderr
へ適切に送信してください。後続のコア実行によってこれらの出力が読み取られることはありません。
スクリプトで使用できる環境変数
このスクリプトに環境変数は提供されません。
このスクリプトを呼び出すコマンド
asdf list all <name> <version>
asdf uninstall nodejs 18.15.0
: nodejsのバージョン18.15.0
をアンインストールし、npm i -g
でグローバルにインストールしたものを含むすべてのShimを削除します。asdfからの呼び出しシグネチャ
引数はありません。
"${plugin_path}/bin/uninstall"
bin/list-legacy-filenames
説明
ツールのバージョンを決定するために使用されるレガシー構成ファイルのリストを出力します。
実装内容
.ruby-version .rvmrc
"${HOME}"/.asdfrc
内のlegacy_version_file
オプションを有効にしたユーザにのみ適用されます。スクリプトで使用できる環境変数
ASDF_INSTALL_TYPE
: version
またはref
です。ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
の場合、バージョンのフルナンバーです。ASDF_INSTALL_TYPE=ref
の場合、Gitのref (tag/commit/branch)です。ASDF_INSTALL_PATH
: ツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。このスクリプトを呼び出すコマンド
ツールのバージョンを読み込むすべてのコマンドから呼び出されます。
asdfからの呼び出しシグネチャ
引数はありません。
"${plugin_path}/bin/list-legacy-filenames"
bin/parse-legacy-file
説明
asdfによって発見されたレガシーファイルをパースして、ツールのバージョンを決定します。JavaScriptのpackage.json
や、Go言語のgo.mod
のようなファイルから、バージョン番号を抽出するのに役立ちます。
実装内容
cat
してバージョンを決定します。1.2.3
スクリプトで使用できる環境変数
このスクリプトが呼び出される前に、環境変数が設定されることはありません。
このスクリプトを呼び出すコマンド
ツールのバージョンを読み込むすべてのコマンドから呼び出されます。
asdfからの呼び出しシグネチャ
このスクリプトは、レガシーファイルの内容を読み込むために、レガシーファイルのパスという1つの引数を受け取ります。
"${plugin_path}/bin/parse-legacy-file" "$file_path"
bin/post-plugin-add
説明
このスクリプトは、asdfのasdf plugin add <tool>
コマンドで、プラグインが 追加 された 後に 呼び出されます。
関連するコマンドフックについても参照してください:
pre_asdf_plugin_add
pre_asdf_plugin_add_${plugin_name}
post_asdf_plugin_add
post_asdf_plugin_add_${plugin_name}
スクリプトで使用できる環境変数
ASDF_PLUGIN_PATH
: プラグインがインストールされている場所へのパスです。ASDF_PLUGIN_SOURCE_URL
: プラグインソースのURLです。ローカルディレクトリパスを指定することもできます。asdfからの呼び出しシグネチャ
引数はありません。
"${plugin_path}/bin/post-plugin-add"
bin/post-plugin-update
説明
このスクリプトは、asdfのasdf plugin update <tool> [<git-ref>]
コマンドで、 更新 されたプラグインがダウンロードされた 後に 呼び出されます。
関連するコマンドフックについても参照してください:
pre_asdf_plugin_updated
pre_asdf_plugin_updated_${plugin_name}
post_asdf_plugin_updated
post_asdf_plugin_updated_${plugin_name}
スクリプトで使用できる環境変数
ASDF_PLUGIN_PATH
: プラグインがインストールされている場所へのパスです。ASDF_PLUGIN_PREV_REF
: プラグインの以前のgit-refです。ASDF_PLUGIN_POST_REF
: 更新後のプラグインのgit-refです。asdfからの呼び出しシグネチャ
引数はありません。
"${plugin_path}/bin/post-plugin-update"
bin/pre-plugin-remove
説明
このスクリプトは、asdfのasdf plugin remove <tool>
コマンドで、プラグインが 削除 される 前に 呼び出されます。
関連するコマンドフックについても参照してください:
pre_asdf_plugin_remove
pre_asdf_plugin_remove_${plugin_name}
post_asdf_plugin_remove
post_asdf_plugin_remove_${plugin_name}
スクリプトで使用できる環境変数
ASDF_PLUGIN_PATH
: プラグインがインストールされている場所へのパスです。asdfからの呼び出しシグネチャ
引数はありません。
"${plugin_path}/bin/pre-plugin-remove"
プラグイン名をサブコマンドとして使用し、 asdfコマンドラインインターフェースを通して呼び出すことのできるlib/commands/command*.bash
スクリプトまたは実行ファイルを用意することで、 新しいasdfコマンドを定義することができます。
例えば、foo
というプラグインがあるとすると:
foo/\n lib/commands/\n command.bash\n command-bat.bash\n command-bat-man.bash\n command-help.bash
ユーザは下記コマンドが実行できるようになります:
$ asdf foo # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash`\n$ asdf foo bar # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar`\n$ asdf foo help # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash`\n$ asdf foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash`\n$ asdf foo bat baz # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz`
プラグイン開発者はこの機能を使って、ツールに関連するユーティリティを提供したり、 asdf自体のコマンド拡張プラグインを作成したりすることができます。
実行可能ビット(executable bit)が付与されている場合、 asdfの実行に代わって、当該スクリプトが実行されます。
実行可能ビット(executable bit)が付与されていない場合、asdfは当該スクリプトをBashスクリプトとしてsourceします。
$ASDF_CMD_FILE
環境変数は、ソースとなるファイルのフルパスに解決されます。
haxe
は、 この機能使ったプラグインの素晴らしい例です。 このプラグインは、asdf haxe neko-dylibs-link
を提供しており、 Haxeの実行ファイルが実行ディレクトリから相対的に動的ライブラリを見つけようとしてしまう問題を修正します。
プラグインのREADMEには、asdf拡張コマンドに関することを必ず記載するようにしてください。
',11)),i("h2",f,[s[45]||(s[45]=a("カスタムShimテンプレート ")),l(t,{type:"danger",text:"高度",vertical:"middle"}),s[46]||(s[46]=a()),s[47]||(s[47]=i("a",{class:"header-anchor",href:"#カスタムshimテンプレート","aria-label":'Permalink to "カスタムShimテンプレート警告
どうしても必要な場合にのみ使用してください。
asdfでは、カスタムShimテンプレートを使用することができます。 foo
という実行ファイルに対して、プラグイン内にshims/foo
ファイルが存在すれば、 asdfは標準Shimテンプレートを使用する代わりに、そのファイルをコピーします。
この機能は賢く使う必要があります。
asdfコアチームが把握している限り、 この機能は公式プラグインであるElixirプラグインでのみ使用されています。 実行ファイルは、実行ファイルであると同時に、Elixirファイルとしても読み込まれます。 そのため、標準的なBashのShimを使用できないのです。
asdfでは、プラグインをテストするためのplugin-test
コマンドを用意しており、下記のように使用できます:
asdf plugin test <plugin_name> <plugin_url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git_ref>] [test_command...]
<plugin_name>
と<plugin_url>
は必須です。[--asdf-tool-version <version>]
を指定すると、そのバージョンのツールがインストールされます。 デフォルトは、asdf latest <plugin-name>
です。[--asdf-plugin-gitref <git_ref>]
を指定すると、 そのコミット/ブランチ/タグでプラグイン自体をチェックアウトします。 これは、プラグインのCIにおいて、プルリクエストをテストする際に便利です。[test_command...]
パラメータは、インストールしたツールが正しく動作するかを確認するために実行するコマンドです。 通常は、<tool> --version
または<tool> --help
となります。 例えば、NodeJSプラグインをテストするときは、次のように実行します:# asdf plugin test <plugin_name> <plugin_url> [test_command]
+ asdf plugin test nodejs https://github.com/asdf-vm/asdf-nodejs.git node --version
備考
LinuxとmacOSの両方のCI環境でテストすることを推奨します。
asdf-vm/actionsリポジトリでは、 GitHub上でホストされているプラグインをテストするためのGitHub Actionを提供しています。 \`.github/workflows/test.yamlのActionsワークフローの例は以下のとおりです:
name: Test
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+
+jobs:
+ plugin_test:
+ name: asdf plugin test
+ strategy:
+ matrix:
+ os:
+ - ubuntu-latest
+ - macos-latest
+ runs-on: \${{ matrix.os }}
+ steps:
+ - name: asdf_plugin_test
+ uses: asdf-vm/actions/plugin-test@v2
+ with:
+ command: "<MY_TOOL> --version"
以下は、.travis.yml
ファイルの例です。必要に応じてカスタマイズしてください:
language: c
+script: asdf plugin test <MY_TOOL> $TRAVIS_BUILD_DIR '<MY_TOOL> --version'
+before_script:
+ - git clone https://github.com/asdf-vm/asdf.git asdf
+ - . asdf/asdf.sh
+os:
+ - linux
+ - osx
備考
他のCIを使用する場合、 プラグインの場所への相対パスを渡す必要がある場合があります:
asdf plugin test <tool_name> <path> '<tool_command> --version'
bin/list-all
やbin/latest-stable
のように、コマンドが外部APIへのアクセスに依存している場合、 自動テスト中にレート制限が発生することがあります。 これを軽減するため、環境変数経由で認証トークンを提供するコードパスがあることを確認してください。 以下に例を示します:
cmd="curl --silent"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"
GITHUB_API_TOKEN
GITHUB_API_TOKEN
を利用する際は、 まず、 public_repo
アクセスのみをもつ新しいパーソナルトークンを作成してください。
次に、このトークンをCIパイプライン環境変数に追加してください。
警告
認証トークンをコードリポジトリで公開してはいけません。
ヒント
推奨されるプラグインのインストール方法は、URLをもとに直接インストールする方法です:
# asdf plugin add <name> <git_url>
+ asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs
asdfの各種コマンドでgit_url
が指定されなかった場合、 asdfは正確なgit_url
を決定するために、 ショートネームインデックスリポジトリを使用します。
このリポジトリの指示に従うことで、 あなたが作成したプラグインを、 ショートネームインデックスに追加することができます。
`,27))])}const B=n(h,[["render",v]]);export{x as __pageData,B as default}; diff --git a/assets/manage_commands.md.BSbw1HQ9.js b/assets/manage_commands.md.BSbw1HQ9.js new file mode 100644 index 00000000..78d7c5b1 --- /dev/null +++ b/assets/manage_commands.md.BSbw1HQ9.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as e,o as l}from"./chunks/framework.C9NVOr0y.js";const m=JSON.parse('{"title":"All Commands","description":"","frontmatter":{},"headers":[],"relativePath":"manage/commands.md","filePath":"manage/commands.md","lastUpdated":1687069487000}'),p={name:"manage/commands.md"};function t(i,s,o,c,r,d){return l(),n("div",null,s[0]||(s[0]=[e(`The list of all commands available in asdf
. This list is the asdf help
command text.
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>] Add a plugin from the plugin repo OR,
+ add a Git repo as a plugin by
+ specifying the name and repo url
+asdf plugin list [--urls] [--refs] List installed plugins. Optionally show
+ git urls and git-ref
+asdf plugin list all List plugins registered on asdf-plugins
+ repository with URLs
+asdf plugin remove <name> Remove plugin and package versions
+asdf plugin update <name> [<git-ref>] Update a plugin to latest commit on
+ default branch or a particular git-ref
+asdf plugin update --all Update all plugins to latest commit on
+ default branch
+
+
+MANAGE PACKAGES
+asdf current Display current version set or being
+ used for all packages
+asdf current <name> Display current version set or being
+ used for package
+asdf global <name> <version> Set the package global version
+asdf global <name> latest[:<version>] Set the package global version to the
+ latest provided version
+asdf help <name> [<version>] Output documentation for plugin and tool
+asdf install Install all the package versions listed
+ in the .tool-versions file
+asdf install <name> Install one tool at the version
+ specified in the .tool-versions file
+asdf install <name> <version> Install a specific version of a package
+asdf install <name> latest[:<version>] Install the latest stable version of a
+ package, or with optional version,
+ install the latest stable version that
+ begins with the given string
+asdf latest <name> [<version>] Show latest stable version of a package
+asdf latest --all Show latest stable version of all the
+ packages and if they are installed
+asdf list <name> [version] List installed versions of a package and
+ optionally filter the versions
+asdf list all <name> [<version>] List all versions of a package and
+ optionally filter the returned versions
+asdf local <name> <version> Set the package local version
+asdf local <name> latest[:<version>] Set the package local version to the
+ latest provided version
+asdf shell <name> <version> Set the package version to
+ \`ASDF_\${LANG}_VERSION\` in the current shell
+asdf uninstall <name> <version> Remove a specific version of a package
+asdf where <name> [<version>] Display install path for an installed
+ or current version
+asdf which <command> Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...] Executes the command shim for current version
+asdf env <command> [util] Runs util (default: \`env\`) inside the
+ environment used for command shim execution.
+asdf info Print OS, Shell and ASDF debug information.
+asdf version Print the currently installed version of ASDF
+asdf reshim <name> <version> Recreate shims for version of a package
+asdf shim-versions <command> List the plugins and versions that
+ provide a command
+asdf update Update asdf to the latest stable release
+asdf update --head Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs: https://asdf-vm.com
The list of all commands available in asdf
. This list is the asdf help
command text.
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>] Add a plugin from the plugin repo OR,
+ add a Git repo as a plugin by
+ specifying the name and repo url
+asdf plugin list [--urls] [--refs] List installed plugins. Optionally show
+ git urls and git-ref
+asdf plugin list all List plugins registered on asdf-plugins
+ repository with URLs
+asdf plugin remove <name> Remove plugin and package versions
+asdf plugin update <name> [<git-ref>] Update a plugin to latest commit on
+ default branch or a particular git-ref
+asdf plugin update --all Update all plugins to latest commit on
+ default branch
+
+
+MANAGE PACKAGES
+asdf current Display current version set or being
+ used for all packages
+asdf current <name> Display current version set or being
+ used for package
+asdf global <name> <version> Set the package global version
+asdf global <name> latest[:<version>] Set the package global version to the
+ latest provided version
+asdf help <name> [<version>] Output documentation for plugin and tool
+asdf install Install all the package versions listed
+ in the .tool-versions file
+asdf install <name> Install one tool at the version
+ specified in the .tool-versions file
+asdf install <name> <version> Install a specific version of a package
+asdf install <name> latest[:<version>] Install the latest stable version of a
+ package, or with optional version,
+ install the latest stable version that
+ begins with the given string
+asdf latest <name> [<version>] Show latest stable version of a package
+asdf latest --all Show latest stable version of all the
+ packages and if they are installed
+asdf list <name> [version] List installed versions of a package and
+ optionally filter the versions
+asdf list all <name> [<version>] List all versions of a package and
+ optionally filter the returned versions
+asdf local <name> <version> Set the package local version
+asdf local <name> latest[:<version>] Set the package local version to the
+ latest provided version
+asdf shell <name> <version> Set the package version to
+ \`ASDF_\${LANG}_VERSION\` in the current shell
+asdf uninstall <name> <version> Remove a specific version of a package
+asdf where <name> [<version>] Display install path for an installed
+ or current version
+asdf which <command> Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...] Executes the command shim for current version
+asdf env <command> [util] Runs util (default: \`env\`) inside the
+ environment used for command shim execution.
+asdf info Print OS, Shell and ASDF debug information.
+asdf version Print the currently installed version of ASDF
+asdf reshim <name> <version> Recreate shims for version of a package
+asdf shim-versions <command> List the plugins and versions that
+ provide a command
+asdf update Update asdf to the latest stable release
+asdf update --head Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs: https://asdf-vm.com
Configuration of asdf
encompasses both the sharable .tool-versions
files as well as user specific customisations with .asdfrc
and Environment Variables.
.tool-versions
Whenever .tool-versions
file is present in a directory, the tool versions it declares will be used in that directory and any subdirectories.
Note
Global defaults can be set in the file $HOME/.tool-versions
This is what a .tool-versions
file looks like:
ruby 2.5.3
+nodejs 10.15.0
You can also include comments:
ruby 2.5.3 # This is a comment
+# This is another comment
+nodejs 10.15.0
The versions can be in the following format:
10.15.0
- an actual version. Plugins that support downloading binaries, will download binaries.ref:v1.0.2-a
or ref:39cb398vb39
- tag/commit/branch to download from github and compilepath:~/src/elixir
- a path to custom compiled version of a tool to use. For use by language developers and such.system
- this keyword causes asdf to passthrough to the version of the tool on the system that is not managed by asdf.TIP
Multiple versions can be set by separating them with a space. For example, to use Python 3.7.2
, fallback to Python 2.7.15
and finally to the system
Python, the following line can be added to .tool-versions
.
python 3.7.2 2.7.15 system
To install all the tools defined in a .tool-versions
file run asdf install
with no other arguments in the directory containing the .tool-versions
file.
To install a single tool defined in a .tool-versions
file run asdf install <name>
in the directory containing the .tool-versions
file. The tool will be installed at the version specified in the .tool-versions
file.
Edit the file directly or use asdf local
(or asdf global
) which updates it.
.asdfrc
The .asdfrc
file defines the user's machine specific configuration.
\${HOME}/.asdfrc
is the default location used by asdf. This can be set with the Environment Variable ASDF_CONFIG_FILE
.
The below file shows the required format with the default values:
legacy_version_file = no
+use_release_candidates = no
+always_keep_download = no
+plugin_repository_last_check_duration = 60
+disable_plugin_short_name_repository = no
+concurrency = auto
legacy_version_file
Plugins with support can read the versions files used by other version managers, for example, .ruby-version
in the case of Ruby's rbenv
.
Sync events occur when the following commands are executed:
asdf plugin add <name>
asdf plugin list all
asdf plugin add <name> <git-url>
does NOT trigger a plugin sync.
Note
Setting the value to never
does not stop the plugin repository from being initially synced, for that behaviour see disable_plugin_short_name_repository
.
disable_plugin_short_name_repository
Disable synchronization of the asdf plugin short-name repository. Sync events will exit early if the short-name repository is disabled.
',6)),e("table",v,[t[32]||(t[32]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"Options"),e("th",{style:{"text-align":"left"}},"Description")])],-1)),e("tbody",null,[e("tr",null,[e("td",x,[t[28]||(t[28]=e("code",null,"no",-1)),t[29]||(t[29]=o()),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[30]||(t[30]=e("td",{style:{"text-align":"left"}},"Clone or update the asdf plugin repository on sync events",-1))]),t[31]||(t[31]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"Disable the plugin short-name repository")],-1))])]),t[41]||(t[41]=s('Sync events occur when the following commands are executed:
asdf plugin add <name>
asdf plugin list all
asdf plugin add <name> <git-url>
does NOT trigger a plugin sync.
Note
Disabling the plugin short-name repository does not remove the repository if it has already synced. Remove the plugin repo with rm --recursive --trash $ASDF_DATA_DIR/repository
.
Disabling the plugin short-name repository does not remove plugins previously installed from this source. Plugins can be removed with asdf plugin remove <name>
. Removing a plugin will remove all installed versions of the managed tool.
concurrency
The default number of cores to use during compilation.
Options | Description |
---|---|
integer | Number of cores to use when compiling the source code |
auto | Calculate the number of cores using nproc , then sysctl hw.ncpu , then /proc/cpuinfo or else 1 |
Note: the environment variable ASDF_CONCURRENCY
take precedence if set.
It is possible to execute custom code:
For example, if a plugin called foo
is installed and provides a bar
executable, then the following hooks can be used to execute custom code first:
pre_foo_bar = echo Executing with args: $@
The following patterns are supported:
pre_<plugin_name>_<command>
pre_asdf_download_<plugin_name>
{pre,post}_asdf_{install,reshim,uninstall}_<plugin_name>
$1
: full version{pre,post}_asdf_plugin_{add,update,remove,reshim}
$1
: plugin name{pre,post}_asdf_plugin_{add,update,remove}_<plugin_name>
See Create a Plugin for specifics on what command hooks are ran before or after what commands.
Setting environment variables varies depending on your system and Shell. Default locations depend upon your installation location and method (Git clone, Homebrew, AUR).
Environment variables should generally be set before sourcing asdf.sh
/asdf.fish
etc. For Elvish set above use asdf
.
The following describe usage with a Bash Shell.
ASDF_CONFIG_FILE
Path to the .asdfrc
configuration file. Can be set to any location. Must be an absolute path.
$HOME/.asdfrc
will be used.export ASDF_CONFIG_FILE=/home/john_doe/.config/asdf/.asdfrc
ASDF_DEFAULT_TOOL_VERSIONS_FILENAME
The filename of the file storing the tool names and versions. Can be any valid filename. Typically, you should not set this value unless you want to ignore .tool-versions
files.
.tool-versions
will be used.export ASDF_DEFAULT_TOOL_VERSIONS_FILENAME=tool_versions
ASDF_DIR
The location of asdf
core scripts. Can be set to any location. Must be an absolute path.
bin/asdf
executable is used.export ASDF_DIR=/home/john_doe/.config/asdf
ASDF_DATA_DIR
The location where asdf
will install plugins, shims and tool versions. Can be set to any location. Must be an absolute path.
$HOME/.asdf
if it exists, or else the value of ASDF_DIR
export ASDF_DATA_DIR=/home/john_doe/.asdf
ASDF_CONCURRENCY
Number of cores to use when compiling the source code. If set, this value takes precedence over the asdf config concurrency
value.
concurrency
value is used.export ASDF_CONCURRENCY=32
ASDF_FORCE_PREPEND
Whether or not to prepend the asdf
shims and path directories to the front-most (highest-priority) part of the PATH
.
yes
; but on other systems, defaults to no
yes
: Force asdf
directories to the front of the PATH
yes
: Do not force asdf
directories to the front of the PATH
ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"
Following a simple asdf setup with:
$HOME/.asdf
.asdfrc
filewould result in the following outcomes:
Configuration | Value | Calculated by |
---|---|---|
config file location | $HOME/.asdfrc | ASDF_CONFIG_FILE is empty, so use $HOME/.asdfrc |
default tool versions filename | .tool-versions | ASDF_DEFAULT_TOOL_VERSIONS_FILENAME is empty, so use .tool-versions |
asdf dir | $HOME/.asdf | ASDF_DIR is empty, so use parent dir of bin/asdf |
asdf data dir | $HOME/.asdf | ASDF_DATA_DIR is empty so use $HOME/.asdf as $HOME exists. |
concurrency | auto | ASDF_CONCURRENCY is empty, so rely on concurrency value from the default configuration |
legacy_version_file | no | No custom .asdfrc , so use the default configuration |
use_release_candidates | no | No custom .asdfrc , so use the default configuration |
always_keep_download | no | No custom .asdfrc , so use the default configuration |
plugin_repository_last_check_duration | 60 | No custom .asdfrc , so use the default configuration |
disable_plugin_short_name_repository | no | No custom .asdfrc , so use the default configuration |
Users should not worry about this section as it describes configuration internal to asdf
useful for Package Managers and integrators.
$ASDF_DIR/asdf_updates_disabled
: Updates via the asdf update
command are disabled when this file is present (content irrelevant). This is used by package managers like Pacman or Homebrew to ensure the correct update method is used for the particular installation.Configuration of asdf
encompasses both the sharable .tool-versions
files as well as user specific customisations with .asdfrc
and Environment Variables.
.tool-versions
Whenever .tool-versions
file is present in a directory, the tool versions it declares will be used in that directory and any subdirectories.
Note
Global defaults can be set in the file $HOME/.tool-versions
This is what a .tool-versions
file looks like:
ruby 2.5.3
+nodejs 10.15.0
You can also include comments:
ruby 2.5.3 # This is a comment
+# This is another comment
+nodejs 10.15.0
The versions can be in the following format:
10.15.0
- an actual version. Plugins that support downloading binaries, will download binaries.ref:v1.0.2-a
or ref:39cb398vb39
- tag/commit/branch to download from github and compilepath:~/src/elixir
- a path to custom compiled version of a tool to use. For use by language developers and such.system
- this keyword causes asdf to passthrough to the version of the tool on the system that is not managed by asdf.TIP
Multiple versions can be set by separating them with a space. For example, to use Python 3.7.2
, fallback to Python 2.7.15
and finally to the system
Python, the following line can be added to .tool-versions
.
python 3.7.2 2.7.15 system
To install all the tools defined in a .tool-versions
file run asdf install
with no other arguments in the directory containing the .tool-versions
file.
To install a single tool defined in a .tool-versions
file run asdf install <name>
in the directory containing the .tool-versions
file. The tool will be installed at the version specified in the .tool-versions
file.
Edit the file directly or use asdf local
(or asdf global
) which updates it.
.asdfrc
The .asdfrc
file defines the user's machine specific configuration.
\${HOME}/.asdfrc
is the default location used by asdf. This can be set with the Environment Variable ASDF_CONFIG_FILE
.
The below file shows the required format with the default values:
legacy_version_file = no
+use_release_candidates = no
+always_keep_download = no
+plugin_repository_last_check_duration = 60
+disable_plugin_short_name_repository = no
+concurrency = auto
legacy_version_file
Plugins with support can read the versions files used by other version managers, for example, .ruby-version
in the case of Ruby's rbenv
.
Sync events occur when the following commands are executed:
asdf plugin add <name>
asdf plugin list all
asdf plugin add <name> <git-url>
does NOT trigger a plugin sync.
Note
Setting the value to never
does not stop the plugin repository from being initially synced, for that behaviour see disable_plugin_short_name_repository
.
disable_plugin_short_name_repository
Disable synchronization of the asdf plugin short-name repository. Sync events will exit early if the short-name repository is disabled.
',6)),e("table",v,[t[32]||(t[32]=e("thead",null,[e("tr",null,[e("th",{style:{"text-align":"left"}},"Options"),e("th",{style:{"text-align":"left"}},"Description")])],-1)),e("tbody",null,[e("tr",null,[e("td",x,[t[28]||(t[28]=e("code",null,"no",-1)),t[29]||(t[29]=o()),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[30]||(t[30]=e("td",{style:{"text-align":"left"}},"Clone or update the asdf plugin repository on sync events",-1))]),t[31]||(t[31]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"Disable the plugin short-name repository")],-1))])]),t[41]||(t[41]=s('Sync events occur when the following commands are executed:
asdf plugin add <name>
asdf plugin list all
asdf plugin add <name> <git-url>
does NOT trigger a plugin sync.
Note
Disabling the plugin short-name repository does not remove the repository if it has already synced. Remove the plugin repo with rm --recursive --trash $ASDF_DATA_DIR/repository
.
Disabling the plugin short-name repository does not remove plugins previously installed from this source. Plugins can be removed with asdf plugin remove <name>
. Removing a plugin will remove all installed versions of the managed tool.
concurrency
The default number of cores to use during compilation.
Options | Description |
---|---|
integer | Number of cores to use when compiling the source code |
auto | Calculate the number of cores using nproc , then sysctl hw.ncpu , then /proc/cpuinfo or else 1 |
Note: the environment variable ASDF_CONCURRENCY
take precedence if set.
It is possible to execute custom code:
For example, if a plugin called foo
is installed and provides a bar
executable, then the following hooks can be used to execute custom code first:
pre_foo_bar = echo Executing with args: $@
The following patterns are supported:
pre_<plugin_name>_<command>
pre_asdf_download_<plugin_name>
{pre,post}_asdf_{install,reshim,uninstall}_<plugin_name>
$1
: full version{pre,post}_asdf_plugin_{add,update,remove,reshim}
$1
: plugin name{pre,post}_asdf_plugin_{add,update,remove}_<plugin_name>
See Create a Plugin for specifics on what command hooks are ran before or after what commands.
Setting environment variables varies depending on your system and Shell. Default locations depend upon your installation location and method (Git clone, Homebrew, AUR).
Environment variables should generally be set before sourcing asdf.sh
/asdf.fish
etc. For Elvish set above use asdf
.
The following describe usage with a Bash Shell.
ASDF_CONFIG_FILE
Path to the .asdfrc
configuration file. Can be set to any location. Must be an absolute path.
$HOME/.asdfrc
will be used.export ASDF_CONFIG_FILE=/home/john_doe/.config/asdf/.asdfrc
ASDF_DEFAULT_TOOL_VERSIONS_FILENAME
The filename of the file storing the tool names and versions. Can be any valid filename. Typically, you should not set this value unless you want to ignore .tool-versions
files.
.tool-versions
will be used.export ASDF_DEFAULT_TOOL_VERSIONS_FILENAME=tool_versions
ASDF_DIR
The location of asdf
core scripts. Can be set to any location. Must be an absolute path.
bin/asdf
executable is used.export ASDF_DIR=/home/john_doe/.config/asdf
ASDF_DATA_DIR
The location where asdf
will install plugins, shims and tool versions. Can be set to any location. Must be an absolute path.
$HOME/.asdf
if it exists, or else the value of ASDF_DIR
export ASDF_DATA_DIR=/home/john_doe/.asdf
ASDF_CONCURRENCY
Number of cores to use when compiling the source code. If set, this value takes precedence over the asdf config concurrency
value.
concurrency
value is used.export ASDF_CONCURRENCY=32
ASDF_FORCE_PREPEND
Whether or not to prepend the asdf
shims and path directories to the front-most (highest-priority) part of the PATH
.
yes
; but on other systems, defaults to no
yes
: Force asdf
directories to the front of the PATH
yes
: Do not force asdf
directories to the front of the PATH
ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"
Following a simple asdf setup with:
$HOME/.asdf
.asdfrc
filewould result in the following outcomes:
Configuration | Value | Calculated by |
---|---|---|
config file location | $HOME/.asdfrc | ASDF_CONFIG_FILE is empty, so use $HOME/.asdfrc |
default tool versions filename | .tool-versions | ASDF_DEFAULT_TOOL_VERSIONS_FILENAME is empty, so use .tool-versions |
asdf dir | $HOME/.asdf | ASDF_DIR is empty, so use parent dir of bin/asdf |
asdf data dir | $HOME/.asdf | ASDF_DATA_DIR is empty so use $HOME/.asdf as $HOME exists. |
concurrency | auto | ASDF_CONCURRENCY is empty, so rely on concurrency value from the default configuration |
legacy_version_file | no | No custom .asdfrc , so use the default configuration |
use_release_candidates | no | No custom .asdfrc , so use the default configuration |
always_keep_download | no | No custom .asdfrc , so use the default configuration |
plugin_repository_last_check_duration | 60 | No custom .asdfrc , so use the default configuration |
disable_plugin_short_name_repository | no | No custom .asdfrc , so use the default configuration |
Users should not worry about this section as it describes configuration internal to asdf
useful for Package Managers and integrators.
$ASDF_DIR/asdf_updates_disabled
: Updates via the asdf update
command are disabled when this file is present (content irrelevant). This is used by package managers like Pacman or Homebrew to ensure the correct update method is used for the particular installation.The core asdf
command list is rather small, but can facilitate many workflows.
Covered in the Getting Started guide.
asdf exec <command> [args...]
Executes the command shim for the current version.
asdf env <command> [util]
asdf info
A helper command to print the OS, Shell and asdf
debug information. Share this when making a bug report.
asdf reshim <name> <version>
This recreates the shims for the current version of a package. By default, shims are created by plugins during installation of a tool. Some tools like the npm CLI allow global installation of executables, for example, installing Yarn via npm install -g yarn
. Since this executable was not installed via the plugin lifecycle, no shim exists for it yet. asdf reshim nodejs <version>
will force recalculation of shims for any new executables, like yarn
, for <version>
of nodejs
.
asdf shim-versions <command>
Lists the plugins and versions that provide shims for a command.
As an example, Node.js ships with two executables, node
and npm
. When many versions of the tools are installed with asdf-nodejs
shim-versions
can return:
➜ asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
➜ asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
asdf
has a built in command to update which relies on Git (our recommended installation method). If you installed using a different method you should follow the steps for that method:
Method | Latest Stable Release | Latest commit on master |
---|---|---|
asdf (via Git) | asdf update | asdf update --head |
Homebrew | brew upgrade asdf | brew upgrade asdf --fetch-HEAD |
Pacman | Download a new PKGBUILD & rebuild or use your preferred AUR helper |
To uninstall asdf
follow these steps:
~/.bashrc
remove the lines that source asdf.sh
and the completions:. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
$HOME/.asdf
dir:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bash_profile
remove the lines that source asdf.sh
and the completions:. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
$HOME/.asdf
dir:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bashrc
remove the lines that source asdf.sh
and the completions:. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash
Completions may have been configured as per Homebrew's instructions so follow their guide to find out what to remove.
brew uninstall asdf --force
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
If using macOS Catalina or newer, the default shell has changed to ZSH. If you can't find any config in your ~/.bash_profile
it may be in a ~/.zshrc
in which case please follow the ZSH instructions.
~/.bash_profile
remove the lines that source asdf.sh
and the completions:. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash
Completions may have been configured as per Homebrew's instructions so follow their guide to find out what to remove.
brew uninstall asdf --force
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bashrc
remove the lines that source asdf.sh
and the completions:. /opt/asdf-vm/asdf.sh
pacman -Rs asdf-vm
$HOME/.asdf
dir:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
remove the lines that source asdf.fish
:source ~/.asdf/asdf.fish
and remove completions with this command:
rm -rf ~/.config/fish/completions/asdf.fish
$HOME/.asdf
dir:rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
remove the lines that source asdf.fish
:source "(brew --prefix asdf)"/libexec/asdf.fish
brew uninstall asdf --force
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
remove the lines that source asdf.fish
:source /opt/asdf-vm/asdf.fish
pacman -Rs asdf-vm
$HOME/.asdf
dir:rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
remove the lines that use the asdf
module:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
and uninstall the asdf
module with this command:
rm -f ~/.config/elvish/lib/asdf.elv
$HOME/.asdf
dir:if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
remove the lines that use the asdf
module:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
and uninstall the asdf
module with this command:
rm -f ~/.config/elvish/lib/asdf.elv
brew uninstall asdf --force
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
remove the lines that use the asdf
module:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
and uninstall the asdf
module with this command:
rm -f ~/.config/elvish/lib/asdf.elv
pacman -Rs asdf-vm
$HOME/.asdf
dir:if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
remove the lines that source asdf.sh
and completions:. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit
OR the ZSH Framework plugin if used.
$HOME/.asdf
dir:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
remove the lines that source asdf.sh
:. $(brew --prefix asdf)/libexec/asdf.sh
brew uninstall asdf --force && brew autoremove
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
remove the lines that source asdf.sh
:. /opt/asdf-vm/asdf.sh
pacman -Rs asdf-vm
$HOME/.asdf
dir:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
That's it! 🎉
`,41)]))}const g=i(e,[["render",h]]);export{c as __pageData,g as default}; diff --git a/assets/manage_core.md.BUHLaRG4.lean.js b/assets/manage_core.md.BUHLaRG4.lean.js new file mode 100644 index 00000000..89e7d3ce --- /dev/null +++ b/assets/manage_core.md.BUHLaRG4.lean.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as t,o as l}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"Core","description":"","frontmatter":{},"headers":[],"relativePath":"manage/core.md","filePath":"manage/core.md","lastUpdated":1687069487000}'),e={name:"manage/core.md"};function h(n,s,p,k,d,o){return l(),a("div",null,s[0]||(s[0]=[t(`The core asdf
command list is rather small, but can facilitate many workflows.
Covered in the Getting Started guide.
asdf exec <command> [args...]
Executes the command shim for the current version.
asdf env <command> [util]
asdf info
A helper command to print the OS, Shell and asdf
debug information. Share this when making a bug report.
asdf reshim <name> <version>
This recreates the shims for the current version of a package. By default, shims are created by plugins during installation of a tool. Some tools like the npm CLI allow global installation of executables, for example, installing Yarn via npm install -g yarn
. Since this executable was not installed via the plugin lifecycle, no shim exists for it yet. asdf reshim nodejs <version>
will force recalculation of shims for any new executables, like yarn
, for <version>
of nodejs
.
asdf shim-versions <command>
Lists the plugins and versions that provide shims for a command.
As an example, Node.js ships with two executables, node
and npm
. When many versions of the tools are installed with asdf-nodejs
shim-versions
can return:
➜ asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
➜ asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
asdf
has a built in command to update which relies on Git (our recommended installation method). If you installed using a different method you should follow the steps for that method:
Method | Latest Stable Release | Latest commit on master |
---|---|---|
asdf (via Git) | asdf update | asdf update --head |
Homebrew | brew upgrade asdf | brew upgrade asdf --fetch-HEAD |
Pacman | Download a new PKGBUILD & rebuild or use your preferred AUR helper |
To uninstall asdf
follow these steps:
~/.bashrc
remove the lines that source asdf.sh
and the completions:. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
$HOME/.asdf
dir:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bash_profile
remove the lines that source asdf.sh
and the completions:. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
$HOME/.asdf
dir:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bashrc
remove the lines that source asdf.sh
and the completions:. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash
Completions may have been configured as per Homebrew's instructions so follow their guide to find out what to remove.
brew uninstall asdf --force
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
If using macOS Catalina or newer, the default shell has changed to ZSH. If you can't find any config in your ~/.bash_profile
it may be in a ~/.zshrc
in which case please follow the ZSH instructions.
~/.bash_profile
remove the lines that source asdf.sh
and the completions:. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash
Completions may have been configured as per Homebrew's instructions so follow their guide to find out what to remove.
brew uninstall asdf --force
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bashrc
remove the lines that source asdf.sh
and the completions:. /opt/asdf-vm/asdf.sh
pacman -Rs asdf-vm
$HOME/.asdf
dir:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
remove the lines that source asdf.fish
:source ~/.asdf/asdf.fish
and remove completions with this command:
rm -rf ~/.config/fish/completions/asdf.fish
$HOME/.asdf
dir:rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
remove the lines that source asdf.fish
:source "(brew --prefix asdf)"/libexec/asdf.fish
brew uninstall asdf --force
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
remove the lines that source asdf.fish
:source /opt/asdf-vm/asdf.fish
pacman -Rs asdf-vm
$HOME/.asdf
dir:rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
remove the lines that use the asdf
module:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
and uninstall the asdf
module with this command:
rm -f ~/.config/elvish/lib/asdf.elv
$HOME/.asdf
dir:if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
remove the lines that use the asdf
module:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
and uninstall the asdf
module with this command:
rm -f ~/.config/elvish/lib/asdf.elv
brew uninstall asdf --force
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
remove the lines that use the asdf
module:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
and uninstall the asdf
module with this command:
rm -f ~/.config/elvish/lib/asdf.elv
pacman -Rs asdf-vm
$HOME/.asdf
dir:if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
remove the lines that source asdf.sh
and completions:. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit
OR the ZSH Framework plugin if used.
$HOME/.asdf
dir:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
remove the lines that source asdf.sh
:. $(brew --prefix asdf)/libexec/asdf.sh
brew uninstall asdf --force && brew autoremove
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
remove the lines that source asdf.sh
:. /opt/asdf-vm/asdf.sh
pacman -Rs asdf-vm
$HOME/.asdf
dir:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
config files:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
That's it! 🎉
`,41)]))}const g=i(e,[["render",h]]);export{c as __pageData,g as default}; diff --git a/assets/manage_plugins.md.BOsG6k4O.js b/assets/manage_plugins.md.BOsG6k4O.js new file mode 100644 index 00000000..f3e41889 --- /dev/null +++ b/assets/manage_plugins.md.BOsG6k4O.js @@ -0,0 +1,11 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const g=JSON.parse('{"title":"Plugins","description":"","frontmatter":{},"headers":[],"relativePath":"manage/plugins.md","filePath":"manage/plugins.md","lastUpdated":1687069487000}'),l={name:"manage/plugins.md"};function n(h,s,p,d,o,r){return t(),a("div",null,s[0]||(s[0]=[e(`Plugins are how asdf
knows to handle different tools like Node.js, Ruby, Elixir etc.
See Creating Plugins for the plugin API used to support more tools.
Add plugins via their Git URL:
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm
or via the short-name association in the plugins repository:
asdf plugin add <name>
+# asdf plugin add erlang
Recommendation
Prefer the longer git-url
method as it is independent of the short-name repo.
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
asdf plugin list --urls
+# asdf plugin list
+# java https://github.com/halcyon/asdf-java.git
+# nodejs https://github.com/asdf-vm/asdf-nodejs.git
asdf plugin list all
See Plugins Shortname Index for the entire short-name list of plugins.
asdf plugin update --all
If you want to update a specific package, just say so.
asdf plugin update <name>
+# asdf plugin update erlang
This update will fetch the latest commit on the default branch of the origin of the plugin repository. Versioned plugins and updates are currently being developed (#916)
asdf plugin remove <name>
+# asdf plugin remove erlang
Removing a plugin will remove all installations of the tool made with the plugin. This can be used as a shorthand for cleaning/pruning many unused versions of a tool.
The short-name repo is synced to your local machine and periodically refreshed. This method to determine a sync is as follows:
asdf plugin add <name>
asdf plugin list all
disable_plugin_short_name_repository
is set to yes
, then sync is aborted early. See the asdf config docs for more.X
minutes then the sync will occur. X
defaults to 60
, but can be configured in your .asdfrc
via the plugin_repository_last_check_duration
option. See the asdf config docs for more.Plugins are how asdf
knows to handle different tools like Node.js, Ruby, Elixir etc.
See Creating Plugins for the plugin API used to support more tools.
Add plugins via their Git URL:
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm
or via the short-name association in the plugins repository:
asdf plugin add <name>
+# asdf plugin add erlang
Recommendation
Prefer the longer git-url
method as it is independent of the short-name repo.
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
asdf plugin list --urls
+# asdf plugin list
+# java https://github.com/halcyon/asdf-java.git
+# nodejs https://github.com/asdf-vm/asdf-nodejs.git
asdf plugin list all
See Plugins Shortname Index for the entire short-name list of plugins.
asdf plugin update --all
If you want to update a specific package, just say so.
asdf plugin update <name>
+# asdf plugin update erlang
This update will fetch the latest commit on the default branch of the origin of the plugin repository. Versioned plugins and updates are currently being developed (#916)
asdf plugin remove <name>
+# asdf plugin remove erlang
Removing a plugin will remove all installations of the tool made with the plugin. This can be used as a shorthand for cleaning/pruning many unused versions of a tool.
The short-name repo is synced to your local machine and periodically refreshed. This method to determine a sync is as follows:
asdf plugin add <name>
asdf plugin list all
disable_plugin_short_name_repository
is set to yes
, then sync is aborted early. See the asdf config docs for more.X
minutes then the sync will occur. X
defaults to 60
, but can be configured in your .asdfrc
via the plugin_repository_last_check_duration
option. See the asdf config docs for more.asdf install <name> <version>
+# asdf install erlang 17.3
If a plugin supports downloading & compiling from source, you can specify ref:foo
where foo
is a specific branch, tag, or commit. You'll need to use the same name and reference when uninstalling too.
asdf install <name> latest
+# asdf install erlang latest
Install latest stable version that begins with a given string.
asdf install <name> latest:<version>
+# asdf install erlang latest:17
asdf list <name>
+# asdf list erlang
Filter versions to those that begin with a given string.
asdf list <name> <version>
+# asdf list erlang 17
asdf list all <name>
+# asdf list all erlang
Filter versions to those that begin with a given string.
asdf list all <name> <version>
+# asdf list all erlang 17
asdf latest <name>
+# asdf latest erlang
Show latest stable version that begins with a given string.
asdf latest <name> <version>
+# asdf latest erlang 17
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest
global
writes the version to $HOME/.tool-versions
.
shell
set the version to an environment variable named ASDF_\${TOOL}_VERSION
, for the current shell session only.
local
writes the version to $PWD/.tool-versions
, creating it if needed.
See the .tool-versions
file in the Configuration section for details.
Alternatively
If you want to set a version only for the current shell session or for executing just a command under a particular tool version, you can set an environment variable like ASDF_\${TOOL}_VERSION
.
The following example runs tests on an Elixir project with version 1.4.0
. The version format is the same supported by the .tool-versions
file.
ASDF_ELIXIR_VERSION=1.4.0 mix test
To use the system version of tool <name>
instead of an asdf managed version you can set the version for the tool to system
.
Set system with either global
, local
or shell
as outlined in Set Current Version section above.
asdf local <name> system
+# asdf local python system
asdf current
+# asdf current
+# erlang 17.3 /Users/kim/.tool-versions
+# nodejs 6.11.5 /Users/kim/cool-node-project/.tool-versions
+
+asdf current <name>
+# asdf current erlang
+# erlang 17.3 /Users/kim/.tool-versions
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3
When asdf installs a package it creates shims for every executable program in that package in a $ASDF_DATA_DIR/shims
directory (default ~/.asdf/shims
). This directory being on the $PATH
(by means of asdf.sh
, asdf.fish
, etc) is how the installed programs are made available in the environment.
The shims themselves are really simple wrappers that exec
a helper program asdf exec
passing it the name of the plugin and path to the executable in the installed package that the shim is wrapping.
The asdf exec
helper determines the version of the package to use (as specified in .tool-versions
file, selected by asdf local ...
or asdf global ...
), the final path to the executable in the package installation directory (this can be manipulated by the exec-path
callback in the plugin) and the environment to execute in (also provided by the plugin - exec-env
script), and finally it executes it.
Note
Because this system uses exec
calls, any scripts in the package that are meant to be sourced by the shell instead of executed need to be accessed directly instead of via the shim wrapper. The two asdf
commands: which
and where
can help with this by returning the path to the installed package:
# returns path to main executable in current version
+source $(asdf which \${PLUGIN})/../script.sh
+
+# returns path to the package installation directory
+source $(asdf where \${PLUGIN})/bin/script.sh
If for some reason you want to by-pass asdf shims or want your environment variables automatically set upon entering your project's directory, the asdf-direnv plugin can be helpful. Be sure to check its README for more details.
`,45)]))}const c=i(n,[["render",l]]);export{g as __pageData,c as default}; diff --git a/assets/manage_versions.md.CAp-N8AZ.lean.js b/assets/manage_versions.md.CAp-N8AZ.lean.js new file mode 100644 index 00000000..669d576f --- /dev/null +++ b/assets/manage_versions.md.CAp-N8AZ.lean.js @@ -0,0 +1,30 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const g=JSON.parse('{"title":"Versions","description":"","frontmatter":{},"headers":[],"relativePath":"manage/versions.md","filePath":"manage/versions.md","lastUpdated":1687069487000}'),n={name:"manage/versions.md"};function l(h,s,p,k,r,d){return t(),a("div",null,s[0]||(s[0]=[e(`asdf install <name> <version>
+# asdf install erlang 17.3
If a plugin supports downloading & compiling from source, you can specify ref:foo
where foo
is a specific branch, tag, or commit. You'll need to use the same name and reference when uninstalling too.
asdf install <name> latest
+# asdf install erlang latest
Install latest stable version that begins with a given string.
asdf install <name> latest:<version>
+# asdf install erlang latest:17
asdf list <name>
+# asdf list erlang
Filter versions to those that begin with a given string.
asdf list <name> <version>
+# asdf list erlang 17
asdf list all <name>
+# asdf list all erlang
Filter versions to those that begin with a given string.
asdf list all <name> <version>
+# asdf list all erlang 17
asdf latest <name>
+# asdf latest erlang
Show latest stable version that begins with a given string.
asdf latest <name> <version>
+# asdf latest erlang 17
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest
global
writes the version to $HOME/.tool-versions
.
shell
set the version to an environment variable named ASDF_\${TOOL}_VERSION
, for the current shell session only.
local
writes the version to $PWD/.tool-versions
, creating it if needed.
See the .tool-versions
file in the Configuration section for details.
Alternatively
If you want to set a version only for the current shell session or for executing just a command under a particular tool version, you can set an environment variable like ASDF_\${TOOL}_VERSION
.
The following example runs tests on an Elixir project with version 1.4.0
. The version format is the same supported by the .tool-versions
file.
ASDF_ELIXIR_VERSION=1.4.0 mix test
To use the system version of tool <name>
instead of an asdf managed version you can set the version for the tool to system
.
Set system with either global
, local
or shell
as outlined in Set Current Version section above.
asdf local <name> system
+# asdf local python system
asdf current
+# asdf current
+# erlang 17.3 /Users/kim/.tool-versions
+# nodejs 6.11.5 /Users/kim/cool-node-project/.tool-versions
+
+asdf current <name>
+# asdf current erlang
+# erlang 17.3 /Users/kim/.tool-versions
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3
When asdf installs a package it creates shims for every executable program in that package in a $ASDF_DATA_DIR/shims
directory (default ~/.asdf/shims
). This directory being on the $PATH
(by means of asdf.sh
, asdf.fish
, etc) is how the installed programs are made available in the environment.
The shims themselves are really simple wrappers that exec
a helper program asdf exec
passing it the name of the plugin and path to the executable in the installed package that the shim is wrapping.
The asdf exec
helper determines the version of the package to use (as specified in .tool-versions
file, selected by asdf local ...
or asdf global ...
), the final path to the executable in the package installation directory (this can be manipulated by the exec-path
callback in the plugin) and the environment to execute in (also provided by the plugin - exec-env
script), and finally it executes it.
Note
Because this system uses exec
calls, any scripts in the package that are meant to be sourced by the shell instead of executed need to be accessed directly instead of via the shim wrapper. The two asdf
commands: which
and where
can help with this by returning the path to the installed package:
# returns path to main executable in current version
+source $(asdf which \${PLUGIN})/../script.sh
+
+# returns path to the package installation directory
+source $(asdf where \${PLUGIN})/bin/script.sh
If for some reason you want to by-pass asdf shims or want your environment variables automatically set upon entering your project's directory, the asdf-direnv plugin can be helpful. Be sure to check its README for more details.
`,45)]))}const c=i(n,[["render",l]]);export{g as __pageData,c as default}; diff --git a/assets/more_community-projects.md.B9Jb3CEv.js b/assets/more_community-projects.md.B9Jb3CEv.js new file mode 100644 index 00000000..25cd5d2b --- /dev/null +++ b/assets/more_community-projects.md.B9Jb3CEv.js @@ -0,0 +1 @@ +import{_ as t,c as o,a2 as r,o as a}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"Community Projects","description":"","frontmatter":{},"headers":[],"relativePath":"more/community-projects.md","filePath":"more/community-projects.md","lastUpdated":1687069487000}'),s={name:"more/community-projects.md"};function c(n,e,i,m,d,l){return a(),o("div",null,e[0]||(e[0]=[r('Here are some community projects related to asdf
:
Note
asdf core team do not own these projects or their code. asdf core are not responsible for the quality or security as they relate to those listed here.
Here are some community projects related to asdf
:
Note
asdf core team do not own these projects or their code. asdf core are not responsible for the quality or security as they relate to those listed here.
Here are some common questions regarding asdf
.
WSL1 (Windows Subsystem for Linux 1) is not officially supported. Some aspects of asdf
may not work properly. We do not intend to add official support for WSL1.
WSL2 (Windows Subsystem for Linux 2) should work using the setup & dependency instructions for you chosen WSL distro.
Importantly, WSL2 is only expected to work properly when the current working directory is a Unix drive and not a bound Windows drive.
We intend to run out test suite on WSL2 when host runner support is available on GitHub Actions, currently this does not appear to be the case.
I just
npm install -g yarn
, but cannot executeyarn
. What gives?
asdf
uses shims to manage executables. Those installed by plugins have shims automatically created, whereas installing executables via an asdf
managed tool will require you to notify asdf
of the need to create shims. In this instance, to create a shim for Yarn. See the asdf reshim
command docs.
If asdf reshim
is not resolving your issue, then it is most-likely due to the sourcing of asdf.sh
or asdf.fish
not being at the BOTTOM of your Shell config file (.bash_profile
, .zshrc
, config.fish
etc). It needs to be sourced AFTER you have set your $PATH
and AFTER you have sourced your framework (oh-my-zsh etc) if any.
Here are some common questions regarding asdf
.
WSL1 (Windows Subsystem for Linux 1) is not officially supported. Some aspects of asdf
may not work properly. We do not intend to add official support for WSL1.
WSL2 (Windows Subsystem for Linux 2) should work using the setup & dependency instructions for you chosen WSL distro.
Importantly, WSL2 is only expected to work properly when the current working directory is a Unix drive and not a bound Windows drive.
We intend to run out test suite on WSL2 when host runner support is available on GitHub Actions, currently this does not appear to be the case.
I just
npm install -g yarn
, but cannot executeyarn
. What gives?
asdf
uses shims to manage executables. Those installed by plugins have shims automatically created, whereas installing executables via an asdf
managed tool will require you to notify asdf
of the need to create shims. In this instance, to create a shim for Yarn. See the asdf reshim
command docs.
If asdf reshim
is not resolving your issue, then it is most-likely due to the sourcing of asdf.sh
or asdf.fish
not being at the BOTTOM of your Shell config file (.bash_profile
, .zshrc
, config.fish
etc). It needs to be sourced AFTER you have set your $PATH
and AFTER you have sourced your framework (oh-my-zsh etc) if any.
Thank you page to the asdf authors & contributors!
Me (@HashNuke), High-fever, cold, cough.
Copyright 2014 to the end of time (MIT License)
See the list of contributors 🙏 on GitHub
',9)]))}const b=a(s,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/more_thanks.md.C4xnnmzS.lean.js b/assets/more_thanks.md.C4xnnmzS.lean.js new file mode 100644 index 00000000..3e4b73f1 --- /dev/null +++ b/assets/more_thanks.md.C4xnnmzS.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,a2 as r,o}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"Thanks","description":"","frontmatter":{},"headers":[],"relativePath":"more/thanks.md","filePath":"more/thanks.md","lastUpdated":1671778129000}'),s={name:"more/thanks.md"};function n(h,e,i,l,u,c){return o(),t("div",null,e[0]||(e[0]=[r('Thank you page to the asdf authors & contributors!
Me (@HashNuke), High-fever, cold, cough.
Copyright 2014 to the end of time (MIT License)
See the list of contributors 🙏 on GitHub
',9)]))}const b=a(s,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/plugins_create.md.Ba4Peca-.js b/assets/plugins_create.md.Ba4Peca-.js new file mode 100644 index 00000000..0a519495 --- /dev/null +++ b/assets/plugins_create.md.Ba4Peca-.js @@ -0,0 +1,35 @@ +import{_ as n,c as o,a2 as l,j as s,a as e,G as a,B as p,o as d}from"./chunks/framework.C9NVOr0y.js";const T=JSON.parse('{"title":"Create a Plugin","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/create.md","filePath":"plugins/create.md","lastUpdated":1704804447000}'),r={name:"plugins/create.md"},h={tabindex:"0"},c={style:{"text-align":"left"}},g={style:{"text-align":"left"}},u={style:{"text-align":"left"}},k={style:{"text-align":"left"}},b={id:"bin-list-all",tabindex:"-1"},m={id:"bin-download",tabindex:"-1"},f={id:"bin-install",tabindex:"-1"},y={id:"bin-latest-stable",tabindex:"-1"},F={id:"extension-commands-for-asdf-cli",tabindex:"-1"},v={id:"custom-shim-templates",tabindex:"-1"};function E(A,i,C,x,_,S){const t=p("Badge");return d(),o("div",null,[i[48]||(i[48]=l('A plugin is a Git repo with some executable scripts to support versioning a language / tool. These scripts are run by asdf using specific commands to support features such as asdf list-all <name>
, asdf install <name> <version>
etc.
There are two options to get started with creating your own plugin:
asdf-<tool_name>
) with default scripts implemented. Once generated, clone the repo and run the setup.bash
script to interactively update the template.asdf-<tool_name>
and implement the required scripts as listed in the documentation below.asdf
commandssort -V
. See our asdf core list of banned commandsThe full list of scripts callable from asdf.
',9)),s("table",h,[i[25]||(i[25]=s("thead",null,[s("tr",null,[s("th",{style:{"text-align":"left"}},"Script"),s("th",{style:{"text-align":"left"}},"Description")])],-1)),s("tbody",null,[s("tr",null,[s("td",c,[i[0]||(i[0]=s("a",{href:"#bin-list-all"},"bin/list-all",-1)),i[1]||(i[1]=e()),a(t,{type:"tip",text:"required",vertical:"middle"})]),i[2]||(i[2]=s("td",{style:{"text-align":"left"}},"List all installable versions",-1))]),s("tr",null,[s("td",g,[i[3]||(i[3]=s("a",{href:"#bin-download"},"bin/download",-1)),i[4]||(i[4]=e()),a(t,{type:"tip",text:"required",vertical:"middle"})]),i[5]||(i[5]=s("td",{style:{"text-align":"left"}},"Download source code or binary for the specified version",-1))]),s("tr",null,[s("td",u,[i[6]||(i[6]=s("a",{href:"#bin-install"},"bin/install",-1)),i[7]||(i[7]=e()),a(t,{type:"tip",text:"required",vertical:"middle"})]),i[8]||(i[8]=s("td",{style:{"text-align":"left"}},"Installs the specified version",-1))]),s("tr",null,[s("td",k,[i[9]||(i[9]=s("a",{href:"#bin-latest-stable"},"bin/latest-stable",-1)),i[10]||(i[10]=e()),a(t,{type:"warning",text:"recommended",vertical:"middle"})]),i[11]||(i[11]=s("td",{style:{"text-align":"left"}},"List the latest stable version of the specified tool",-1))]),i[12]||(i[12]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-help.overview"},"bin/help.overview")]),s("td",{style:{"text-align":"left"}},"Output a general description about the plugin & tool")],-1)),i[13]||(i[13]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-help.deps"},"bin/help.deps")]),s("td",{style:{"text-align":"left"}},"Output a list of dependencies per Operating System")],-1)),i[14]||(i[14]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-help.config"},"bin/help.config")]),s("td",{style:{"text-align":"left"}},"Output plugin or tool configuration information")],-1)),i[15]||(i[15]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-help.links"},"bin/help.links")]),s("td",{style:{"text-align":"left"}},"Output a list of links for the plugin or tool")],-1)),i[16]||(i[16]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-list-bin-paths"},"bin/list-bin-paths")]),s("td",{style:{"text-align":"left"}},"List relative paths to directories with binaries to create shims")],-1)),i[17]||(i[17]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-exec-env"},"bin/exec-env")]),s("td",{style:{"text-align":"left"}},"Prepare the environment for running the binaries")],-1)),i[18]||(i[18]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-exec-path"},"bin/exec-path")]),s("td",{style:{"text-align":"left"}},"Output the executable path for a version of a tool")],-1)),i[19]||(i[19]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-uninstall"},"bin/uninstall")]),s("td",{style:{"text-align":"left"}},"Uninstall a specific version of a tool")],-1)),i[20]||(i[20]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-list-legacy-filenames"},"bin/list-legacy-filenames")]),s("td",{style:{"text-align":"left"}},[e("Output filenames of legacy version files: "),s("code",null,".ruby-version")])],-1)),i[21]||(i[21]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-parse-legacy-file"},"bin/parse-legacy-file")]),s("td",{style:{"text-align":"left"}},"Custom parser for legacy version files")],-1)),i[22]||(i[22]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-post-plugin-add"},"bin/post-plugin-add")]),s("td",{style:{"text-align":"left"}},"Hook to execute after a plugin has been added")],-1)),i[23]||(i[23]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-post-plugin-update"},"bin/post-plugin-update")]),s("td",{style:{"text-align":"left"}},"Hook to execute after a plugin has been updated")],-1)),i[24]||(i[24]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-pre-plugin-remove"},"bin/pre-plugin-remove")]),s("td",{style:{"text-align":"left"}},"Hook to execute before a plugin is removed")],-1))])]),i[49]||(i[49]=l('To see which commands invoke which scripts, see the detailed documentation for each script.
The full list of Environment Variables used throughout all scripts.
Environment Variables | Description |
---|---|
ASDF_INSTALL_TYPE | version or ref |
ASDF_INSTALL_VERSION | full version number or Git Ref depending on ASDF_INSTALL_TYPE |
ASDF_INSTALL_PATH | the path to where the tool should, or has been installed |
ASDF_CONCURRENCY | the number of cores to use when compiling the source code. Useful for setting make -j |
ASDF_DOWNLOAD_PATH | the path to where the source code or binary was downloaded to by bin/download |
ASDF_PLUGIN_PATH | the path the plugin was installed |
ASDF_PLUGIN_SOURCE_URL | the source URL of the plugin |
ASDF_PLUGIN_PREV_REF | prevous git-ref of the plugin repo |
ASDF_PLUGIN_POST_REF | updated git-ref of the plugin repo |
ASDF_CMD_FILE | resolves to the full path of the file being sourced |
NOTE
Not all environment variables are available in all scripts. Check the documentation for each script below to see which env vars are available to it.
Description
List all installable versions.
Output Format
Must print a string with a space-separated list of versions. For example:
1.0.1 1.0.2 1.3.0 1.4
Newest version should be last.
asdf core will print each version on its own line, potentially pushing some versions offscreen.
Sorting
If versions are being pulled from releases page on a website it's recommended to leave the versions in the provided order as they are often already in the correct order. If they are in reverse order piping them through tac
should suffice.
If sorting is unavoidable, sort -V
is not portable, so we suggest either:
v2.18.0
)sed
, sort
& awk
)Environment Variables available to script
No environment variables are provided to this script.
Commands that invoke this script
asdf list all <name> [version]
asdf list all nodejs
: lists all versions as returned by this script, one on each line.asdf list all nodejs 18
: lists all versions as returned by this script, one on each line, with a filter matching any version beginning with 18
applied.Call signature from asdf core
No parameters provided.
"${plugin_path}/bin/list-all"
Description
Download the source code or binary for a specific version of a tool to a specified location.
Implementation Details
ASDF_DOWNLOAD_PATH
.ASDF_DOWNLOAD_PATH
directory.ASDF_DOWNLOAD_PATH
.0
.Legacy Plugins
Though this script is marked as required for all plugins, it is optional for "legacy" plugins which predate its introduction.
If this script is absent, asdf will assume that the bin/install
script is present and will download and install the version.
All plugins must include this script as support for legacy plugins will eventually be removed.
Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.ASDF_DOWNLOAD_PATH
: The path to where the source code or binary was downloaded to.Commands that invoke this script
asdf install <tool> [version]
asdf install <tool> latest[:version]
asdf install nodejs 18.0.0
: downloads the source code or binary for Node.js version 18.0.0
and places it in the ASDF_DOWNLOAD_PATH
directory. Then runs the bin/install
script.Call signature from asdf core
No parameters provided.
"${plugin_path}"/bin/download
Description
Install a specific version of a tool to a specified location.
Implementation Details
ASDF_INSTALL_PATH
.$ASDF_INSTALL_PATH/bin
. This behaviour can be customised with the optional bin/list-bin-paths script.0
.ASDF_INSTALL_PATH
once the build and installation of the tool is deemed a success.Legacy Plugins
If the bin/download
script is absent, this script should download and install the specified version.
For compatibility with versions of the asdf core earlier than 0.7._
and newer than 0.8._
, check for the presence of the ASDF_DOWNLOAD_PATH
environment variable. If set, assume the bin/download
script already downloaded the version, else download the source code in the bin/install
script.
Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.ASDF_CONCURRENCY
: The number of cores to use when compiling source code. Useful for setting flags like make -j
.ASDF_DOWNLOAD_PATH
: The path where the source code or binary was downloaded to.Commands that invoke this script
asdf install
asdf install <tool>
asdf install <tool> [version]
asdf install <tool> latest[:version]
asdf install nodejs 18.0.0
: installs Node.js version 18.0.0
in the ASDF_INSTALL_PATH
directory.Call signature from asdf core
No parameters provided.
"${plugin_path}"/bin/install
Description
Determine the latest stable version of a tool. If absent, the asdf core will tail
the bin/list-all
output which may be undesirable.
Implementation Details
asdf list all ruby
from the ruby plugin lists versions of Ruby from many providers: jruby
, rbx
& truffleruby
amongst others. The user provided filter could be used by the plugin to filter the semver versions and/or provider.> asdf latest ruby\n3.2.2\n> asdf latest ruby 2\n2.7.8\n> asdf latest ruby truffleruby\ntruffleruby+graalvm-22.3.1
0
.Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.Commands that invoke this script
asdf global <tool> latest
: set the global version of a tool to the latest stable version for that tool.asdf local <name> latest
: set the local version of a tool to the latest stable version for that tool.asdf install <tool> latest
: installs the latest version of a tool.asdf latest <tool> [<version>]
: outputs the latest version of a tool based on the optional filter.asdf latest --all
: outputs the latest version of all tools managed by asdf and whether they are installed.Call signature from asdf core
The script should accept a single argument, the filter query.
"${plugin_path}"/bin/latest-stable "$query"
bin/help.overview
Description
Output a general description about the plugin and the tool being managed.
Implementation Details
ASDF_INSTALL_VERSION
and ASDF_INSTALL_TYPE
).0
.Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.Commands that invoke this script
asdf help <name> [<version>]
: Output documentation for plugin and toolCall signature from asdf core
"${plugin_path}"/bin/help.overview
bin/help.deps
Description
Output the list of dependencies tailored to the operating system. One dependency per line.
git\ncurl\nsed
Implementation Details
bin/help.overview
for its output to be considered.ASDF_INSTALL_VERSION
and ASDF_INSTALL_TYPE
).0
.Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.Commands that invoke this script
asdf help <name> [<version>]
: Output documentation for plugin and toolCall signature from asdf core
"${plugin_path}"/bin/help.deps
bin/help.config
Description
Output any required or optional configuration for the plugin and tool. For example, describe any environment variables or other flags needed to install or compile the tool.
Implementation Details
bin/help.overview
for its output to be considered.ASDF_INSTALL_VERSION
and ASDF_INSTALL_TYPE
).0
.Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.Commands that invoke this script
asdf help <name> [<version>]
: Output documentation for plugin and toolCall signature from asdf core
"${plugin_path}"/bin/help.config
bin/help.links
Description
Output a list of links relevant to the plugin and tool. One link per line.
Git Repository: https://github.com/vlang/v\nDocumentation: https://vlang.io
Implementation Details
bin/help.overview
for its output to be considered.<title>: <link>
<link>
ASDF_INSTALL_VERSION
and ASDF_INSTALL_TYPE
).0
.Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.Commands that invoke this script
asdf help <name> [<version>]
: Output documentation for plugin and toolCall signature from asdf core
"${plugin_path}"/bin/help.links
bin/list-bin-paths
Description
List directories containing executables for the specified version of the tool.
Implementation Details
"${ASDF_INSTALL_PATH}"/bin
directory & create shims for those.ASDF_INSTALL_PATH
. Example output would be:bin tools veggies
This will instruct asdf to create shims for the files in:
"${ASDF_INSTALL_PATH}"/bin
"${ASDF_INSTALL_PATH}"/tools
"${ASDF_INSTALL_PATH}"/veggies
Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.Commands that invoke this script
asdf install <tool> [version]
: initially create shims for binaries.asdf reshim <tool> <version>
: recreate shims for binaries.Call signature from asdf core
"${plugin_path}/bin/list-bin-paths"
bin/exec-env
Description
Prepare the environment before executing the shims for the binaries for the tool.
Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.Commands that invoke this script
asdf which <command>
: Display the path to an executableasdf exec <command> [args...]
: Executes the command shim for current versionasdf env <command> [util]
: Runs util (default: env
) inside the environment used for command shim execution.Call signature from asdf core
"${plugin_path}/bin/exec-env"
bin/exec-path
Get the executable path for the specified version of the tool. Must print a string with the relative executable path. This allows the plugin to conditionally override the shim's specified executable path, otherwise return the default path specified by the shim.
Description
Get the executable path for the specified version of the tool.
Implementation Details
Usage:\n plugin/bin/exec-path <install-path> <command> <executable-path>\n\nExample Call:\n ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"\n\nOutput:\n bin/foox
Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.Commands that invoke this script
asdf which <command>
: Display the path to an executableasdf exec <command> [args...]
: Executes the command shim for current versionasdf env <command> [util]
: Runs util (default: env
) inside the environment used for command shim execution.Call signature from asdf core
"${plugin_path}/bin/exec-path" "$install_path" "$cmd" "$relative_path"
bin/uninstall
Description
Uninstall the provided version of a tool.
Output Format
Output should be sent to stdout
or stderr
as appropriate for the user. No output is read by subsequent execution in the core.
Environment Variables available to script
No environment variables are provided to this script.
Commands that invoke this script
asdf list all <name> <version>
asdf uninstall nodejs 18.15.0
: Uninstalls the version 18.15.0
of nodejs, removing all shims including those installed global with npm i -g
Call signature from asdf core
No parameters provided.
"${plugin_path}/bin/uninstall"
bin/list-legacy-filenames
Description
List legacy configuration filenames for determining the specified version of the tool.
Implementation Details
.ruby-version .rvmrc
legacy_version_file
option in their "${HOME}"/.asdfrc
.Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.Commands that invoke this script
Any command which reads a tool version.
Call signature from asdf core
No parameters provided.
"${plugin_path}/bin/list-legacy-filenames"
bin/parse-legacy-file
Description
Parse the legacy file found by asdf to determine the version of the tool. Useful to extract version numbers from files like JavaScript's package.json
or Golangs go.mod
.
Implementation Details
cat
the legacy file to determine the version.1.2.3
Environment Variables available to script
No environment variables specifically set before this script is called.
Commands that invoke this script
Any command which reads a tool version.
Call signature from asdf core
The script should accept a single argument, the path to the legacy file for reading its contents.
"${plugin_path}/bin/parse-legacy-file" "$file_path"
bin/post-plugin-add
Description
Execute this callback script after the plugin has been added to asdf with asdf plugin add <tool>
.
See also the related command hooks:
pre_asdf_plugin_add
pre_asdf_plugin_add_${plugin_name}
post_asdf_plugin_add
post_asdf_plugin_add_${plugin_name}
Environment Variables available to script
ASDF_PLUGIN_PATH
: path where the plugin was installed.ASDF_PLUGIN_SOURCE_URL
: URL of the plugin source. Can be a local directory path.Call signature from asdf core
No parameters provided.
"${plugin_path}/bin/post-plugin-add"
bin/post-plugin-update
Description
Execute this callback script after asdf has downloaded the update plugin with asdf plugin update <tool> [<git-ref>]
.
See also the related command hooks:
pre_asdf_plugin_update
pre_asdf_plugin_update_${plugin_name}
post_asdf_plugin_update
post_asdf_plugin_update_${plugin_name}
Environment Variables available to script
ASDF_PLUGIN_PATH
: path where the plugin was installed.ASDF_PLUGIN_PREV_REF
: the plugin's previous git-refASDF_PLUGIN_POST_REF
: the plugin's updated git-refCall signature from asdf core
No parameters provided.
"${plugin_path}/bin/post-plugin-update"
bin/pre-plugin-remove
Description
Execute this callback script before asdf has removed the plugin with asdf plugin remove <tool>
.
See also the related command hooks:
pre_asdf_plugin_remove
pre_asdf_plugin_remove_${plugin_name}
post_asdf_plugin_remove
post_asdf_plugin_remove_${plugin_name}
Environment Variables available to script
ASDF_PLUGIN_PATH
: path where the plugin was installed.Call signature from asdf core
No parameters provided.
"${plugin_path}/bin/pre-plugin-remove"
It's possible for plugins to define new asdf commands by providing lib/commands/command*.bash
scripts or executables that will be callable using the asdf command line interface by using the plugin name as a subcommand.
For example, suppose a foo
plugin has:
foo/\n lib/commands/\n command.bash\n command-bat.bash\n command-bat-man.bash\n command-help.bash
Users can now execute:
$ asdf foo # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash`\n$ asdf foo bar # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar`\n$ asdf foo help # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash`\n$ asdf foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash`\n$ asdf foo bat baz # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz`
Plugin authors can use this feature to provide utilities related to their tools, or even create plugins that are just new command extensions of asdf itself.
If the executable bit is set, the script is executed, replacing the asdf execution.
If the executable bit is not set, asdf will source the scripts as Bash scripts.
$ASDF_CMD_FILE
resolves to the full path of the file being sourced.
haxe
is a great example of a plugin which uses this feature. It provides the asdf haxe neko-dylibs-link
to fix an issue where Haxe executables expect to find dynamic libraries relative to the executable directory.
Be sure to list your asdf Extension Commands in your plugins README.
',11)),s("h2",v,[i[45]||(i[45]=e("Custom Shim Templates ")),a(t,{type:"danger",text:"advanced",vertical:"middle"}),i[46]||(i[46]=e()),i[47]||(i[47]=s("a",{class:"header-anchor",href:"#custom-shim-templates","aria-label":'Permalink to "Custom Shim TemplatesWARNING
Please only use if absolutely required
asdf allows custom shim templates. For an executable called foo
, if there's a shims/foo
file in the plugin, then asdf will copy that file instead of using its standard shim template.
This must be used wisely.
As far as the asdf core team is aware, this feature is only in use in the first-party Elixir plugin. This is because an executable is also read as an Elixir file in addition to being an executable. This makes it not possible to use the standard Bash shim.
asdf
contains the plugin-test
command to test your plugin:
asdf plugin test <plugin_name> <plugin_url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git_ref>] [test_command...]
<plugin_name>
& <plugin_url>
are required[--asdf-tool-version <version>]
is specified, the tool will be installed with that specific version. Defaults to asdf latest <plugin-name>
[--asdf-plugin-gitref <git_ref>]
is specified, the plugin itself is checked out at that commit/branch/tag. This is useful for testing a pull-request on your plugin's CI. Defaults to the default branch of the plugin's repository.[test_command...]
is the command to execute to validate the installed tool works correctly. Typically <tool> --version
or <tool> --help
. For example, to test the NodeJS plugin, we could run# asdf plugin test <plugin_name> <plugin_url> [test_command]
+ asdf plugin test nodejs https://github.com/asdf-vm/asdf-nodejs.git node --version
Note
We recommend testing in both Linux & macOS CI environments
The asdf-vm/actions repo provides a GitHub Action for testing your plugins hosted on GitHub. A sample .github/workflows/test.yaml
Actions Workflow:
name: Test
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+
+jobs:
+ plugin_test:
+ name: asdf plugin test
+ strategy:
+ matrix:
+ os:
+ - ubuntu-latest
+ - macos-latest
+ runs-on: \${{ matrix.os }}
+ steps:
+ - name: asdf_plugin_test
+ uses: asdf-vm/actions/plugin-test@v2
+ with:
+ command: "<MY_TOOL> --version"
A sample .travis.yml
file, customize it to your needs
language: c
+script: asdf plugin test <MY_TOOL> $TRAVIS_BUILD_DIR '<MY_TOOL> --version'
+before_script:
+ - git clone https://github.com/asdf-vm/asdf.git asdf
+ - . asdf/asdf.sh
+os:
+ - linux
+ - osx
NOTE
When using another CI you may need to pass a relative path to the plugin location:
asdf plugin test <tool_name> <path> '<tool_command> --version'
If a command depends on accessing an external API, like bin/list-all
or bin/latest-stable
, it may experience rate limiting during automated testing. To mitigate this, ensure there is a code-path which provides an authentication token via an environment variable. For example:
cmd="curl --silent"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"
GITHUB_API_TOKEN
To utilise the GITHUB_API_TOKEN
, create a new personal token with only public_repo
access.
Then add this to your CI pipeline environment variables.
WARNING
NEVER publish your authentication tokens in your code repository
TIP
The recommended installation method for a plugin is via direct URL installation:
# asdf plugin add <name> <git_url>
+ asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs
If the git_url
is not provided, asdf will use the Shortname Index repository to determine the exact git_url
to use.
You can add your plugin to the Shortname Index by following the instructions in that repo.
`,27))])}const L=n(r,[["render",E]]);export{T as __pageData,L as default}; diff --git a/assets/plugins_create.md.Ba4Peca-.lean.js b/assets/plugins_create.md.Ba4Peca-.lean.js new file mode 100644 index 00000000..0a519495 --- /dev/null +++ b/assets/plugins_create.md.Ba4Peca-.lean.js @@ -0,0 +1,35 @@ +import{_ as n,c as o,a2 as l,j as s,a as e,G as a,B as p,o as d}from"./chunks/framework.C9NVOr0y.js";const T=JSON.parse('{"title":"Create a Plugin","description":"","frontmatter":{},"headers":[],"relativePath":"plugins/create.md","filePath":"plugins/create.md","lastUpdated":1704804447000}'),r={name:"plugins/create.md"},h={tabindex:"0"},c={style:{"text-align":"left"}},g={style:{"text-align":"left"}},u={style:{"text-align":"left"}},k={style:{"text-align":"left"}},b={id:"bin-list-all",tabindex:"-1"},m={id:"bin-download",tabindex:"-1"},f={id:"bin-install",tabindex:"-1"},y={id:"bin-latest-stable",tabindex:"-1"},F={id:"extension-commands-for-asdf-cli",tabindex:"-1"},v={id:"custom-shim-templates",tabindex:"-1"};function E(A,i,C,x,_,S){const t=p("Badge");return d(),o("div",null,[i[48]||(i[48]=l('A plugin is a Git repo with some executable scripts to support versioning a language / tool. These scripts are run by asdf using specific commands to support features such as asdf list-all <name>
, asdf install <name> <version>
etc.
There are two options to get started with creating your own plugin:
asdf-<tool_name>
) with default scripts implemented. Once generated, clone the repo and run the setup.bash
script to interactively update the template.asdf-<tool_name>
and implement the required scripts as listed in the documentation below.asdf
commandssort -V
. See our asdf core list of banned commandsThe full list of scripts callable from asdf.
',9)),s("table",h,[i[25]||(i[25]=s("thead",null,[s("tr",null,[s("th",{style:{"text-align":"left"}},"Script"),s("th",{style:{"text-align":"left"}},"Description")])],-1)),s("tbody",null,[s("tr",null,[s("td",c,[i[0]||(i[0]=s("a",{href:"#bin-list-all"},"bin/list-all",-1)),i[1]||(i[1]=e()),a(t,{type:"tip",text:"required",vertical:"middle"})]),i[2]||(i[2]=s("td",{style:{"text-align":"left"}},"List all installable versions",-1))]),s("tr",null,[s("td",g,[i[3]||(i[3]=s("a",{href:"#bin-download"},"bin/download",-1)),i[4]||(i[4]=e()),a(t,{type:"tip",text:"required",vertical:"middle"})]),i[5]||(i[5]=s("td",{style:{"text-align":"left"}},"Download source code or binary for the specified version",-1))]),s("tr",null,[s("td",u,[i[6]||(i[6]=s("a",{href:"#bin-install"},"bin/install",-1)),i[7]||(i[7]=e()),a(t,{type:"tip",text:"required",vertical:"middle"})]),i[8]||(i[8]=s("td",{style:{"text-align":"left"}},"Installs the specified version",-1))]),s("tr",null,[s("td",k,[i[9]||(i[9]=s("a",{href:"#bin-latest-stable"},"bin/latest-stable",-1)),i[10]||(i[10]=e()),a(t,{type:"warning",text:"recommended",vertical:"middle"})]),i[11]||(i[11]=s("td",{style:{"text-align":"left"}},"List the latest stable version of the specified tool",-1))]),i[12]||(i[12]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-help.overview"},"bin/help.overview")]),s("td",{style:{"text-align":"left"}},"Output a general description about the plugin & tool")],-1)),i[13]||(i[13]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-help.deps"},"bin/help.deps")]),s("td",{style:{"text-align":"left"}},"Output a list of dependencies per Operating System")],-1)),i[14]||(i[14]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-help.config"},"bin/help.config")]),s("td",{style:{"text-align":"left"}},"Output plugin or tool configuration information")],-1)),i[15]||(i[15]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-help.links"},"bin/help.links")]),s("td",{style:{"text-align":"left"}},"Output a list of links for the plugin or tool")],-1)),i[16]||(i[16]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-list-bin-paths"},"bin/list-bin-paths")]),s("td",{style:{"text-align":"left"}},"List relative paths to directories with binaries to create shims")],-1)),i[17]||(i[17]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-exec-env"},"bin/exec-env")]),s("td",{style:{"text-align":"left"}},"Prepare the environment for running the binaries")],-1)),i[18]||(i[18]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-exec-path"},"bin/exec-path")]),s("td",{style:{"text-align":"left"}},"Output the executable path for a version of a tool")],-1)),i[19]||(i[19]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-uninstall"},"bin/uninstall")]),s("td",{style:{"text-align":"left"}},"Uninstall a specific version of a tool")],-1)),i[20]||(i[20]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-list-legacy-filenames"},"bin/list-legacy-filenames")]),s("td",{style:{"text-align":"left"}},[e("Output filenames of legacy version files: "),s("code",null,".ruby-version")])],-1)),i[21]||(i[21]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-parse-legacy-file"},"bin/parse-legacy-file")]),s("td",{style:{"text-align":"left"}},"Custom parser for legacy version files")],-1)),i[22]||(i[22]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-post-plugin-add"},"bin/post-plugin-add")]),s("td",{style:{"text-align":"left"}},"Hook to execute after a plugin has been added")],-1)),i[23]||(i[23]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-post-plugin-update"},"bin/post-plugin-update")]),s("td",{style:{"text-align":"left"}},"Hook to execute after a plugin has been updated")],-1)),i[24]||(i[24]=s("tr",null,[s("td",{style:{"text-align":"left"}},[s("a",{href:"#bin-pre-plugin-remove"},"bin/pre-plugin-remove")]),s("td",{style:{"text-align":"left"}},"Hook to execute before a plugin is removed")],-1))])]),i[49]||(i[49]=l('To see which commands invoke which scripts, see the detailed documentation for each script.
The full list of Environment Variables used throughout all scripts.
Environment Variables | Description |
---|---|
ASDF_INSTALL_TYPE | version or ref |
ASDF_INSTALL_VERSION | full version number or Git Ref depending on ASDF_INSTALL_TYPE |
ASDF_INSTALL_PATH | the path to where the tool should, or has been installed |
ASDF_CONCURRENCY | the number of cores to use when compiling the source code. Useful for setting make -j |
ASDF_DOWNLOAD_PATH | the path to where the source code or binary was downloaded to by bin/download |
ASDF_PLUGIN_PATH | the path the plugin was installed |
ASDF_PLUGIN_SOURCE_URL | the source URL of the plugin |
ASDF_PLUGIN_PREV_REF | prevous git-ref of the plugin repo |
ASDF_PLUGIN_POST_REF | updated git-ref of the plugin repo |
ASDF_CMD_FILE | resolves to the full path of the file being sourced |
NOTE
Not all environment variables are available in all scripts. Check the documentation for each script below to see which env vars are available to it.
Description
List all installable versions.
Output Format
Must print a string with a space-separated list of versions. For example:
1.0.1 1.0.2 1.3.0 1.4
Newest version should be last.
asdf core will print each version on its own line, potentially pushing some versions offscreen.
Sorting
If versions are being pulled from releases page on a website it's recommended to leave the versions in the provided order as they are often already in the correct order. If they are in reverse order piping them through tac
should suffice.
If sorting is unavoidable, sort -V
is not portable, so we suggest either:
v2.18.0
)sed
, sort
& awk
)Environment Variables available to script
No environment variables are provided to this script.
Commands that invoke this script
asdf list all <name> [version]
asdf list all nodejs
: lists all versions as returned by this script, one on each line.asdf list all nodejs 18
: lists all versions as returned by this script, one on each line, with a filter matching any version beginning with 18
applied.Call signature from asdf core
No parameters provided.
"${plugin_path}/bin/list-all"
Description
Download the source code or binary for a specific version of a tool to a specified location.
Implementation Details
ASDF_DOWNLOAD_PATH
.ASDF_DOWNLOAD_PATH
directory.ASDF_DOWNLOAD_PATH
.0
.Legacy Plugins
Though this script is marked as required for all plugins, it is optional for "legacy" plugins which predate its introduction.
If this script is absent, asdf will assume that the bin/install
script is present and will download and install the version.
All plugins must include this script as support for legacy plugins will eventually be removed.
Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.ASDF_DOWNLOAD_PATH
: The path to where the source code or binary was downloaded to.Commands that invoke this script
asdf install <tool> [version]
asdf install <tool> latest[:version]
asdf install nodejs 18.0.0
: downloads the source code or binary for Node.js version 18.0.0
and places it in the ASDF_DOWNLOAD_PATH
directory. Then runs the bin/install
script.Call signature from asdf core
No parameters provided.
"${plugin_path}"/bin/download
Description
Install a specific version of a tool to a specified location.
Implementation Details
ASDF_INSTALL_PATH
.$ASDF_INSTALL_PATH/bin
. This behaviour can be customised with the optional bin/list-bin-paths script.0
.ASDF_INSTALL_PATH
once the build and installation of the tool is deemed a success.Legacy Plugins
If the bin/download
script is absent, this script should download and install the specified version.
For compatibility with versions of the asdf core earlier than 0.7._
and newer than 0.8._
, check for the presence of the ASDF_DOWNLOAD_PATH
environment variable. If set, assume the bin/download
script already downloaded the version, else download the source code in the bin/install
script.
Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.ASDF_CONCURRENCY
: The number of cores to use when compiling source code. Useful for setting flags like make -j
.ASDF_DOWNLOAD_PATH
: The path where the source code or binary was downloaded to.Commands that invoke this script
asdf install
asdf install <tool>
asdf install <tool> [version]
asdf install <tool> latest[:version]
asdf install nodejs 18.0.0
: installs Node.js version 18.0.0
in the ASDF_INSTALL_PATH
directory.Call signature from asdf core
No parameters provided.
"${plugin_path}"/bin/install
Description
Determine the latest stable version of a tool. If absent, the asdf core will tail
the bin/list-all
output which may be undesirable.
Implementation Details
asdf list all ruby
from the ruby plugin lists versions of Ruby from many providers: jruby
, rbx
& truffleruby
amongst others. The user provided filter could be used by the plugin to filter the semver versions and/or provider.> asdf latest ruby\n3.2.2\n> asdf latest ruby 2\n2.7.8\n> asdf latest ruby truffleruby\ntruffleruby+graalvm-22.3.1
0
.Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.Commands that invoke this script
asdf global <tool> latest
: set the global version of a tool to the latest stable version for that tool.asdf local <name> latest
: set the local version of a tool to the latest stable version for that tool.asdf install <tool> latest
: installs the latest version of a tool.asdf latest <tool> [<version>]
: outputs the latest version of a tool based on the optional filter.asdf latest --all
: outputs the latest version of all tools managed by asdf and whether they are installed.Call signature from asdf core
The script should accept a single argument, the filter query.
"${plugin_path}"/bin/latest-stable "$query"
bin/help.overview
Description
Output a general description about the plugin and the tool being managed.
Implementation Details
ASDF_INSTALL_VERSION
and ASDF_INSTALL_TYPE
).0
.Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.Commands that invoke this script
asdf help <name> [<version>]
: Output documentation for plugin and toolCall signature from asdf core
"${plugin_path}"/bin/help.overview
bin/help.deps
Description
Output the list of dependencies tailored to the operating system. One dependency per line.
git\ncurl\nsed
Implementation Details
bin/help.overview
for its output to be considered.ASDF_INSTALL_VERSION
and ASDF_INSTALL_TYPE
).0
.Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.Commands that invoke this script
asdf help <name> [<version>]
: Output documentation for plugin and toolCall signature from asdf core
"${plugin_path}"/bin/help.deps
bin/help.config
Description
Output any required or optional configuration for the plugin and tool. For example, describe any environment variables or other flags needed to install or compile the tool.
Implementation Details
bin/help.overview
for its output to be considered.ASDF_INSTALL_VERSION
and ASDF_INSTALL_TYPE
).0
.Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.Commands that invoke this script
asdf help <name> [<version>]
: Output documentation for plugin and toolCall signature from asdf core
"${plugin_path}"/bin/help.config
bin/help.links
Description
Output a list of links relevant to the plugin and tool. One link per line.
Git Repository: https://github.com/vlang/v\nDocumentation: https://vlang.io
Implementation Details
bin/help.overview
for its output to be considered.<title>: <link>
<link>
ASDF_INSTALL_VERSION
and ASDF_INSTALL_TYPE
).0
.Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.Commands that invoke this script
asdf help <name> [<version>]
: Output documentation for plugin and toolCall signature from asdf core
"${plugin_path}"/bin/help.links
bin/list-bin-paths
Description
List directories containing executables for the specified version of the tool.
Implementation Details
"${ASDF_INSTALL_PATH}"/bin
directory & create shims for those.ASDF_INSTALL_PATH
. Example output would be:bin tools veggies
This will instruct asdf to create shims for the files in:
"${ASDF_INSTALL_PATH}"/bin
"${ASDF_INSTALL_PATH}"/tools
"${ASDF_INSTALL_PATH}"/veggies
Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.Commands that invoke this script
asdf install <tool> [version]
: initially create shims for binaries.asdf reshim <tool> <version>
: recreate shims for binaries.Call signature from asdf core
"${plugin_path}/bin/list-bin-paths"
bin/exec-env
Description
Prepare the environment before executing the shims for the binaries for the tool.
Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.Commands that invoke this script
asdf which <command>
: Display the path to an executableasdf exec <command> [args...]
: Executes the command shim for current versionasdf env <command> [util]
: Runs util (default: env
) inside the environment used for command shim execution.Call signature from asdf core
"${plugin_path}/bin/exec-env"
bin/exec-path
Get the executable path for the specified version of the tool. Must print a string with the relative executable path. This allows the plugin to conditionally override the shim's specified executable path, otherwise return the default path specified by the shim.
Description
Get the executable path for the specified version of the tool.
Implementation Details
Usage:\n plugin/bin/exec-path <install-path> <command> <executable-path>\n\nExample Call:\n ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"\n\nOutput:\n bin/foox
Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.Commands that invoke this script
asdf which <command>
: Display the path to an executableasdf exec <command> [args...]
: Executes the command shim for current versionasdf env <command> [util]
: Runs util (default: env
) inside the environment used for command shim execution.Call signature from asdf core
"${plugin_path}/bin/exec-path" "$install_path" "$cmd" "$relative_path"
bin/uninstall
Description
Uninstall the provided version of a tool.
Output Format
Output should be sent to stdout
or stderr
as appropriate for the user. No output is read by subsequent execution in the core.
Environment Variables available to script
No environment variables are provided to this script.
Commands that invoke this script
asdf list all <name> <version>
asdf uninstall nodejs 18.15.0
: Uninstalls the version 18.15.0
of nodejs, removing all shims including those installed global with npm i -g
Call signature from asdf core
No parameters provided.
"${plugin_path}/bin/uninstall"
bin/list-legacy-filenames
Description
List legacy configuration filenames for determining the specified version of the tool.
Implementation Details
.ruby-version .rvmrc
legacy_version_file
option in their "${HOME}"/.asdfrc
.Environment Variables available to script
ASDF_INSTALL_TYPE
: version
or ref
ASDF_INSTALL_VERSION
: ASDF_INSTALL_TYPE=version
.ASDF_INSTALL_TYPE=ref
.ASDF_INSTALL_PATH
: The path to where the tool has been, or should be installed.Commands that invoke this script
Any command which reads a tool version.
Call signature from asdf core
No parameters provided.
"${plugin_path}/bin/list-legacy-filenames"
bin/parse-legacy-file
Description
Parse the legacy file found by asdf to determine the version of the tool. Useful to extract version numbers from files like JavaScript's package.json
or Golangs go.mod
.
Implementation Details
cat
the legacy file to determine the version.1.2.3
Environment Variables available to script
No environment variables specifically set before this script is called.
Commands that invoke this script
Any command which reads a tool version.
Call signature from asdf core
The script should accept a single argument, the path to the legacy file for reading its contents.
"${plugin_path}/bin/parse-legacy-file" "$file_path"
bin/post-plugin-add
Description
Execute this callback script after the plugin has been added to asdf with asdf plugin add <tool>
.
See also the related command hooks:
pre_asdf_plugin_add
pre_asdf_plugin_add_${plugin_name}
post_asdf_plugin_add
post_asdf_plugin_add_${plugin_name}
Environment Variables available to script
ASDF_PLUGIN_PATH
: path where the plugin was installed.ASDF_PLUGIN_SOURCE_URL
: URL of the plugin source. Can be a local directory path.Call signature from asdf core
No parameters provided.
"${plugin_path}/bin/post-plugin-add"
bin/post-plugin-update
Description
Execute this callback script after asdf has downloaded the update plugin with asdf plugin update <tool> [<git-ref>]
.
See also the related command hooks:
pre_asdf_plugin_update
pre_asdf_plugin_update_${plugin_name}
post_asdf_plugin_update
post_asdf_plugin_update_${plugin_name}
Environment Variables available to script
ASDF_PLUGIN_PATH
: path where the plugin was installed.ASDF_PLUGIN_PREV_REF
: the plugin's previous git-refASDF_PLUGIN_POST_REF
: the plugin's updated git-refCall signature from asdf core
No parameters provided.
"${plugin_path}/bin/post-plugin-update"
bin/pre-plugin-remove
Description
Execute this callback script before asdf has removed the plugin with asdf plugin remove <tool>
.
See also the related command hooks:
pre_asdf_plugin_remove
pre_asdf_plugin_remove_${plugin_name}
post_asdf_plugin_remove
post_asdf_plugin_remove_${plugin_name}
Environment Variables available to script
ASDF_PLUGIN_PATH
: path where the plugin was installed.Call signature from asdf core
No parameters provided.
"${plugin_path}/bin/pre-plugin-remove"
It's possible for plugins to define new asdf commands by providing lib/commands/command*.bash
scripts or executables that will be callable using the asdf command line interface by using the plugin name as a subcommand.
For example, suppose a foo
plugin has:
foo/\n lib/commands/\n command.bash\n command-bat.bash\n command-bat-man.bash\n command-help.bash
Users can now execute:
$ asdf foo # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash`\n$ asdf foo bar # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar`\n$ asdf foo help # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash`\n$ asdf foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash`\n$ asdf foo bat baz # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz`
Plugin authors can use this feature to provide utilities related to their tools, or even create plugins that are just new command extensions of asdf itself.
If the executable bit is set, the script is executed, replacing the asdf execution.
If the executable bit is not set, asdf will source the scripts as Bash scripts.
$ASDF_CMD_FILE
resolves to the full path of the file being sourced.
haxe
is a great example of a plugin which uses this feature. It provides the asdf haxe neko-dylibs-link
to fix an issue where Haxe executables expect to find dynamic libraries relative to the executable directory.
Be sure to list your asdf Extension Commands in your plugins README.
',11)),s("h2",v,[i[45]||(i[45]=e("Custom Shim Templates ")),a(t,{type:"danger",text:"advanced",vertical:"middle"}),i[46]||(i[46]=e()),i[47]||(i[47]=s("a",{class:"header-anchor",href:"#custom-shim-templates","aria-label":'Permalink to "Custom Shim TemplatesWARNING
Please only use if absolutely required
asdf allows custom shim templates. For an executable called foo
, if there's a shims/foo
file in the plugin, then asdf will copy that file instead of using its standard shim template.
This must be used wisely.
As far as the asdf core team is aware, this feature is only in use in the first-party Elixir plugin. This is because an executable is also read as an Elixir file in addition to being an executable. This makes it not possible to use the standard Bash shim.
asdf
contains the plugin-test
command to test your plugin:
asdf plugin test <plugin_name> <plugin_url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git_ref>] [test_command...]
<plugin_name>
& <plugin_url>
are required[--asdf-tool-version <version>]
is specified, the tool will be installed with that specific version. Defaults to asdf latest <plugin-name>
[--asdf-plugin-gitref <git_ref>]
is specified, the plugin itself is checked out at that commit/branch/tag. This is useful for testing a pull-request on your plugin's CI. Defaults to the default branch of the plugin's repository.[test_command...]
is the command to execute to validate the installed tool works correctly. Typically <tool> --version
or <tool> --help
. For example, to test the NodeJS plugin, we could run# asdf plugin test <plugin_name> <plugin_url> [test_command]
+ asdf plugin test nodejs https://github.com/asdf-vm/asdf-nodejs.git node --version
Note
We recommend testing in both Linux & macOS CI environments
The asdf-vm/actions repo provides a GitHub Action for testing your plugins hosted on GitHub. A sample .github/workflows/test.yaml
Actions Workflow:
name: Test
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+
+jobs:
+ plugin_test:
+ name: asdf plugin test
+ strategy:
+ matrix:
+ os:
+ - ubuntu-latest
+ - macos-latest
+ runs-on: \${{ matrix.os }}
+ steps:
+ - name: asdf_plugin_test
+ uses: asdf-vm/actions/plugin-test@v2
+ with:
+ command: "<MY_TOOL> --version"
A sample .travis.yml
file, customize it to your needs
language: c
+script: asdf plugin test <MY_TOOL> $TRAVIS_BUILD_DIR '<MY_TOOL> --version'
+before_script:
+ - git clone https://github.com/asdf-vm/asdf.git asdf
+ - . asdf/asdf.sh
+os:
+ - linux
+ - osx
NOTE
When using another CI you may need to pass a relative path to the plugin location:
asdf plugin test <tool_name> <path> '<tool_command> --version'
If a command depends on accessing an external API, like bin/list-all
or bin/latest-stable
, it may experience rate limiting during automated testing. To mitigate this, ensure there is a code-path which provides an authentication token via an environment variable. For example:
cmd="curl --silent"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"
GITHUB_API_TOKEN
To utilise the GITHUB_API_TOKEN
, create a new personal token with only public_repo
access.
Then add this to your CI pipeline environment variables.
WARNING
NEVER publish your authentication tokens in your code repository
TIP
The recommended installation method for a plugin is via direct URL installation:
# asdf plugin add <name> <git_url>
+ asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs
If the git_url
is not provided, asdf will use the Shortname Index repository to determine the exact git_url
to use.
You can add your plugin to the Shortname Index by following the instructions in that repo.
`,27))])}const L=n(r,[["render",E]]);export{T as __pageData,L as default}; diff --git a/assets/pt-br_contribute_core.md.BB7joZcW.js b/assets/pt-br_contribute_core.md.BB7joZcW.js new file mode 100644 index 00000000..28873348 --- /dev/null +++ b/assets/pt-br_contribute_core.md.BB7joZcW.js @@ -0,0 +1,25 @@ +import{_ as s,c as a,a2 as i,o as t}from"./chunks/framework.C9NVOr0y.js";const k=JSON.parse('{"title":"asdf","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/contribute/core.md","filePath":"pt-br/contribute/core.md","lastUpdated":1687069487000}'),n={name:"pt-br/contribute/core.md"};function o(l,e,r,p,d,c){return t(),a("div",null,e[0]||(e[0]=[i(`Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
guia de contribuição principal asdf
.
Fork asdf
no GitHub e/ou Git clone o branch padrão:
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git
As ferramentas para o desenvolvimento do núcleo estão em .tool-versions
deste repositório. Se você deseja gerenciar com o próprio asdf
, adicione os plugins:
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git
Instale as versões para desenvolver asdf
com:
asdf install
pode ser útil não usar asdf
para gerenciar as ferramentas durante o desenvolvimento em sua máquina local, pois você pode precisar quebrar funcionalidades que, então, quebrariam suas ferramentas de desenvolvimento. Aqui está a lista bruta de ferramentas:
Se você quiser testar suas alterações sem fazer alterações em seu asdf
instalado, você pode definir a variável $ASDF_DIR
para o caminho onde você clonou o repositório e anexar temporariamente o diretório bin
e shims
do diretório para o seu caminho.
É melhor formatar, lint e testar seu código localmente antes de confirmar ou enviar para o controle remoto. Use os seguintes scripts/comandos:
# Shellcheck
+./scripts/shellcheck.bash
+
+# Format
+./scripts/shfmt.bash
+
+# Test: all tests
+bats test/
+# Test: for specific command
+bats test/list_commands.bash
TIP
Adicione testes! - Os testes são necessários para novos recursos e aceleram a revisão de correções de bugs. Por favor, cubra novos caminhos de código antes de criar um Pull Request. Consulte documentação do bats-core
É fortemente recomendado examinar o conjunto de testes existente e a documentação do bats-core antes de escrever os testes.
A depuração de BATs pode ser difícil às vezes. Usar a saída TAP com o sinalizador -t
permitirá que você imprima saídas com o descritor de arquivo especial >&3
durante a execução do teste, simplificando a depuração. Como um exemplo:
# test/some_tests.bats
+
+printf "%s\\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\\n" "Will be printed during bats -t test/some_tests.bats" >&3
Isso está documentado em bats-core Imprimindo no Terminal.
O asdf
está usando uma ferramenta de lançamento automatizada chamada Release Please para aumentar automaticamente a versão SemVer e gerar a Changelog. Essas informações são determinadas lendo o histórico de confirmação desde a última versão.
Mensagens de confirmação convencionais definem o formato do título da solicitação pull que se torna o formato da mensagem de confirmação na ramificação padrão. Isso é aplicado com GitHub Action amannn/action-semantic-pull-request
.
O Commit Convencional segue este formato:
<type>[optional scope][optional !]: <description>
+
+<!-- examples -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change
A lista completa de <types>
é: feat
, fix
, docs
, style
, refactor
, perf
, test
, build
, ci
, chore
, revert
.
O !
indica uma mudança de ruptura.
fix
: will create a new SemVer patch
feat
: will create a new SemVer minor
<type>!
: will create a new SemVer major
O título da solicitação pull deve seguir este formato.
TIP
Use o formato de mensagem de confirmação convencional para seu título de solicitação de pull.
Os projetos asdf-alpine e asdf-ubuntu são um esforço contínuo para fornecer imagens de algumas ferramentas asdf. Você pode usar essas imagens docker como base para seus servidores de desenvolvimento ou para executar seus aplicativos de produção.
`,34)]))}const m=s(n,[["render",o]]);export{k as __pageData,m as default}; diff --git a/assets/pt-br_contribute_core.md.BB7joZcW.lean.js b/assets/pt-br_contribute_core.md.BB7joZcW.lean.js new file mode 100644 index 00000000..28873348 --- /dev/null +++ b/assets/pt-br_contribute_core.md.BB7joZcW.lean.js @@ -0,0 +1,25 @@ +import{_ as s,c as a,a2 as i,o as t}from"./chunks/framework.C9NVOr0y.js";const k=JSON.parse('{"title":"asdf","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/contribute/core.md","filePath":"pt-br/contribute/core.md","lastUpdated":1687069487000}'),n={name:"pt-br/contribute/core.md"};function o(l,e,r,p,d,c){return t(),a("div",null,e[0]||(e[0]=[i(`Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
guia de contribuição principal asdf
.
Fork asdf
no GitHub e/ou Git clone o branch padrão:
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git
As ferramentas para o desenvolvimento do núcleo estão em .tool-versions
deste repositório. Se você deseja gerenciar com o próprio asdf
, adicione os plugins:
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git
Instale as versões para desenvolver asdf
com:
asdf install
pode ser útil não usar asdf
para gerenciar as ferramentas durante o desenvolvimento em sua máquina local, pois você pode precisar quebrar funcionalidades que, então, quebrariam suas ferramentas de desenvolvimento. Aqui está a lista bruta de ferramentas:
Se você quiser testar suas alterações sem fazer alterações em seu asdf
instalado, você pode definir a variável $ASDF_DIR
para o caminho onde você clonou o repositório e anexar temporariamente o diretório bin
e shims
do diretório para o seu caminho.
É melhor formatar, lint e testar seu código localmente antes de confirmar ou enviar para o controle remoto. Use os seguintes scripts/comandos:
# Shellcheck
+./scripts/shellcheck.bash
+
+# Format
+./scripts/shfmt.bash
+
+# Test: all tests
+bats test/
+# Test: for specific command
+bats test/list_commands.bash
TIP
Adicione testes! - Os testes são necessários para novos recursos e aceleram a revisão de correções de bugs. Por favor, cubra novos caminhos de código antes de criar um Pull Request. Consulte documentação do bats-core
É fortemente recomendado examinar o conjunto de testes existente e a documentação do bats-core antes de escrever os testes.
A depuração de BATs pode ser difícil às vezes. Usar a saída TAP com o sinalizador -t
permitirá que você imprima saídas com o descritor de arquivo especial >&3
durante a execução do teste, simplificando a depuração. Como um exemplo:
# test/some_tests.bats
+
+printf "%s\\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\\n" "Will be printed during bats -t test/some_tests.bats" >&3
Isso está documentado em bats-core Imprimindo no Terminal.
O asdf
está usando uma ferramenta de lançamento automatizada chamada Release Please para aumentar automaticamente a versão SemVer e gerar a Changelog. Essas informações são determinadas lendo o histórico de confirmação desde a última versão.
Mensagens de confirmação convencionais definem o formato do título da solicitação pull que se torna o formato da mensagem de confirmação na ramificação padrão. Isso é aplicado com GitHub Action amannn/action-semantic-pull-request
.
O Commit Convencional segue este formato:
<type>[optional scope][optional !]: <description>
+
+<!-- examples -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change
A lista completa de <types>
é: feat
, fix
, docs
, style
, refactor
, perf
, test
, build
, ci
, chore
, revert
.
O !
indica uma mudança de ruptura.
fix
: will create a new SemVer patch
feat
: will create a new SemVer minor
<type>!
: will create a new SemVer major
O título da solicitação pull deve seguir este formato.
TIP
Use o formato de mensagem de confirmação convencional para seu título de solicitação de pull.
Os projetos asdf-alpine e asdf-ubuntu são um esforço contínuo para fornecer imagens de algumas ferramentas asdf. Você pode usar essas imagens docker como base para seus servidores de desenvolvimento ou para executar seus aplicativos de produção.
`,34)]))}const m=s(n,[["render",o]]);export{k as __pageData,m as default}; diff --git a/assets/pt-br_contribute_documentation.md.D_CeZJ9y.js b/assets/pt-br_contribute_documentation.md.D_CeZJ9y.js new file mode 100644 index 00000000..d63042f8 --- /dev/null +++ b/assets/pt-br_contribute_documentation.md.D_CeZJ9y.js @@ -0,0 +1,29 @@ +import{_ as a,c as i,a2 as e,o as n}from"./chunks/framework.C9NVOr0y.js";const k=JSON.parse('{"title":"Docs & Site","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/contribute/documentation.md","filePath":"pt-br/contribute/documentation.md","lastUpdated":1687069487000}'),t={name:"pt-br/contribute/documentation.md"};function o(l,s,p,r,d,h){return n(),i("div",null,s[0]||(s[0]=[e(`Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
Documentação e guia de contribuição do site.
Fork asdf
no GitHub e/ou Git clone o branch padrão:
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git
As ferramentas para desenvolvimento de sites Docs são gerenciadas com asdf
em docs/.tool-versions
. Adicione os plugins com:
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs
Instale a(s) versão(ões) da ferramenta com:
asdf install
Instale as dependências do Node.js do docs/package.json
:
npm install
Vuepress (v2) é o Static Site Generator (SSG) que usamos para construir o site de documentação do asdf. Foi escolhido para substituir Docsify.js, pois gostaríamos de oferecer suporte a um substituto somente HTML quando os usuários não tiverem JavaScript disponível ou ativado. Isso não era possível com o Docsify. Fora isso, o conjunto de recursos é basicamente o mesmo, com foco em escrever arquivos Markdown com configuração mínima.
package.json
contém os scripts necessários para o desenvolvimento:
Para iniciar o servidor de desenvolvimento local:
npm run dev
Formate o código antes de confirmar:
npm run format
asdf
está usando um pipeline de lançamento automatizado que depende de Commits Convencionais em títulos de PR. Documentação detalhada encontrada no guia de contribuição principal.
Ao criar um PR para alterações na documentação, por favor, faça o título do PR com o tipo de Commit Convencional docs
no formato docs: <description>
.
A configuração do site está contida em alguns arquivos JavaScript com objetos JS usados para representar a configuração. Eles estão:
docs/.vuepress/config.js
: o arquivo de configuração raiz do site. Leia a documentação do Vuepress para obter as especificações.Para simplificar a configuração raiz, os objetos JS maiores que representam a configuração navbar e sidebar foram extraídos e separados por sua localidade. Veja os dois em:
docs/.vuepress/navbar.js
docs/.vuepress/sidebar.js
Com a documentação oficial para essas configurações vivendo na Referência de tema padrão.
Vuepress tem suporte de primeira classe para internacionalização. O root config docs/.vuepress/config.js
define os locais suportados com sua URL, título no menu suspenso de seleção e referências de configurações navbar/sidebar.
As configurações da barra de navegação/barra lateral são capturadas nos arquivos de configuração mencionados acima, separadas por localidade e exportadas individualmente.
O conteúdo de markdown para cada localidade deve estar em uma pasta com o mesmo nome das chaves para locales
na configuração raiz. Isso é:
{
+ ...
+ themeConfig: {
+ locales: {
+ "/": {
+ selectLanguageName: "English (US)",
+ sidebar: sidebar.en,
+ navbar: navbar.en
+ },
+ "/pt-BR/": {
+ selectLanguageName: "Brazilian Portuguese",
+ sidebar: sidebar.pt_br,
+ navbar: navbar.pt_br
+ }
+ }
+ }
+}
/pt-BR/
exigirá o mesmo conjunto de arquivos markdown localizados em docs/pt-BR/
, assim:
docs
+├─ README.md
+├─ foo.md
+├─ nested
+│ └─ README.md
+└─ pt-BR
+ ├─ README.md
+ ├─ foo.md
+ └─ nested
+ └─ README.md
A documentação oficial do Vuepress i18n entra em mais detalhes.
`,38)]))}const u=a(t,[["render",o]]);export{k as __pageData,u as default}; diff --git a/assets/pt-br_contribute_documentation.md.D_CeZJ9y.lean.js b/assets/pt-br_contribute_documentation.md.D_CeZJ9y.lean.js new file mode 100644 index 00000000..d63042f8 --- /dev/null +++ b/assets/pt-br_contribute_documentation.md.D_CeZJ9y.lean.js @@ -0,0 +1,29 @@ +import{_ as a,c as i,a2 as e,o as n}from"./chunks/framework.C9NVOr0y.js";const k=JSON.parse('{"title":"Docs & Site","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/contribute/documentation.md","filePath":"pt-br/contribute/documentation.md","lastUpdated":1687069487000}'),t={name:"pt-br/contribute/documentation.md"};function o(l,s,p,r,d,h){return n(),i("div",null,s[0]||(s[0]=[e(`Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
Documentação e guia de contribuição do site.
Fork asdf
no GitHub e/ou Git clone o branch padrão:
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git
As ferramentas para desenvolvimento de sites Docs são gerenciadas com asdf
em docs/.tool-versions
. Adicione os plugins com:
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs
Instale a(s) versão(ões) da ferramenta com:
asdf install
Instale as dependências do Node.js do docs/package.json
:
npm install
Vuepress (v2) é o Static Site Generator (SSG) que usamos para construir o site de documentação do asdf. Foi escolhido para substituir Docsify.js, pois gostaríamos de oferecer suporte a um substituto somente HTML quando os usuários não tiverem JavaScript disponível ou ativado. Isso não era possível com o Docsify. Fora isso, o conjunto de recursos é basicamente o mesmo, com foco em escrever arquivos Markdown com configuração mínima.
package.json
contém os scripts necessários para o desenvolvimento:
Para iniciar o servidor de desenvolvimento local:
npm run dev
Formate o código antes de confirmar:
npm run format
asdf
está usando um pipeline de lançamento automatizado que depende de Commits Convencionais em títulos de PR. Documentação detalhada encontrada no guia de contribuição principal.
Ao criar um PR para alterações na documentação, por favor, faça o título do PR com o tipo de Commit Convencional docs
no formato docs: <description>
.
A configuração do site está contida em alguns arquivos JavaScript com objetos JS usados para representar a configuração. Eles estão:
docs/.vuepress/config.js
: o arquivo de configuração raiz do site. Leia a documentação do Vuepress para obter as especificações.Para simplificar a configuração raiz, os objetos JS maiores que representam a configuração navbar e sidebar foram extraídos e separados por sua localidade. Veja os dois em:
docs/.vuepress/navbar.js
docs/.vuepress/sidebar.js
Com a documentação oficial para essas configurações vivendo na Referência de tema padrão.
Vuepress tem suporte de primeira classe para internacionalização. O root config docs/.vuepress/config.js
define os locais suportados com sua URL, título no menu suspenso de seleção e referências de configurações navbar/sidebar.
As configurações da barra de navegação/barra lateral são capturadas nos arquivos de configuração mencionados acima, separadas por localidade e exportadas individualmente.
O conteúdo de markdown para cada localidade deve estar em uma pasta com o mesmo nome das chaves para locales
na configuração raiz. Isso é:
{
+ ...
+ themeConfig: {
+ locales: {
+ "/": {
+ selectLanguageName: "English (US)",
+ sidebar: sidebar.en,
+ navbar: navbar.en
+ },
+ "/pt-BR/": {
+ selectLanguageName: "Brazilian Portuguese",
+ sidebar: sidebar.pt_br,
+ navbar: navbar.pt_br
+ }
+ }
+ }
+}
/pt-BR/
exigirá o mesmo conjunto de arquivos markdown localizados em docs/pt-BR/
, assim:
docs
+├─ README.md
+├─ foo.md
+├─ nested
+│ └─ README.md
+└─ pt-BR
+ ├─ README.md
+ ├─ foo.md
+ └─ nested
+ └─ README.md
A documentação oficial do Vuepress i18n entra em mais detalhes.
`,38)]))}const u=a(t,[["render",o]]);export{k as __pageData,u as default}; diff --git a/assets/pt-br_contribute_first-party-plugins.md.TUKlMnR4.js b/assets/pt-br_contribute_first-party-plugins.md.TUKlMnR4.js new file mode 100644 index 00000000..0ce717ac --- /dev/null +++ b/assets/pt-br_contribute_first-party-plugins.md.TUKlMnR4.js @@ -0,0 +1 @@ +import{_ as a,c as t,a2 as r,o as i}from"./chunks/framework.C9NVOr0y.js";const f=JSON.parse('{"title":"First-Party Plugins","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/contribute/first-party-plugins.md","filePath":"pt-br/contribute/first-party-plugins.md","lastUpdated":1650978118000}'),o={name:"pt-br/contribute/first-party-plugins.md"};function s(l,e,n,d,p,u){return i(),t("div",null,e[0]||(e[0]=[r('Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
A equipe principal do asdf criou alguns plugins relevantes para sua vida profissional diária. A ajuda é sempre bem-vinda na manutenção e melhoria desses plugins. Veja o repositório associado para cada link abaixo:
Para plugins da comunidade, consulte:
asdf-community
organisation: A collaborative, community-driven project for long-term maintenance of asdf
plugins.asdf-plugins
shortname repo: Short-name list used by asdf
core to lookup popular asdf
plugins.asdf-plugin
topic searchHi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
A equipe principal do asdf criou alguns plugins relevantes para sua vida profissional diária. A ajuda é sempre bem-vinda na manutenção e melhoria desses plugins. Veja o repositório associado para cada link abaixo:
Para plugins da comunidade, consulte:
asdf-community
organisation: A collaborative, community-driven project for long-term maintenance of asdf
plugins.asdf-plugins
shortname repo: Short-name list used by asdf
core to lookup popular asdf
plugins.asdf-plugin
topic searchHi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
A instalação do asdf
envolve:
asdf
asdf
ao seu shell.tool-versions
Você pode também acompanhar o passo a passo da instalação através deste vídeo.
asdf primarily requires git
& curl
. Here is a non-exhaustive list of commands to run for your package manager (some might automatically install these tools in later steps).
OS | Package Manager | Command |
---|---|---|
linux | Aptitude | apt install curl git |
linux | DNF | dnf install curl git |
linux | Pacman | pacman -S curl git |
linux | Zypper | zypper install curl git |
macOS | Homebrew | brew install coreutils curl git |
macOS | Spack | spack install coreutils curl git |
Note
sudo
may be required depending on your system configuration.
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1
We highly recommend using the official git
method.
Method | Command |
---|---|
Homebrew | brew install asdf |
Pacman | git clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper |
Existem diversas combinações de shells, sistemas operacionais e métodos de instalação que podem impactar a configuração. Abaixo, expanda a seção que se adeque mais com o seu sistema:
Adicione esta linha ao seu ~/.bashrc
:
. "$HOME/.asdf/asdf.sh"
O auto completar deve ser configurado manualmente a partir da adição da seguinte linha ao .bashrc
:
. "$HOME/.asdf/completions/asdf.bash"
Se você estiver usando o macOS Catalina ou mais recente, o shell padrão mudou para o ZSH. A não ser que você tenha voltado para o bash, siga as instruções de instalação para o ZSH.
Adicione esta linha ao seu ~/.bash_profile
:
. "$HOME/.asdf/asdf.sh"
O auto completar deve ser configurado manualmente a partir da adição da seguinte linha ao .bash_profile
:
. "$HOME/.asdf/completions/asdf.bash"
Adicione asdf.sh
ao ~/.bashrc
através do comando:
echo -e "\\n. $(brew --prefix asdf)/asdf.sh" >> ~/.bashrc
O auto completar deve ser configurado seguindo as instruções da Homebrew, ou as seguintes:
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Se você estiver usando o macOS Catalina ou mais recente, o shell padrão mudou para o ZSH. A não ser que você tenha voltado para o bash, siga as instruções de instalação para o ZSH.
Adicione asdf.sh
ao ~/.bash_profile
através do comando:
echo -e "\\n. $(brew --prefix asdf)/asdf.sh" >> ~/.bash_profile
O auto completar deve ser configurado seguindo as instruções da Homebrew, ou as seguintes:
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Adicione a seguinte linha ao seu ~/.bashrc
:
. /opt/asdf-vm/asdf.sh
O pacote bash-completion
precisa ser instalado para o auto completar funcionar.
Adicione a seguinte linha ao seu ~/.config/fish/config.fish
:
source ~/.asdf/asdf.fish
O auto completar deve ser configurado manualmente através do seguinte comando:
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Adicione asdf.fish
ao seu ~/.config/fish/config.fish
através do comando:
echo -e "\\nsource "(brew --prefix asdf)"/asdf.fish" >> ~/.config/fish/config.fish
O auto completar é configurado pela Homebrew para o fish shell.
Adicione a seguinte linha ao seu ~/.config/fish/config.fish
:
source /opt/asdf-vm/asdf.fish
O auto completar é configurado automaticamente durante a instalação do pacote AUR.
Adicione asdf.elv
ao ~/.config/elvish/rc.elv
através do comando:
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
Ao concluir atualizará automaticamente
Adicione asdf.elv
ao ~/.config/elvish/rc.elv
através do comando:
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
Ao concluir atualizará automaticamente
Adicione asdf.elv
ao ~/.config/elvish/rc.elv
através do comando:
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
Ao concluir atualizará automaticamente
Adicione a seguinte linha ao seu ~/.zshrc
:
. "$HOME/.asdf/asdf.sh"
OU utilize um framework para ZSH, como asdf para oh-my-zsh que irá adicionar o script e o auto completar.
O auto completar pode ser configurado ou pelo plugin do asdf para framework para ZSH, ou através da adição das seguintes linhas ao seu .zshrc
:
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
compinit
customizada, garanta que compinit
esteja abaixo chamada asdf.sh
compinit
customizada com um framework para ZSH, garanta que compinit
esteja abaixo da chamada do framework.Aviso
Se você está utilizando um framework para ZSH, o plugin do asdf pode precisar ser atualizado para utilização adequada do novo auto completar do ZSH através do fpath
. O plugin do asdf para o oh-my-zsh ainda não foi atualizado, veja: ohmyzsh/ohmyzsh#8837.
Adicione asdf.sh
ao seu ~/.zshrc
através do comando:
echo -e "\\n. $(brew --prefix asdf)/asdf.sh" >> \${ZDOTDIR:-~}/.zshrc
OU utilize um framework para ZSH, como asdf para oh-my-zsh que irá adicionar o script e o auto completar.
O auto completar pode ser configurado ou pelo framework para ZSH, ou de acordo com as instruções da Homebrew. Se você está usando um framework para ZSH, pode ser que seja necessário atualizar o plugin do asdf para que o novo auto completar funcione adequadamente através do fpath
. O plugin do asdf para o Oh-My-ZSH ainda será atualizado, veja: ohmyzsh/ohmyzsh#8837.
Adicione a seguinte linha ao seu ~/.zshrc
:
. /opt/asdf-vm/asdf.sh
Adicione a seguinte linha ao seu ~/.config/powershell/profile.ps1
:
. "$HOME/.asdf/asdf.ps1"
Adicione asdf.ps1
ao seu ~/.config/powershell/profile.ps1
através do comando:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
Adicione a seguinte linha ao seu ~/.config/powershell/profile.ps1
:
. /opt/asdf-vm/asdf.ps1
Adicione asdf.nu
ao seu ~/.config/nushell/config.nu
através do comando:
"\\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path
Ao concluir atualizará automaticamente
Adicione asdf.nu
ao seu ~/.config/nushell/config.nu
através do comando:
"\\n$env.ASDF_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\\n source " + (brew --prefix asdf | str trim | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path
Ao concluir atualizará automaticamente
Adicione asdf.nu
ao seu ~/.config/nushell/config.nu
através do comando:
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path
Ao concluir atualizará automaticamente
Adicione a seguinte linha ao seu ~/.profile
:
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
Adicione asdf.sh
ao ~/.profile
através do comando:
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
Adicione a seguinte linha ao seu ~/.profile
:
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh
O auto completar é colocado em um local familiar para o ZSH, mas o ZSH deve ser configurado para conseguir utilizá-lo. :::
Os scripts do asdf
precisam ser chamados depois de ter configurado a sua variável $PATH
e depois de ter chamado o seu framework para ZSH (oh-my-zsh etc).
Reinicie seu shell para que as mudanças na variável PATH
tenham efeito. Abrir uma nova janela/sessão de terminal o fará.
Para demonstração, vamos instalar e configurar o Node.js através do plugin asdf-nodejs
.
Cada plugin possui algumas dependências, por isso precisamos checar no repositório onde elas estão listadas. Por exemplo, para o asdf-nodejs
são:
SO | Instalação de dependencia |
---|---|
Linux (Debian) | apt-get install dirmngr gpg curl gawk |
macOS | brew install gpg gawk |
Devemos instalar instalar as dependências primeiro, pois alguns plugins exigem algumas ações após a instalação.
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
Agora temos o plugin para o Node.js, nós podemos instalar uma versão desta ferramenta.
Podemos ver quais versões tão disponíveis através do comando asdf list all nodejs
, ou uma lista específica de versões com asdf list all nodejs 14
Vamos instalar somente a última versão disponível, utilizando a tag latest
:
asdf install nodejs latest
Nota
asdf
exige versões exatas. A palavra latest
resulta na instalação da versão atual na data da execução.
asdf
executa uma verificação das versões das ferramentas a serem utilizadas através do arquivo .tool-versions
presente desde diretório atual, até o diretório $HOME
. A varredura ocorre no momento em que você executa uma ferramenta que o asdf gerencia.
WARNING
Se uma versão não for especificada para uma ferramenta, ao executá-la resultará em erro. asdf current
mostrará a ferramenta e sua versão, ou então a falta dela no seu diretório atual para que você possa observar quais ferramentas falharão ao serem executadas.
Os padrões globais são gerenciados em $HOME/.tool-versions
. Defina uma versão global através do comando:
asdf global nodejs latest
$HOME/.tool-versions
ficará assim:
nodejs 16.5.0
Alguns sistemas operacionais vêm por padrão com ferramentas que são gerenciadas pelo próprio sistema e não pelo asdf
, python
é um exemplo. Você precisa indicar para o asdf
para devolver o gerenciamento para o sistema. A seção de referência de versões irá guiá-lo.
Versões locais são definidas no arquivo $PWD/.tool-versions
(seu diretório atual). Geralmente, será um repositório Git para um projeto. Quando estiver no diretório desejado, execute:
asdf local nodejs latest
$PWD/.tool-versions
ficará assim:
nodejs 16.5.0
asdf
suporta a migração de arquivos de versão provenientes de outros gerenciadores de versão. Por exemplo: .ruby-version
para o rbenv
. Essa funcionalidade é baseada no plugin de cada ferramenta.
O asdf-nodejs
suporta tanto arquivos .nvmrc
quanto .node-version
. Para ativar essa funcionalidade, adicione a seguinte linha ao seu arquivo de configuração do asdf
- $HOME/.asdfrc
:
legacy_version_file = yes
Veja a página de refencia da configuração para mais opções de configuração.
A configuração inicial do asdf
foi finalizada 🎉. Agora, você pode gerenciar versões do nodejs
para o seus projetos. Siga passos semelhantes para cada ferramenta do seu projeto.
O asdf
possui diversos outros comandos para se acustomar ainda, você pode ver todos eles através do comando asdf --help
ou simplesmente asdf
. Eles estão divididos em três categorias:
Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
A instalação do asdf
envolve:
asdf
asdf
ao seu shell.tool-versions
Você pode também acompanhar o passo a passo da instalação através deste vídeo.
asdf primarily requires git
& curl
. Here is a non-exhaustive list of commands to run for your package manager (some might automatically install these tools in later steps).
OS | Package Manager | Command |
---|---|---|
linux | Aptitude | apt install curl git |
linux | DNF | dnf install curl git |
linux | Pacman | pacman -S curl git |
linux | Zypper | zypper install curl git |
macOS | Homebrew | brew install coreutils curl git |
macOS | Spack | spack install coreutils curl git |
Note
sudo
may be required depending on your system configuration.
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1
We highly recommend using the official git
method.
Method | Command |
---|---|
Homebrew | brew install asdf |
Pacman | git clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper |
Existem diversas combinações de shells, sistemas operacionais e métodos de instalação que podem impactar a configuração. Abaixo, expanda a seção que se adeque mais com o seu sistema:
Adicione esta linha ao seu ~/.bashrc
:
. "$HOME/.asdf/asdf.sh"
O auto completar deve ser configurado manualmente a partir da adição da seguinte linha ao .bashrc
:
. "$HOME/.asdf/completions/asdf.bash"
Se você estiver usando o macOS Catalina ou mais recente, o shell padrão mudou para o ZSH. A não ser que você tenha voltado para o bash, siga as instruções de instalação para o ZSH.
Adicione esta linha ao seu ~/.bash_profile
:
. "$HOME/.asdf/asdf.sh"
O auto completar deve ser configurado manualmente a partir da adição da seguinte linha ao .bash_profile
:
. "$HOME/.asdf/completions/asdf.bash"
Adicione asdf.sh
ao ~/.bashrc
através do comando:
echo -e "\\n. $(brew --prefix asdf)/asdf.sh" >> ~/.bashrc
O auto completar deve ser configurado seguindo as instruções da Homebrew, ou as seguintes:
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Se você estiver usando o macOS Catalina ou mais recente, o shell padrão mudou para o ZSH. A não ser que você tenha voltado para o bash, siga as instruções de instalação para o ZSH.
Adicione asdf.sh
ao ~/.bash_profile
através do comando:
echo -e "\\n. $(brew --prefix asdf)/asdf.sh" >> ~/.bash_profile
O auto completar deve ser configurado seguindo as instruções da Homebrew, ou as seguintes:
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Adicione a seguinte linha ao seu ~/.bashrc
:
. /opt/asdf-vm/asdf.sh
O pacote bash-completion
precisa ser instalado para o auto completar funcionar.
Adicione a seguinte linha ao seu ~/.config/fish/config.fish
:
source ~/.asdf/asdf.fish
O auto completar deve ser configurado manualmente através do seguinte comando:
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Adicione asdf.fish
ao seu ~/.config/fish/config.fish
através do comando:
echo -e "\\nsource "(brew --prefix asdf)"/asdf.fish" >> ~/.config/fish/config.fish
O auto completar é configurado pela Homebrew para o fish shell.
Adicione a seguinte linha ao seu ~/.config/fish/config.fish
:
source /opt/asdf-vm/asdf.fish
O auto completar é configurado automaticamente durante a instalação do pacote AUR.
Adicione asdf.elv
ao ~/.config/elvish/rc.elv
através do comando:
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
Ao concluir atualizará automaticamente
Adicione asdf.elv
ao ~/.config/elvish/rc.elv
através do comando:
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
Ao concluir atualizará automaticamente
Adicione asdf.elv
ao ~/.config/elvish/rc.elv
através do comando:
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
Ao concluir atualizará automaticamente
Adicione a seguinte linha ao seu ~/.zshrc
:
. "$HOME/.asdf/asdf.sh"
OU utilize um framework para ZSH, como asdf para oh-my-zsh que irá adicionar o script e o auto completar.
O auto completar pode ser configurado ou pelo plugin do asdf para framework para ZSH, ou através da adição das seguintes linhas ao seu .zshrc
:
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
compinit
customizada, garanta que compinit
esteja abaixo chamada asdf.sh
compinit
customizada com um framework para ZSH, garanta que compinit
esteja abaixo da chamada do framework.Aviso
Se você está utilizando um framework para ZSH, o plugin do asdf pode precisar ser atualizado para utilização adequada do novo auto completar do ZSH através do fpath
. O plugin do asdf para o oh-my-zsh ainda não foi atualizado, veja: ohmyzsh/ohmyzsh#8837.
Adicione asdf.sh
ao seu ~/.zshrc
através do comando:
echo -e "\\n. $(brew --prefix asdf)/asdf.sh" >> \${ZDOTDIR:-~}/.zshrc
OU utilize um framework para ZSH, como asdf para oh-my-zsh que irá adicionar o script e o auto completar.
O auto completar pode ser configurado ou pelo framework para ZSH, ou de acordo com as instruções da Homebrew. Se você está usando um framework para ZSH, pode ser que seja necessário atualizar o plugin do asdf para que o novo auto completar funcione adequadamente através do fpath
. O plugin do asdf para o Oh-My-ZSH ainda será atualizado, veja: ohmyzsh/ohmyzsh#8837.
Adicione a seguinte linha ao seu ~/.zshrc
:
. /opt/asdf-vm/asdf.sh
Adicione a seguinte linha ao seu ~/.config/powershell/profile.ps1
:
. "$HOME/.asdf/asdf.ps1"
Adicione asdf.ps1
ao seu ~/.config/powershell/profile.ps1
através do comando:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
Adicione a seguinte linha ao seu ~/.config/powershell/profile.ps1
:
. /opt/asdf-vm/asdf.ps1
Adicione asdf.nu
ao seu ~/.config/nushell/config.nu
através do comando:
"\\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path
Ao concluir atualizará automaticamente
Adicione asdf.nu
ao seu ~/.config/nushell/config.nu
através do comando:
"\\n$env.ASDF_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\\n source " + (brew --prefix asdf | str trim | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path
Ao concluir atualizará automaticamente
Adicione asdf.nu
ao seu ~/.config/nushell/config.nu
através do comando:
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path
Ao concluir atualizará automaticamente
Adicione a seguinte linha ao seu ~/.profile
:
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
Adicione asdf.sh
ao ~/.profile
através do comando:
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
Adicione a seguinte linha ao seu ~/.profile
:
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh
O auto completar é colocado em um local familiar para o ZSH, mas o ZSH deve ser configurado para conseguir utilizá-lo. :::
Os scripts do asdf
precisam ser chamados depois de ter configurado a sua variável $PATH
e depois de ter chamado o seu framework para ZSH (oh-my-zsh etc).
Reinicie seu shell para que as mudanças na variável PATH
tenham efeito. Abrir uma nova janela/sessão de terminal o fará.
Para demonstração, vamos instalar e configurar o Node.js através do plugin asdf-nodejs
.
Cada plugin possui algumas dependências, por isso precisamos checar no repositório onde elas estão listadas. Por exemplo, para o asdf-nodejs
são:
SO | Instalação de dependencia |
---|---|
Linux (Debian) | apt-get install dirmngr gpg curl gawk |
macOS | brew install gpg gawk |
Devemos instalar instalar as dependências primeiro, pois alguns plugins exigem algumas ações após a instalação.
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
Agora temos o plugin para o Node.js, nós podemos instalar uma versão desta ferramenta.
Podemos ver quais versões tão disponíveis através do comando asdf list all nodejs
, ou uma lista específica de versões com asdf list all nodejs 14
Vamos instalar somente a última versão disponível, utilizando a tag latest
:
asdf install nodejs latest
Nota
asdf
exige versões exatas. A palavra latest
resulta na instalação da versão atual na data da execução.
asdf
executa uma verificação das versões das ferramentas a serem utilizadas através do arquivo .tool-versions
presente desde diretório atual, até o diretório $HOME
. A varredura ocorre no momento em que você executa uma ferramenta que o asdf gerencia.
WARNING
Se uma versão não for especificada para uma ferramenta, ao executá-la resultará em erro. asdf current
mostrará a ferramenta e sua versão, ou então a falta dela no seu diretório atual para que você possa observar quais ferramentas falharão ao serem executadas.
Os padrões globais são gerenciados em $HOME/.tool-versions
. Defina uma versão global através do comando:
asdf global nodejs latest
$HOME/.tool-versions
ficará assim:
nodejs 16.5.0
Alguns sistemas operacionais vêm por padrão com ferramentas que são gerenciadas pelo próprio sistema e não pelo asdf
, python
é um exemplo. Você precisa indicar para o asdf
para devolver o gerenciamento para o sistema. A seção de referência de versões irá guiá-lo.
Versões locais são definidas no arquivo $PWD/.tool-versions
(seu diretório atual). Geralmente, será um repositório Git para um projeto. Quando estiver no diretório desejado, execute:
asdf local nodejs latest
$PWD/.tool-versions
ficará assim:
nodejs 16.5.0
asdf
suporta a migração de arquivos de versão provenientes de outros gerenciadores de versão. Por exemplo: .ruby-version
para o rbenv
. Essa funcionalidade é baseada no plugin de cada ferramenta.
O asdf-nodejs
suporta tanto arquivos .nvmrc
quanto .node-version
. Para ativar essa funcionalidade, adicione a seguinte linha ao seu arquivo de configuração do asdf
- $HOME/.asdfrc
:
legacy_version_file = yes
Veja a página de refencia da configuração para mais opções de configuração.
A configuração inicial do asdf
foi finalizada 🎉. Agora, você pode gerenciar versões do nodejs
para o seus projetos. Siga passos semelhantes para cada ferramenta do seu projeto.
O asdf
possui diversos outros comandos para se acustomar ainda, você pode ver todos eles através do comando asdf --help
ou simplesmente asdf
. Eles estão divididos em três categorias:
Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
O asdf
é um gerenciador de versões. Todas as definições de versão das ferramentas estão contidas no arquivo (.tool-versions
), o qual você pode compartilhar com o seu time no repositório Git de um projeto e garantir que todos estejam usando exatamente a mesma versão das ferramentas.
A maneira antiga de trabalhar necessitava diversos gerenciadores de versão, cada um deles com uma documentação, arquivos de configuração diferentes (manipulação do $PATH
, shims e variáveis de ambiente, por exemplo). O asdf
provê um único arquivo de configuração e uma única interface para simplificar o fluxo de desenvolvimento, podendo ser ampliado para todas as ferramentas através de um simples plugin.
Após instalar e configurar o asdf
no seu shell, plugins podem ser instalados para gerenciar determinadas ferramentas. Quando uma ferramenta é instalada por um plugin, os executáveis que foram instalados possuem shims criados para cada um deles. Quando você roda algum destes executáveis, o shim é executado, permitindo que o asdf
identifique qual versão da ferramenta está configurada no arquivo .tool-versions
e execute esta versão.
Ferramentas como o nvm, n e rbenv são escritas em shell scripts que criam shims para os executáveis instalados para essas ferramentas.
O asdf
é bem similar e foi criado para competir neste meio de ferramentas de gerenciamento de versão. O grande diferencial do asdf
é que seu sistema de plugins elimina a necessidade de um gerenciador de versões para cada ferramenta, esta com diferentes comandos e arquivos de configuração.
Aumenta os shells existentes com a possibilidade de utilizar diferentes variáveis de ambiente com base no diretório atual.
O asdf
não gerencia variáveis de ambiente, entretanto existe o plugin asdf-direnv
para integrar o comportamento do direnv ao asdf.
Veja a documentação do direnv para mais detalhes.
O gerenciador de pacotes faltante para o macOS (ou Linux)
O Homebrew gerencia seus pacotes e dependências destes pacotes. O asdf
não gerencia dependencias, não é um gerenciador de pacotes, a escolha do gerenciador de pacotes é reservada ao usuário.
Veja a documentação do Homebrew para mais detalhes.
O Nix é uma ferramenta que relaciona o gerenciamento de pacotes e as configurações de sistema.
O NixOS visa construir ambientes verdadeiramente replicáveis através da gerência das versões exatas dos pacotes e dependências de cada ferramenta, algo que o asdf
não faz. O NixOS faz isso através da sua própria linguagem de programação, muitas ferramentas da linha de comando e uma coleção de pacotes contendo mais de 60,000 destes.
Novamente, o asdf
não gerencia dependências/pacotes e não é um gerenciador de pacotes.
Veja a documentação do NixOS para mais detalhes.
O asdf
garante que equipes utilizem exatamente a mesma versão de alguma ferramenta, com suporte para diversas delas através do sistema de plugins e a simplicidade e familiaridade de ser um único shell script que você inclui na configuração do seu shell
Nota
O asdf
não foi feito para ser o gerenciador de pacotes do seu sistema, mas sim uma ferramenta para gerenciar versões de outras ferramentas. Não é por que é possível criar um plugin para qualquer ferramenta/linguagem com o asdf
que esta sempre será a solução mais adequada.
Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
O asdf
é um gerenciador de versões. Todas as definições de versão das ferramentas estão contidas no arquivo (.tool-versions
), o qual você pode compartilhar com o seu time no repositório Git de um projeto e garantir que todos estejam usando exatamente a mesma versão das ferramentas.
A maneira antiga de trabalhar necessitava diversos gerenciadores de versão, cada um deles com uma documentação, arquivos de configuração diferentes (manipulação do $PATH
, shims e variáveis de ambiente, por exemplo). O asdf
provê um único arquivo de configuração e uma única interface para simplificar o fluxo de desenvolvimento, podendo ser ampliado para todas as ferramentas através de um simples plugin.
Após instalar e configurar o asdf
no seu shell, plugins podem ser instalados para gerenciar determinadas ferramentas. Quando uma ferramenta é instalada por um plugin, os executáveis que foram instalados possuem shims criados para cada um deles. Quando você roda algum destes executáveis, o shim é executado, permitindo que o asdf
identifique qual versão da ferramenta está configurada no arquivo .tool-versions
e execute esta versão.
Ferramentas como o nvm, n e rbenv são escritas em shell scripts que criam shims para os executáveis instalados para essas ferramentas.
O asdf
é bem similar e foi criado para competir neste meio de ferramentas de gerenciamento de versão. O grande diferencial do asdf
é que seu sistema de plugins elimina a necessidade de um gerenciador de versões para cada ferramenta, esta com diferentes comandos e arquivos de configuração.
Aumenta os shells existentes com a possibilidade de utilizar diferentes variáveis de ambiente com base no diretório atual.
O asdf
não gerencia variáveis de ambiente, entretanto existe o plugin asdf-direnv
para integrar o comportamento do direnv ao asdf.
Veja a documentação do direnv para mais detalhes.
O gerenciador de pacotes faltante para o macOS (ou Linux)
O Homebrew gerencia seus pacotes e dependências destes pacotes. O asdf
não gerencia dependencias, não é um gerenciador de pacotes, a escolha do gerenciador de pacotes é reservada ao usuário.
Veja a documentação do Homebrew para mais detalhes.
O Nix é uma ferramenta que relaciona o gerenciamento de pacotes e as configurações de sistema.
O NixOS visa construir ambientes verdadeiramente replicáveis através da gerência das versões exatas dos pacotes e dependências de cada ferramenta, algo que o asdf
não faz. O NixOS faz isso através da sua própria linguagem de programação, muitas ferramentas da linha de comando e uma coleção de pacotes contendo mais de 60,000 destes.
Novamente, o asdf
não gerencia dependências/pacotes e não é um gerenciador de pacotes.
Veja a documentação do NixOS para mais detalhes.
O asdf
garante que equipes utilizem exatamente a mesma versão de alguma ferramenta, com suporte para diversas delas através do sistema de plugins e a simplicidade e familiaridade de ser um único shell script que você inclui na configuração do seu shell
Nota
O asdf
não foi feito para ser o gerenciador de pacotes do seu sistema, mas sim uma ferramenta para gerenciar versões de outras ferramentas. Não é por que é possível criar um plugin para qualquer ferramenta/linguagem com o asdf
que esta sempre será a solução mais adequada.
Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
A lista de todos os comandos disponíveis em asdf
. Esta lista é o texto do comando asdf help
.
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>] Add a plugin from the plugin repo OR,
+ add a Git repo as a plugin by
+ specifying the name and repo url
+asdf plugin list [--urls] [--refs] List installed plugins. Optionally show
+ git urls and git-ref
+asdf plugin list all List plugins registered on asdf-plugins
+ repository with URLs
+asdf plugin remove <name> Remove plugin and package versions
+asdf plugin update <name> [<git-ref>] Update a plugin to latest commit on
+ default branch or a particular git-ref
+asdf plugin update --all Update all plugins to latest commit on
+ default branch
+
+
+MANAGE PACKAGES
+asdf current Display current version set or being
+ used for all packages
+asdf current <name> Display current version set or being
+ used for package
+asdf global <name> <version> Set the package global version
+asdf global <name> latest[:<version>] Set the package global version to the
+ latest provided version
+asdf help <name> [<version>] Output documentation for plugin and tool
+asdf install Install all the package versions listed
+ in the .tool-versions file
+asdf install <name> Install one tool at the version
+ specified in the .tool-versions file
+asdf install <name> <version> Install a specific version of a package
+asdf install <name> latest[:<version>] Install the latest stable version of a
+ package, or with optional version,
+ install the latest stable version that
+ begins with the given string
+asdf latest <name> [<version>] Show latest stable version of a package
+asdf latest --all Show latest stable version of all the
+ packages and if they are installed
+asdf list <name> [version] List installed versions of a package and
+ optionally filter the versions
+asdf list all <name> [<version>] List all versions of a package and
+ optionally filter the returned versions
+asdf local <name> <version> Set the package local version
+asdf local <name> latest[:<version>] Set the package local version to the
+ latest provided version
+asdf shell <name> <version> Set the package version to
+ \`ASDF_\${LANG}_VERSION\` in the current shell
+asdf uninstall <name> <version> Remove a specific version of a package
+asdf where <name> [<version>] Display install path for an installed
+ or current version
+asdf which <command> Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...] Executes the command shim for current version
+asdf env <command> [util] Runs util (default: \`env\`) inside the
+ environment used for command shim execution.
+asdf info Print OS, Shell and ASDF debug information.
+asdf version Print the currently installed version of ASDF
+asdf reshim <name> <version> Recreate shims for version of a package
+asdf shim-versions <command> List the plugins and versions that
+ provide a command
+asdf update Update asdf to the latest stable release
+asdf update --head Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs: https://asdf-vm.com
Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
A lista de todos os comandos disponíveis em asdf
. Esta lista é o texto do comando asdf help
.
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>] Add a plugin from the plugin repo OR,
+ add a Git repo as a plugin by
+ specifying the name and repo url
+asdf plugin list [--urls] [--refs] List installed plugins. Optionally show
+ git urls and git-ref
+asdf plugin list all List plugins registered on asdf-plugins
+ repository with URLs
+asdf plugin remove <name> Remove plugin and package versions
+asdf plugin update <name> [<git-ref>] Update a plugin to latest commit on
+ default branch or a particular git-ref
+asdf plugin update --all Update all plugins to latest commit on
+ default branch
+
+
+MANAGE PACKAGES
+asdf current Display current version set or being
+ used for all packages
+asdf current <name> Display current version set or being
+ used for package
+asdf global <name> <version> Set the package global version
+asdf global <name> latest[:<version>] Set the package global version to the
+ latest provided version
+asdf help <name> [<version>] Output documentation for plugin and tool
+asdf install Install all the package versions listed
+ in the .tool-versions file
+asdf install <name> Install one tool at the version
+ specified in the .tool-versions file
+asdf install <name> <version> Install a specific version of a package
+asdf install <name> latest[:<version>] Install the latest stable version of a
+ package, or with optional version,
+ install the latest stable version that
+ begins with the given string
+asdf latest <name> [<version>] Show latest stable version of a package
+asdf latest --all Show latest stable version of all the
+ packages and if they are installed
+asdf list <name> [version] List installed versions of a package and
+ optionally filter the versions
+asdf list all <name> [<version>] List all versions of a package and
+ optionally filter the returned versions
+asdf local <name> <version> Set the package local version
+asdf local <name> latest[:<version>] Set the package local version to the
+ latest provided version
+asdf shell <name> <version> Set the package version to
+ \`ASDF_\${LANG}_VERSION\` in the current shell
+asdf uninstall <name> <version> Remove a specific version of a package
+asdf where <name> [<version>] Display install path for an installed
+ or current version
+asdf which <command> Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...] Executes the command shim for current version
+asdf env <command> [util] Runs util (default: \`env\`) inside the
+ environment used for command shim execution.
+asdf info Print OS, Shell and ASDF debug information.
+asdf version Print the currently installed version of ASDF
+asdf reshim <name> <version> Recreate shims for version of a package
+asdf shim-versions <command> List the plugins and versions that
+ provide a command
+asdf update Update asdf to the latest stable release
+asdf update --head Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs: https://asdf-vm.com
Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
A configuração do asdf
abrange tanto os arquivos .tool-versions
compartilháveis quanto as personalizações específicas do usuário com .asdfrc
e variáveis de ambiente.
Sempre que o arquivo .tool-versions
estiver presente em um diretório, as versões da ferramenta que ele declara serão usadas nesse diretório e em seus subdiretórios.
Configurações globais podem ser modificadas no arquivo $HOME/.tool-versions
O arquivo .tool-versions
se parece assim:
ruby 2.5.3\nnodejs 10.15.0
As versões podem estar no seguinte formato:
10.15.0
- uma versão real. Os plugins que suportam o download de binários farão o download de binários.ref:v1.0.2-a
ou ref:39cb398vb39
- tag/commit/branch para download pelo github e compilação um path costumizado e compipath:~/src/elixir
- um path para uma versão compilada e personalizada de uma ferramenta pronta para usar. Para uso por linguagens de desenvolvimento e outros.system
- faz com que asdf passe para a versão da ferramenta no sistema que não é gerenciada por asdf .Várias versões podem ser definidas, separando-as com um espaço. Por exemplo, para usar Python 3.7.2, e também Python 2.7.15, use a linha abaixo em seu arquivo .tool-versions
.
python 3.7.2 2.7.15 system
Para instalar todas as ferramentas definidas em .tool-versions
, execute o camando asdf install
sem argumentos no mesmo diretório de .tool-versions
.
Para isntalar somente uma ferramenta definida em .tool-versions
, execute o camando asdf install
sem argumentos no mesmo diretório de .tool-versions
. A ferramenta será instalada na versão especificada no arquivo .tool-versions
.
Edite o arquivo diretamente no diretório ou use asdf local
(ou asdf global
) para atualiza-lo.
$HOME/.asdfrc
Adicione um arquivo .asdfrc
ao seu diretório home e asdf usará as configurações especificadas no arquivo. O arquivo deve ser formatado assim:
legacy_version_file = yes
Configurações
legacy_version_file
- por padrão é no
. Se definido como yes
, fará com que os plug-ins que suportam esse recurso leiam os arquivos de versão usados por outros gerenciadores de versão (por exemplo, .ruby-version
no caso do rbenv
do Ruby).
use_release_candidates
- por padrão é no
. Se definido como yes
, fará com que o comando asdf update
atualize para o mais recente em vez da versão semântica mais recente.
always_keep_download
- por padrão é no
. Se definido como yes
, fará com que o asdf install
sempre mantenha o código-fonte ou binário baixado. Se definido como no
, o código fonte ou binário baixado por asdf install
será excluído após a instalação bem sucedida.
plugin_repository_last_check_duration
- por padrão é 60
min (1 hrs). Ele define a duração da última verificação do repositório de plugins asdf. Quando o comando asdf plugin add <nome>
, asdf plugin list all
for executado, ele verificará a duração da última atualização para atualizar o repositório. Se definido como 0
, ele atualizará o repositório de plugins asdf todas as vezes.
ASDF_CONFIG_FILE
- O padrão é ~ /.asdfrc
conforme descrito acima. Pode ser definido para qualquer local.ASDF_DEFAULT_TOOL_VERSIONS_FILENAME
- O nome do arquivo que armazena os nomes e versões das ferramentas. O padrão é .tool-versions
. Pode ser qualquer nome de arquivo válido. Normalmente você não deve substituir o valor padrão, a menos que deseja que o asdf ignore os arquivos .tool-versions
.ASDF_DIR
- O padrão é ~/.asdf
- Localização dos arquivos asdf
. Se você instalar asdf
em algum outro diretório, defina-o para esse diretório. Por exemplo, se você estiver instalando através do AUR, você deve definir isso para /opt/asdf-vm
.ASDF_DATA_DIR
- O padrão é ~/.asdf
- Local onde asdf
instala plugins, correções e instalações. Pode ser definido para qualquer local antes de fornecer asdf.sh
ou asdf.fish
mencionado na seção acima. Para Elvish, isso pode ser definido acima de use asdf
.Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
A configuração do asdf
abrange tanto os arquivos .tool-versions
compartilháveis quanto as personalizações específicas do usuário com .asdfrc
e variáveis de ambiente.
Sempre que o arquivo .tool-versions
estiver presente em um diretório, as versões da ferramenta que ele declara serão usadas nesse diretório e em seus subdiretórios.
Configurações globais podem ser modificadas no arquivo $HOME/.tool-versions
O arquivo .tool-versions
se parece assim:
ruby 2.5.3\nnodejs 10.15.0
As versões podem estar no seguinte formato:
10.15.0
- uma versão real. Os plugins que suportam o download de binários farão o download de binários.ref:v1.0.2-a
ou ref:39cb398vb39
- tag/commit/branch para download pelo github e compilação um path costumizado e compipath:~/src/elixir
- um path para uma versão compilada e personalizada de uma ferramenta pronta para usar. Para uso por linguagens de desenvolvimento e outros.system
- faz com que asdf passe para a versão da ferramenta no sistema que não é gerenciada por asdf .Várias versões podem ser definidas, separando-as com um espaço. Por exemplo, para usar Python 3.7.2, e também Python 2.7.15, use a linha abaixo em seu arquivo .tool-versions
.
python 3.7.2 2.7.15 system
Para instalar todas as ferramentas definidas em .tool-versions
, execute o camando asdf install
sem argumentos no mesmo diretório de .tool-versions
.
Para isntalar somente uma ferramenta definida em .tool-versions
, execute o camando asdf install
sem argumentos no mesmo diretório de .tool-versions
. A ferramenta será instalada na versão especificada no arquivo .tool-versions
.
Edite o arquivo diretamente no diretório ou use asdf local
(ou asdf global
) para atualiza-lo.
$HOME/.asdfrc
Adicione um arquivo .asdfrc
ao seu diretório home e asdf usará as configurações especificadas no arquivo. O arquivo deve ser formatado assim:
legacy_version_file = yes
Configurações
legacy_version_file
- por padrão é no
. Se definido como yes
, fará com que os plug-ins que suportam esse recurso leiam os arquivos de versão usados por outros gerenciadores de versão (por exemplo, .ruby-version
no caso do rbenv
do Ruby).
use_release_candidates
- por padrão é no
. Se definido como yes
, fará com que o comando asdf update
atualize para o mais recente em vez da versão semântica mais recente.
always_keep_download
- por padrão é no
. Se definido como yes
, fará com que o asdf install
sempre mantenha o código-fonte ou binário baixado. Se definido como no
, o código fonte ou binário baixado por asdf install
será excluído após a instalação bem sucedida.
plugin_repository_last_check_duration
- por padrão é 60
min (1 hrs). Ele define a duração da última verificação do repositório de plugins asdf. Quando o comando asdf plugin add <nome>
, asdf plugin list all
for executado, ele verificará a duração da última atualização para atualizar o repositório. Se definido como 0
, ele atualizará o repositório de plugins asdf todas as vezes.
ASDF_CONFIG_FILE
- O padrão é ~ /.asdfrc
conforme descrito acima. Pode ser definido para qualquer local.ASDF_DEFAULT_TOOL_VERSIONS_FILENAME
- O nome do arquivo que armazena os nomes e versões das ferramentas. O padrão é .tool-versions
. Pode ser qualquer nome de arquivo válido. Normalmente você não deve substituir o valor padrão, a menos que deseja que o asdf ignore os arquivos .tool-versions
.ASDF_DIR
- O padrão é ~/.asdf
- Localização dos arquivos asdf
. Se você instalar asdf
em algum outro diretório, defina-o para esse diretório. Por exemplo, se você estiver instalando através do AUR, você deve definir isso para /opt/asdf-vm
.ASDF_DATA_DIR
- O padrão é ~/.asdf
- Local onde asdf
instala plugins, correções e instalações. Pode ser definido para qualquer local antes de fornecer asdf.sh
ou asdf.fish
mencionado na seção acima. Para Elvish, isso pode ser definido acima de use asdf
.Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
A lista de comandos do núcleo asdf
é bastante pequena, mas pode facilitar muitos fluxos de trabalho.
Baseado no Guia de Introdução.
asdf exec <command> [args...]
Executa o comando shim para a versão atual
asdf env <command> [util]
asdf info
Um comando auxiliar para imprimir as informações de depuração do SO, Shell e asdf
. Compartilhe isso ao fazer um relatório de bug.
asdf reshim <name> <version>
Isso recria os shims para a versão atual de um pacote. Por padrão, os calços são criados por plugins durante a instalação de uma ferramenta. Algumas ferramentas como a npm CLI permitem a instalação global de executáveis, por exemplo, instalando Yarn via npm install -g fio
. Como este executável não foi instalado por meio do ciclo de vida do plug-in, ainda não existe shim para ele. asdf reshim nodejs <version>
forçará o recálculo de shims para quaisquer novos executáveis, como yarn
, para <version>
de nodejs
.
asdf shim-versions <command>
Lista os plugins e versões que fornecem shims para um comando.
Como exemplo, o Node.js vem com dois executáveis, node
e npm
. Quando muitas versões das ferramentas são instaladas com asdf-nodejs
shim-versions
pode retornar:
➜ asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
➜ asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
asdf
tem um comando embutido para atualização que depende do Git (nosso método de instalação recomendado). Se você instalou usando um método diferente, siga as etapas para esse método:
Method | Latest Stable Release | Latest commit on master |
---|---|---|
asdf (via Git) | asdf update | asdf update --head |
Homebrew | brew upgrade asdf | brew upgrade asdf --fetch-HEAD |
Pacman | Obter manualmente um novo PKGBUILD e reconstruir ou usar suas preferências de AUR. |
Para desinstalar asdf
siga os passos:
~/.bashrc
remova as linhas do asdf.sh
e seus complementos:. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
$HOME/.asdf
:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bash_profile
remova as linhas do asdf.sh
e remova seus complementos:. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
$HOME/.asdf
:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bashrc
remova as linhas do asdf.sh
e remova seus complementos:. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash
?> Os complementos precisam instruções de configuração do Homebrew e siga o guia de remoção.
brew uninstall asdf --force
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Caso esteja usando macOs Catalina ou mais recente, por padrão o shell é ZSH. Se não achar alguma configuração em seu ~/.bash_profile
talvez esteja em ~/.zshrc
em cada caso siga as intruções do ZSH.
~/.bash_profile
remova as linhas do asdf.sh
e remova seus complementos:. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash
?> Os complementos precisam instruções de configuração do Homebrew e siga o guia de remoção.
brew uninstall asdf --force
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bashrc
remova as linhas do asdf.sh
e seus complementos:. /opt/asdf-vm/asdf.sh
pacman -Rs asdf-vm
$HOME/.asdf
:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
remova as linhas do asdf.sh
:source ~/.asdf/asdf.fish
e remova os complementos de com esse comando:
rm -rf ~/.config/fish/completions/asdf.fish
$HOME/.asdf
:rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
remova as linhas do asdf.fish
:source "(brew --prefix asdf)"/libexec/asdf.fish
brew uninstall asdf --force
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
remova as linhas do asdf.fish
:source /opt/asdf-vm/asdf.fish
pacman -Rs asdf-vm
$HOME/.asdf
:rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
remova as linhas que importa o módulo asdf
:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
e desinstale o módulo asdf
com este comando:
rm -f ~/.config/elvish/lib/asdf.elv
$HOME/.asdf
:if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
remova as linhas que importa o módulo asdf
:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
e desinstale o módulo asdf
com este comando:
rm -f ~/.config/elvish/lib/asdf.elv
brew uninstall asdf --force
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
remova as linhas que importa o módulo asdf
:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
e desinstale o módulo asdf
com este comando:
rm -f ~/.config/elvish/lib/asdf.elv
pacman -Rs asdf-vm
$ HOME/.asdf
:if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
remova as linhas do asdf.sh
e seus complementos:. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit
Ou use ZSH Framework plugin.
$HOME/.asdf
:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
remova as linhas do asdf.sh
:. $(brew --prefix asdf)/libexec/asdf.sh
brew uninstall asdf --force
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
remova as linhas do asdf.sh
:. /opt/asdf-vm/asdf.sh
pacman -Rs asdf-vm
$HOME/.asdf
:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Tudo pronto! 🎉
`,42)]))}const g=i(l,[["render",h]]);export{c as __pageData,g as default}; diff --git a/assets/pt-br_manage_core.md.CTnvZ9A5.lean.js b/assets/pt-br_manage_core.md.CTnvZ9A5.lean.js new file mode 100644 index 00000000..e5e0f510 --- /dev/null +++ b/assets/pt-br_manage_core.md.CTnvZ9A5.lean.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"Core","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/manage/core.md","filePath":"pt-br/manage/core.md","lastUpdated":1687069487000}'),l={name:"pt-br/manage/core.md"};function h(n,s,p,d,k,o){return t(),a("div",null,s[0]||(s[0]=[e(`Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
A lista de comandos do núcleo asdf
é bastante pequena, mas pode facilitar muitos fluxos de trabalho.
Baseado no Guia de Introdução.
asdf exec <command> [args...]
Executa o comando shim para a versão atual
asdf env <command> [util]
asdf info
Um comando auxiliar para imprimir as informações de depuração do SO, Shell e asdf
. Compartilhe isso ao fazer um relatório de bug.
asdf reshim <name> <version>
Isso recria os shims para a versão atual de um pacote. Por padrão, os calços são criados por plugins durante a instalação de uma ferramenta. Algumas ferramentas como a npm CLI permitem a instalação global de executáveis, por exemplo, instalando Yarn via npm install -g fio
. Como este executável não foi instalado por meio do ciclo de vida do plug-in, ainda não existe shim para ele. asdf reshim nodejs <version>
forçará o recálculo de shims para quaisquer novos executáveis, como yarn
, para <version>
de nodejs
.
asdf shim-versions <command>
Lista os plugins e versões que fornecem shims para um comando.
Como exemplo, o Node.js vem com dois executáveis, node
e npm
. Quando muitas versões das ferramentas são instaladas com asdf-nodejs
shim-versions
pode retornar:
➜ asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
➜ asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
asdf
tem um comando embutido para atualização que depende do Git (nosso método de instalação recomendado). Se você instalou usando um método diferente, siga as etapas para esse método:
Method | Latest Stable Release | Latest commit on master |
---|---|---|
asdf (via Git) | asdf update | asdf update --head |
Homebrew | brew upgrade asdf | brew upgrade asdf --fetch-HEAD |
Pacman | Obter manualmente um novo PKGBUILD e reconstruir ou usar suas preferências de AUR. |
Para desinstalar asdf
siga os passos:
~/.bashrc
remova as linhas do asdf.sh
e seus complementos:. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
$HOME/.asdf
:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bash_profile
remova as linhas do asdf.sh
e remova seus complementos:. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
$HOME/.asdf
:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bashrc
remova as linhas do asdf.sh
e remova seus complementos:. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash
?> Os complementos precisam instruções de configuração do Homebrew e siga o guia de remoção.
brew uninstall asdf --force
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Caso esteja usando macOs Catalina ou mais recente, por padrão o shell é ZSH. Se não achar alguma configuração em seu ~/.bash_profile
talvez esteja em ~/.zshrc
em cada caso siga as intruções do ZSH.
~/.bash_profile
remova as linhas do asdf.sh
e remova seus complementos:. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash
?> Os complementos precisam instruções de configuração do Homebrew e siga o guia de remoção.
brew uninstall asdf --force
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bashrc
remova as linhas do asdf.sh
e seus complementos:. /opt/asdf-vm/asdf.sh
pacman -Rs asdf-vm
$HOME/.asdf
:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
remova as linhas do asdf.sh
:source ~/.asdf/asdf.fish
e remova os complementos de com esse comando:
rm -rf ~/.config/fish/completions/asdf.fish
$HOME/.asdf
:rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
remova as linhas do asdf.fish
:source "(brew --prefix asdf)"/libexec/asdf.fish
brew uninstall asdf --force
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
remova as linhas do asdf.fish
:source /opt/asdf-vm/asdf.fish
pacman -Rs asdf-vm
$HOME/.asdf
:rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
remova as linhas que importa o módulo asdf
:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
e desinstale o módulo asdf
com este comando:
rm -f ~/.config/elvish/lib/asdf.elv
$HOME/.asdf
:if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
remova as linhas que importa o módulo asdf
:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
e desinstale o módulo asdf
com este comando:
rm -f ~/.config/elvish/lib/asdf.elv
brew uninstall asdf --force
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
remova as linhas que importa o módulo asdf
:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
e desinstale o módulo asdf
com este comando:
rm -f ~/.config/elvish/lib/asdf.elv
pacman -Rs asdf-vm
$ HOME/.asdf
:if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
remova as linhas do asdf.sh
e seus complementos:. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit
Ou use ZSH Framework plugin.
$HOME/.asdf
:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
remova as linhas do asdf.sh
:. $(brew --prefix asdf)/libexec/asdf.sh
brew uninstall asdf --force
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
remova as linhas do asdf.sh
:. /opt/asdf-vm/asdf.sh
pacman -Rs asdf-vm
$HOME/.asdf
:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Tudo pronto! 🎉
`,42)]))}const g=i(l,[["render",h]]);export{c as __pageData,g as default}; diff --git a/assets/pt-br_manage_plugins.md.CuNF9gHf.js b/assets/pt-br_manage_plugins.md.CuNF9gHf.js new file mode 100644 index 00000000..4f3656fd --- /dev/null +++ b/assets/pt-br_manage_plugins.md.CuNF9gHf.js @@ -0,0 +1,11 @@ +import{_ as a,c as i,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"Plugins","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/manage/plugins.md","filePath":"pt-br/manage/plugins.md","lastUpdated":1687069487000}'),n={name:"pt-br/manage/plugins.md"};function l(p,s,o,d,h,r){return t(),i("div",null,s[0]||(s[0]=[e(`Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
Plugins são como asdf
sabe lidar com diferentes ferramentas, tais quais Node.js, Ruby, Elixir etc.
Veja Criando Plugins para a API do plugin usada para suportar mais ferramentas.
Adicione os plugins via sua Url Git:
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm
ou pelo nome abreviado dentro do repositório de plugins:
asdf plugin add <name>
+# asdf plugin add erlang
Recommendation
Prefira o método mais longo git-url
, pois ele é independente do repositório de nome abreviado.
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
asdf plugin list --urls
+# asdf plugin list
+# java https://github.com/halcyon/asdf-java.git
+# nodejs https://github.com/asdf-vm/asdf-nodejs.git
asdf plugin list all
Veja Plugins Shortname Index para toda a lista de nomes curtos de plugins.
asdf plugin update --all
Se você quiser atualizar um pacote específico, apenas use.
asdf plugin update <name>
+# asdf plugin update erlang
Esta atualização irá buscar o último commit na branch padrão no origin de seu respositório. Plugins e atualizações das versões estão sendo desenvolvidas (#916)
asdf plugin remove <name>
+# asdf plugin remove erlang
Removendo o plugin irá remover todas as instalações feitas com o plugin. Isso pode ser usado como um atalho para apagar/remover sujeiras de versões não utilizadas de uma ferramenta.
O nome abreviado do repositório é sincronizado em seu máquina local e periodicamente atualizado. Esse período pode ser determinado com o seguinte método:
asdf plugin add <name>
ou asdf plugin list all
disparam a sincronizaçãoX
minutosX
por padrão é 60
, mas pode ser mudado em .asdfrc
via as opções do plugin_repository_last_check_duration
. Seja mais em asdf documentação de configuração.Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
Plugins são como asdf
sabe lidar com diferentes ferramentas, tais quais Node.js, Ruby, Elixir etc.
Veja Criando Plugins para a API do plugin usada para suportar mais ferramentas.
Adicione os plugins via sua Url Git:
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm
ou pelo nome abreviado dentro do repositório de plugins:
asdf plugin add <name>
+# asdf plugin add erlang
Recommendation
Prefira o método mais longo git-url
, pois ele é independente do repositório de nome abreviado.
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
asdf plugin list --urls
+# asdf plugin list
+# java https://github.com/halcyon/asdf-java.git
+# nodejs https://github.com/asdf-vm/asdf-nodejs.git
asdf plugin list all
Veja Plugins Shortname Index para toda a lista de nomes curtos de plugins.
asdf plugin update --all
Se você quiser atualizar um pacote específico, apenas use.
asdf plugin update <name>
+# asdf plugin update erlang
Esta atualização irá buscar o último commit na branch padrão no origin de seu respositório. Plugins e atualizações das versões estão sendo desenvolvidas (#916)
asdf plugin remove <name>
+# asdf plugin remove erlang
Removendo o plugin irá remover todas as instalações feitas com o plugin. Isso pode ser usado como um atalho para apagar/remover sujeiras de versões não utilizadas de uma ferramenta.
O nome abreviado do repositório é sincronizado em seu máquina local e periodicamente atualizado. Esse período pode ser determinado com o seguinte método:
asdf plugin add <name>
ou asdf plugin list all
disparam a sincronizaçãoX
minutosX
por padrão é 60
, mas pode ser mudado em .asdfrc
via as opções do plugin_repository_last_check_duration
. Seja mais em asdf documentação de configuração.Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
asdf install <name> <version>
+# asdf install erlang 17.3
Se um plugin suporta o download e compilação do código-fonte, você pode especificar ref:foo
no qual foo
é uma 'branch' especifica, 'tag', ou 'commit'. Você também precisará usar o mesmo nome e referência ao desinstalar.
asdf install <name> latest
+# asdf install erlang latest
Instale a última versão estável que inicia com um texto.
asdf install <name> latest:<version>
+# asdf install erlang latest:17
asdf list <name>
+# asdf list erlang
Limite as versões que inicie com um determinado texto.
asdf list <name> <version>
+# asdf list erlang 17
asdf list all <name>
+# asdf list all erlang
Limite as versões que inicie com um determinado texto.
asdf list all <name> <version>
+# asdf list all erlang 17
asdf latest <name>
+# asdf latest erlang
Mostrar última versão estável que inicie com um determinado texto.
asdf latest <name> <version>
+# asdf latest erlang 17
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest
global
escreve a versão para $HOME/.tool-versions
.
shell
selecione a versão na variável de ambiente ASDF_\${LANG}_VERSION
, para a atual seção do shell.
local
escreve a versão para $PWD/.tool-versions
, crie se necessário .
Veja em .tool-versions
arquivo de seleção de configuração para mais detalhes.
Alternativa
Se você quiser selecionar a versão atual do seu shell ou para executar um comando em uma versão específica de sua ferramenta, você pode selecionar a versão na variável de ambiente ASDF_\${TOOL}_VERSION
.
O seguinte exemplo executa os testes em um projeto Elixir na versão 1.4.0
. O formato da versão é o mesmo suportado pelo arquivo .tool-versions
.
ASDF_ELIXIR_VERSION=1.4.0 mix test
Para usar o sistema de versão da ferramenta <name>
inicie um gerenciador de versões do asdf para selecionar a versão na ferramenta do system
.
Selecione o sistema com global
, local
ou shell
Set system with either global
, local
or shell
conforme descrito em Selecionar versão atual.
asdf local <name> system
+# asdf local python system
asdf current
+# asdf current
+# erlang 17.3 (set by /Users/kim/.tool-versions)
+# nodejs 6.11.5 (set by /Users/kim/cool-node-project/.tool-versions)
+
+asdf current <name>
+# asdf current erlang
+# 17.3 (set by /Users/kim/.tool-versions)
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3
Quando asdf instala um pacote é criado shims para cada programa executado no pacote do diretório $ASDF_DATA_DIR/shims
(padrão ~/.asdf/shims
). Esse diretório começa no $PATH
(pelos asdf.sh
, asdf.fish
, etc) é como o programa instalado é disponibilizado no ambiente do sistema.
Os shims em si são atalhos simples que executam um programa auxiliar asdf exec
passando o nome do plugin e o caminho para o executável no pacote instalado que o shim está contido.
O asdf exec
ajuda a determinar a versão do pacote usado (como especificado no arquivo .tool-versions
, pelo asdf local ...
ou asdf global ...
), o final do path do executavél no pacote instalado no diretório (pode ser manipulado pelo exec-path
no callback do plugin) e o ambiente executado em (também fornecido pelo plugin - exec-env
) e finalmente executado.
Observação
Observe que, como este sistema usa chamadas exec
, qualquer scripts no pacote devem ser fornecidos pelo shell, a instancia em execução precisa ser aessado diretamente ao invés do shim. Os dois comandos do asdf: which
e where
pode ajudar com o retorno do caminho para o pacote instalado:
# retorna o 'path' da versão atual em execução
+source $(asdf which \${PLUGIN})/../script.sh
+
+# retorna o 'path' do pacote instalado no diretório
+source $(asdf where \${PLUGIN} $(asdf current \${PLUGIN}))/bin/script.sh
Se por algum motivo você deseja ignorar shims do asdf ou deseja que suas variáveis de ambiente sejam definidas automaticamente ao entrar no diretório do seu projeto, pode ser útil o asdf-direnv. Verifique o README para mais detalhes.
`,46)]))}const g=a(l,[["render",n]]);export{c as __pageData,g as default}; diff --git a/assets/pt-br_manage_versions.md.Ctc109hL.lean.js b/assets/pt-br_manage_versions.md.Ctc109hL.lean.js new file mode 100644 index 00000000..9739bf15 --- /dev/null +++ b/assets/pt-br_manage_versions.md.Ctc109hL.lean.js @@ -0,0 +1,30 @@ +import{_ as a,c as i,a2 as e,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"Versões","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/manage/versions.md","filePath":"pt-br/manage/versions.md","lastUpdated":1687069487000}'),l={name:"pt-br/manage/versions.md"};function n(h,s,p,k,d,o){return t(),i("div",null,s[0]||(s[0]=[e(`Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
asdf install <name> <version>
+# asdf install erlang 17.3
Se um plugin suporta o download e compilação do código-fonte, você pode especificar ref:foo
no qual foo
é uma 'branch' especifica, 'tag', ou 'commit'. Você também precisará usar o mesmo nome e referência ao desinstalar.
asdf install <name> latest
+# asdf install erlang latest
Instale a última versão estável que inicia com um texto.
asdf install <name> latest:<version>
+# asdf install erlang latest:17
asdf list <name>
+# asdf list erlang
Limite as versões que inicie com um determinado texto.
asdf list <name> <version>
+# asdf list erlang 17
asdf list all <name>
+# asdf list all erlang
Limite as versões que inicie com um determinado texto.
asdf list all <name> <version>
+# asdf list all erlang 17
asdf latest <name>
+# asdf latest erlang
Mostrar última versão estável que inicie com um determinado texto.
asdf latest <name> <version>
+# asdf latest erlang 17
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest
global
escreve a versão para $HOME/.tool-versions
.
shell
selecione a versão na variável de ambiente ASDF_\${LANG}_VERSION
, para a atual seção do shell.
local
escreve a versão para $PWD/.tool-versions
, crie se necessário .
Veja em .tool-versions
arquivo de seleção de configuração para mais detalhes.
Alternativa
Se você quiser selecionar a versão atual do seu shell ou para executar um comando em uma versão específica de sua ferramenta, você pode selecionar a versão na variável de ambiente ASDF_\${TOOL}_VERSION
.
O seguinte exemplo executa os testes em um projeto Elixir na versão 1.4.0
. O formato da versão é o mesmo suportado pelo arquivo .tool-versions
.
ASDF_ELIXIR_VERSION=1.4.0 mix test
Para usar o sistema de versão da ferramenta <name>
inicie um gerenciador de versões do asdf para selecionar a versão na ferramenta do system
.
Selecione o sistema com global
, local
ou shell
Set system with either global
, local
or shell
conforme descrito em Selecionar versão atual.
asdf local <name> system
+# asdf local python system
asdf current
+# asdf current
+# erlang 17.3 (set by /Users/kim/.tool-versions)
+# nodejs 6.11.5 (set by /Users/kim/cool-node-project/.tool-versions)
+
+asdf current <name>
+# asdf current erlang
+# 17.3 (set by /Users/kim/.tool-versions)
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3
Quando asdf instala um pacote é criado shims para cada programa executado no pacote do diretório $ASDF_DATA_DIR/shims
(padrão ~/.asdf/shims
). Esse diretório começa no $PATH
(pelos asdf.sh
, asdf.fish
, etc) é como o programa instalado é disponibilizado no ambiente do sistema.
Os shims em si são atalhos simples que executam um programa auxiliar asdf exec
passando o nome do plugin e o caminho para o executável no pacote instalado que o shim está contido.
O asdf exec
ajuda a determinar a versão do pacote usado (como especificado no arquivo .tool-versions
, pelo asdf local ...
ou asdf global ...
), o final do path do executavél no pacote instalado no diretório (pode ser manipulado pelo exec-path
no callback do plugin) e o ambiente executado em (também fornecido pelo plugin - exec-env
) e finalmente executado.
Observação
Observe que, como este sistema usa chamadas exec
, qualquer scripts no pacote devem ser fornecidos pelo shell, a instancia em execução precisa ser aessado diretamente ao invés do shim. Os dois comandos do asdf: which
e where
pode ajudar com o retorno do caminho para o pacote instalado:
# retorna o 'path' da versão atual em execução
+source $(asdf which \${PLUGIN})/../script.sh
+
+# retorna o 'path' do pacote instalado no diretório
+source $(asdf where \${PLUGIN} $(asdf current \${PLUGIN}))/bin/script.sh
Se por algum motivo você deseja ignorar shims do asdf ou deseja que suas variáveis de ambiente sejam definidas automaticamente ao entrar no diretório do seu projeto, pode ser útil o asdf-direnv. Verifique o README para mais detalhes.
`,46)]))}const g=a(l,[["render",n]]);export{c as __pageData,g as default}; diff --git a/assets/pt-br_more_community-projects.md.C3m600b2.js b/assets/pt-br_more_community-projects.md.C3m600b2.js new file mode 100644 index 00000000..16aff5bf --- /dev/null +++ b/assets/pt-br_more_community-projects.md.C3m600b2.js @@ -0,0 +1 @@ +import{_ as t,c as o,a2 as r,o as a}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"Community Projects","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/more/community-projects.md","filePath":"pt-br/more/community-projects.md","lastUpdated":1687069487000}'),s={name:"pt-br/more/community-projects.md"};function c(n,e,i,m,d,l){return a(),o("div",null,e[0]||(e[0]=[r('Here are some community projects related to asdf
:
Note
asdf core do not own these projects or their code. asdf core are not responsible for the quality or security as they relate to those listed here.
Here are some community projects related to asdf
:
Note
asdf core do not own these projects or their code. asdf core are not responsible for the quality or security as they relate to those listed here.
Aqui estão algumas perguntas comuns sobre asdf
.
WSL1 (Windows Subsystem for Linux 1) não é oficialmente suportado. Alguns aspectos do asdf
podem não funcionar corretamente. Não temos a intenção de adicionar suporte oficial para WSL1.
WSL2 (Subsistema Windows para Linux 2) deve funcionar usando as instruções de configuração e dependência para a distribuição WSL escolhida.
É importante ressaltar que o WSL2 apenas deve funcionar corretamente quando o diretório de trabalho atual é uma unidade Unix e não uma unidade Windows vinculada.
Pretendemos executar o conjunto de testes no WSL2 quando o suporte ao host runner estiver disponível nas Ações do GitHub; atualmente, esse não parece ser o caso.
Acabei de instalar o
npm -g yarn
, mas não consigo executar oyarn
. O que da?
asdf
usa shims para gerenciar executáveis. Aqueles instalados por plug-ins têm shims criados automaticamente, enquanto a instalação de executáveis por meio de uma ferramenta gerenciada asdf
exigirá que você notifique oasdf
sobre a necessidade de criar shims. Neste caso, para criar um shim para Yarn. Veja a documentação do comando [asdf reshim
](/ manage / core.md # reshim).
Se asdf reshim
não está resolvendo seu problema, então é mais provável devido ao sourcing deasdf.sh
ou asdf.fish
não estar no ** BOTTOM ** de seu arquivo de configuração Shell (.bash_profile
, .zshrc
, config.fish
, etc). Ele precisa ser fornecido DEPOIS de você definir seu $PATH
e DEPOIS de ter fornecido seu framework (oh-meu-zsh etc), se houver.
Aqui estão algumas perguntas comuns sobre asdf
.
WSL1 (Windows Subsystem for Linux 1) não é oficialmente suportado. Alguns aspectos do asdf
podem não funcionar corretamente. Não temos a intenção de adicionar suporte oficial para WSL1.
WSL2 (Subsistema Windows para Linux 2) deve funcionar usando as instruções de configuração e dependência para a distribuição WSL escolhida.
É importante ressaltar que o WSL2 apenas deve funcionar corretamente quando o diretório de trabalho atual é uma unidade Unix e não uma unidade Windows vinculada.
Pretendemos executar o conjunto de testes no WSL2 quando o suporte ao host runner estiver disponível nas Ações do GitHub; atualmente, esse não parece ser o caso.
Acabei de instalar o
npm -g yarn
, mas não consigo executar oyarn
. O que da?
asdf
usa shims para gerenciar executáveis. Aqueles instalados por plug-ins têm shims criados automaticamente, enquanto a instalação de executáveis por meio de uma ferramenta gerenciada asdf
exigirá que você notifique oasdf
sobre a necessidade de criar shims. Neste caso, para criar um shim para Yarn. Veja a documentação do comando [asdf reshim
](/ manage / core.md # reshim).
Se asdf reshim
não está resolvendo seu problema, então é mais provável devido ao sourcing deasdf.sh
ou asdf.fish
não estar no ** BOTTOM ** de seu arquivo de configuração Shell (.bash_profile
, .zshrc
, config.fish
, etc). Ele precisa ser fornecido DEPOIS de você definir seu $PATH
e DEPOIS de ter fornecido seu framework (oh-meu-zsh etc), se houver.
Eu (@HashNuke), febre alta, resfriado e tosse.
Copyright 2014 até o final dos tempos (MIT License)
Veja em lista de contribuidores 🙏 no GitHub
',7)]))}const f=r(s,[["render",i]]);export{b as __pageData,f as default}; diff --git a/assets/pt-br_more_thanks.md.BziNXVH9.lean.js b/assets/pt-br_more_thanks.md.BziNXVH9.lean.js new file mode 100644 index 00000000..787afdd7 --- /dev/null +++ b/assets/pt-br_more_thanks.md.BziNXVH9.lean.js @@ -0,0 +1 @@ +import{_ as r,c as t,a2 as a,o}from"./chunks/framework.C9NVOr0y.js";const b=JSON.parse('{"title":"Créditos","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/more/thanks.md","filePath":"pt-br/more/thanks.md","lastUpdated":1671778129000}'),s={name:"pt-br/more/thanks.md"};function i(n,e,h,l,d,u){return o(),t("div",null,e[0]||(e[0]=[a('Eu (@HashNuke), febre alta, resfriado e tosse.
Copyright 2014 até o final dos tempos (MIT License)
Veja em lista de contribuidores 🙏 no GitHub
',7)]))}const f=r(s,[["render",i]]);export{b as __pageData,f as default}; diff --git a/assets/pt-br_plugins_create.md.CnPY6mOB.js b/assets/pt-br_plugins_create.md.CnPY6mOB.js new file mode 100644 index 00000000..26743f82 --- /dev/null +++ b/assets/pt-br_plugins_create.md.CnPY6mOB.js @@ -0,0 +1,35 @@ +import{_ as s,c as e,a2 as i,o}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"Criar um plug-in","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/plugins/create.md","filePath":"pt-br/plugins/create.md","lastUpdated":1704804447000}'),n={name:"pt-br/plugins/create.md"};function t(l,a,p,d,r,h){return o(),e("div",null,a[0]||(a[0]=[i(`Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
Um plugin é um repositório git, com alguns scripts executáveis, para dar suporte ao versionamento de outra linguagem ou ferramenta. Esses scripts são executados quando os comandos list-all
, install
ou uninstall
são executados. Você pode definir ou desmarcar env vars e fazer qualquer coisa necessária para configurar o ambiente para a ferramenta.
bin/list-all
- lista todas as versões instaláveisbin/download
- baixe o código fonte ou binário para a versão especificadabin/install
- instala a versão especificadaTodos os scripts, exceto bin/list-all
, terão acesso aos seguintes env vars para agir:
ASDF_INSTALL_TYPE
- version
ou ref
ASDF_INSTALL_VERSION
- se ASDF_INSTALL_TYPE
é version
então este será o número da versão. Caso contrário, será o git ref que será passado. Pode apontar para uma tag/commit/branch no repositório.ASDF_INSTALL_PATH
- o diretório onde foi instalado (ou deve ser instalado no caso do script bin/install
)Essas variáveis de ambiente adicionais estarão disponíveis para o script bin/install
:
ASDF_CONCURRENCY
- o número de núcleos a serem usados ao compilar o código-fonte. Útil para definir make -j
.ASDF_DOWNLOAD_PATH
- o caminho para onde o código fonte ou binário foi baixado pelo script bin/download
.Essas variáveis de ambiente adicionais estarão disponíveis para o script bin/download
:
ASDF_DOWNLOAD_PATH
- o caminho para onde o código-fonte ou binário deve ser baixado.Deve imprimir uma string com uma lista de versões separadas por espaço. A saída de exemplo seria a seguinte:
1.0.1 1.0.2 1.3.0 1.4
Observe que a versão mais recente deve ser listada por último para que apareça mais próxima do prompt do usuário. Isso é útil já que o comando list-all
imprime cada versão em sua própria linha. Se houver muitas versões, é possível que as primeiras versões fiquem fora da tela.
Se as versões estiverem sendo extraídas da página de lançamentos em um site, é recomendável não classificar as versões, se possível. Muitas vezes as versões já estão na ordem correta ou, na ordem inversa, nesse caso algo como tac
deve ser suficiente. Se você precisar classificar as versões manualmente, não poderá confiar em sort -V
, pois não é suportado no OSX. Uma função de classificação alternativa como esta é uma escolha melhor.
Este script deve baixar o código fonte ou binário, no caminho contido na variável de ambiente ASDF_DOWNLOAD_PATH
. Se o código-fonte ou binário baixado estiver compactado, apenas o código-fonte ou binário descompactado poderá ser colocado no diretório ASDF_DOWNLOAD_PATH
.
O script deve sair com um status de 0
quando o download for bem-sucedido. Se o download falhar, o script deve sair com qualquer status de saída diferente de zero.
Se possível, o script deve apenas colocar arquivos no ASDF_DOWNLOAD_PATH
. Se o download falhar, nenhum arquivo deve ser colocado no diretório.
Se este script não estiver presente, o asdf assumirá que o script bin/install
está presente e fará o download e instalará a versão. asdf só funciona sem este script para suportar plugins legados. Todos os plugins devem incluir este script e, eventualmente, o suporte para plugins legados será removido.
Este script deve instalar a versão, no caminho mencionado em ASDF_INSTALL_PATH
. Por padrão, o asdf criará shims para qualquer arquivo em $ASDF_INSTALL_PATH/bin
(isso pode ser personalizado com o script opcional bin/list-bin-paths).
O script de instalação deve sair com um status de 0
quando a instalação for bem-sucedida. Se a instalação falhar, o script deve sair com qualquer status de saída diferente de zero.
Se possível, o script deve apenas colocar os arquivos no diretório ASDF_INSTALL_PATH
uma vez que a compilação e instalação da ferramenta são consideradas bem sucedidas pelo script de instalação. asdf verifica a existência do diretório ASDF_INSTALL_PATH
para determinar se essa versão da ferramenta está instalado. Se o diretório ASDF_INSTALL_PATH
for preenchido no início do processo de instalação, outros comandos asdf executados em outros terminais durante a instalação podem considerar essa versão da ferramenta instalada, mesmo quando não estiver totalmente instalada.
Se você quiser que seu plugin funcione com asdf versão 0.7._ e anterior e versão 0.8._ e mais recente, verifique a presença da variável de ambiente ASDF_DOWNLOAD_PATH
. Se não estiver definido, baixe o código-fonte no retorno de chamada bin/install. Se estiver definido, suponha que o script bin/download
já tenha baixado.
Este não é um script de retorno de chamada, mas sim um conjunto de scripts de retorno de chamada que imprimem documentação diferente para STDOUT. Os scripts de retorno de chamada possíveis estão listados abaixo. Observe que bin/help.overview
é um caso especial, pois deve estar presente para que qualquer saída de ajuda seja exibida para o script.
bin/help.overview
- Este script deve gerar uma descrição geral sobre o plugin e a ferramenta que está sendo gerenciada. Nenhum título deve ser impresso, pois o asdf imprimirá títulos. A saída pode ser um texto de formato livre, mas idealmente apenas um parágrafo curto. Este script deve estar presente se você quiser que o asdf forneça informações de ajuda para seu plugin. Todos os outros scripts de retorno de chamada de ajuda são opcionais.bin/help.deps
- Esse script deve gerar a lista de dependências adaptadas ao sistema operacional. Uma dependência por linha.bin/help.config
- Este script deve imprimir qualquer configuração obrigatória ou opcional que possa estar disponível para o plug-in e a ferramenta. Quaisquer variáveis de ambiente ou outros sinalizadores necessários para instalar ou compilar a ferramenta (para o sistema operacional dos usuários quando possível). A saída pode ser texto de formato livre.bin/help.links
- Esta deve ser uma lista de links relevantes para o plug-in e a ferramenta (mais uma vez, adaptados ao sistema operacional atual, quando possível). Um link por linha. As linhas podem estar no formato <title>: <link>
ou apenas <link>
.Cada um desses scripts deve adaptar sua saída ao sistema operacional atual. Por exemplo, quando no Ubuntu, o script deps pode gerar as dependências como pacotes apt-get que devem ser instalados. O script também deve adaptar sua saída ao valor de ASDF_INSTALL_VERSION
e ASDF_INSTALL_TYPE
quando as variáveis forem definidas. Eles são opcionais e nem sempre serão definidos.
O script de retorno de chamada de ajuda NÃO DEVE gerar nenhuma informação que já esteja coberta na documentação principal do asdf-vm. As informações gerais de uso do asdf não devem estar presentes.
Liste os executáveis para a versão especificada da ferramenta. Deve imprimir uma string com uma lista separada por espaços de caminhos de diretórios que contêm executáveis. Os caminhos devem ser relativos ao caminho de instalação passado. A saída de exemplo seria:
bin tools veggies
Isso instruirá o asdf a criar shims para os arquivos em <install-path>/bin
, <install-path>/tools
e <install-path>/veggies
Se este script não for especificado, o asdf procurará o diretório bin
em uma instalação e criará shims para eles.
Configure o env para executar os binários no pacote.
Obtenha o caminho executável para a versão especificada da ferramenta. Deve imprimir uma string com o caminho executável relativo. Isso permite que o plug-in substitua condicionalmente o caminho executável especificado do shim, caso contrário, retorne o caminho padrão especificado pelo shim.
Usage:
+ plugin/bin/exec-path <install-path> <command> <executable-path>
+
+Example Call:
+ ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"
+
+Output:
+ bin/foox
Desinstala uma versão específica de uma ferramenta.
Registre arquivos setter adicionais para este plugin. Deve imprimir uma string com uma lista de nomes de arquivos separados por espaços.
.ruby-version .rvmrc
Nota: Isso só se aplica a usuários que habilitaram a opção legacy_version_file
em seu ~/.asdfrc
.
Isso pode ser usado para analisar ainda mais o arquivo legado encontrado pelo asdf. Se o parse-legacy-file
não for implementado, o asdf simplesmente irá cat o arquivo para determinar a versão. O script receberá o caminho do arquivo como seu primeiro argumento.
Isso pode ser usado para executar qualquer ação pós-instalação depois que o plug-in for adicionado ao asdf.
O script tem acesso ao caminho em que o plugin foi instalado (\${ASDF_PLUGIN_PATH}
) e o URL de origem (\${ASDF_PLUGIN_SOURCE_URL}
), se algum foi usado.
Veja também os ganchos relacionados:
pre_asdf_plugin_add
pre_asdf_plugin_add_\${plugin_name}
post_asdf_plugin_add
post_asdf_plugin_add_\${plugin_name}
Isso pode ser usado para executar qualquer ação de pré-remoção antes que o plug-in seja removido do asdf.
O script tem acesso ao caminho em que o plugin foi instalado (\${ASDF_PLUGIN_PATH}
).
Veja também os ganchos relacionados:
pre_asdf_plugin_remove
pre_asdf_plugin_remove_\${plugin_name}
post_asdf_plugin_remove
post_asdf_plugin_remove_\${plugin_name}
É possível que plugins definam novos comandos asdf fornecendo scripts ou executáveis lib/commands/command*.bash
que será chamado usando a interface de linha de comando asdf usando o nome do plug-in como um subcomando.
Por exemplo, suponha que um plugin foo
tenha:
foo/
+ lib/commands/
+ command.bash
+ command-bat.bash
+ command-bat-man.bash
+ command-help.bash
Os usuários agora podem executar
$ asdf foo # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash\`
+$ asdf foo bar # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar\`
+$ asdf foo help # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash\`
+$ asdf foo bat man # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash\`
+$ asdf foo bat baz # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz\`
Os autores de plugins podem usar esse recurso para fornecer utilitários relacionados às suas ferramentas, ou até mesmo criar plugins que são apenas novas extensões de comando para o próprio asdf.
Quando invocados, se os comandos de extensão não tiverem seus bits executáveis definidos, eles serão originado como scripts bash, tendo todas as funções de $ASDF_DIR/lib/utils.bash
disponíveis. Além disso, o $ASDF_CMD_FILE
resolve para o caminho completo do arquivo que está sendo originado. Se o bit executável estiver definido, eles são apenas executados e substituem a execução do asdf.
Um bom exemplo desse recurso é para plugins como haxe
que fornece o asdf haxe neko-dylibs-link
para corrigir um problema onde os executáveis haxe esperam encontrar bibliotecas dinâmicas relativas ao diretório executável.
Se o seu plug-in fornecer um comando de extensão asdf, certifique-se de mencioná-lo no README do seu plug-in.
POR FAVOR, use este recurso apenas se for absolutamente necessário
asdf permite modelos de calços personalizados. Para um executável chamado foo
, se houver um arquivo shims/foo
no plug-in, o asdf copiará esse arquivo em vez de usar seu modelo padrão de shim.
Isso deve ser usado com sabedoria. Por enquanto AFAIK, está sendo usado apenas no plugin Elixir, porque um executável também é lido como um arquivo Elixir, além de ser apenas um executável. O que torna impossível usar o calço bash padrão.
asdf
contém o comando plugin-test
para testar seu plugin. Você pode usá-lo da seguinte forma
asdf plugin test <plugin-name> <plugin-url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git-ref>] [test-command*]
Apenas os dois primeiros argumentos são necessários. Se _version for especificado, a ferramenta será instalada com essa versão específica. O padrão é o que retorna asdf latest <plugin-name>
. Se git-ref for especificado, o plug-in em si é verificado nesse commit/branch/tag, útil para testar um pull-request no CI do seu plug-in. O padrão é o branch default do repositório do plugin.
Os argumentos Rest são considerados o comando a ser executado para garantir que a ferramenta instalada funcione corretamente. Normalmente seria algo que leva --version
ou --help
. Por exemplo, para testar o plugin NodeJS, podemos executar
asdf plugin test nodejs https://github.com/asdf-vm/asdf-nodejs.git node --version
É altamente recomendável que você teste seu plug-in em um ambiente CI e verifique se ele funciona no Linux e no OSX.
O repositório asdf-vm/actions fornece uma ação do GitHub para testar seus plugins hospedados no github.
steps:
+ - name: asdf_plugin_test
+ uses: asdf-vm/actions/plugin-test@v1
+ with:
+ command: "my_tool --version"
+ env:
+ GITHUB_API_TOKEN: \${{ secrets.GITHUB_TOKEN }} # automatically provided
Aqui está um arquivo .travis.yml
de amostra, personalize-o de acordo com suas necessidades
language: c
+script: asdf plugin test nodejs $TRAVIS_BUILD_DIR 'node --version'
+before_script:
+ - git clone https://github.com/asdf-vm/asdf.git asdf
+ - . asdf/asdf.sh
+os:
+ - linux
+ - osx
Notas: Ao usar outro IC, você precisará verificar qual variável mapeia para o caminho do repositório.
Você também tem a opção de passar um caminho relativo para plugin-test
.
Por exemplo, se o script de teste for executado no diretório: asdf plugin test nodejs . 'node --version'
.
Se o list-all
do seu plug-in depender do acesso à API do GitHub, certifique-se de fornecer um token de autorização ao acessá-lo, caso contrário, seus testes podem falhar devido à limitação de taxa.
Para fazer isso, crie um novo token pessoal com apenas acesso public_repo
.
Em seguida, nas configurações de compilação do travis.ci, adicione uma variável de ambiente secure para ela chamada algo como GITHUB_API_TOKEN
. E NUNCA publique seu token em seu código.
Finalmente, adicione algo como o seguinte para bin/list-all
cmd="curl -s"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"
asdf
pode facilmente instalar plugins especificando o url do repositório de plugins, por exemplo. plugin add my-plugin https://github.com/user/asdf-my-plugin.git
.
Para facilitar para seus usuários, você pode adicionar seu plugin ao repositório oficial de plugins para ter seu plugin listado e facilmente instalável usando um comando mais curto, por exemplo asdf plugin add my-plugin
.
Siga as instruções no repositório de plugins: asdf-vm/asdf-plugins.
`,102)]))}const k=s(n,[["render",t]]);export{u as __pageData,k as default}; diff --git a/assets/pt-br_plugins_create.md.CnPY6mOB.lean.js b/assets/pt-br_plugins_create.md.CnPY6mOB.lean.js new file mode 100644 index 00000000..26743f82 --- /dev/null +++ b/assets/pt-br_plugins_create.md.CnPY6mOB.lean.js @@ -0,0 +1,35 @@ +import{_ as s,c as e,a2 as i,o}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"Criar um plug-in","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/plugins/create.md","filePath":"pt-br/plugins/create.md","lastUpdated":1704804447000}'),n={name:"pt-br/plugins/create.md"};function t(l,a,p,d,r,h){return o(),e("div",null,a[0]||(a[0]=[i(`Hi, we've recently migrated our docs and added some new pages. If you would like to help translate this page, see the "Edit this page" link at the bottom of the page.
Um plugin é um repositório git, com alguns scripts executáveis, para dar suporte ao versionamento de outra linguagem ou ferramenta. Esses scripts são executados quando os comandos list-all
, install
ou uninstall
são executados. Você pode definir ou desmarcar env vars e fazer qualquer coisa necessária para configurar o ambiente para a ferramenta.
bin/list-all
- lista todas as versões instaláveisbin/download
- baixe o código fonte ou binário para a versão especificadabin/install
- instala a versão especificadaTodos os scripts, exceto bin/list-all
, terão acesso aos seguintes env vars para agir:
ASDF_INSTALL_TYPE
- version
ou ref
ASDF_INSTALL_VERSION
- se ASDF_INSTALL_TYPE
é version
então este será o número da versão. Caso contrário, será o git ref que será passado. Pode apontar para uma tag/commit/branch no repositório.ASDF_INSTALL_PATH
- o diretório onde foi instalado (ou deve ser instalado no caso do script bin/install
)Essas variáveis de ambiente adicionais estarão disponíveis para o script bin/install
:
ASDF_CONCURRENCY
- o número de núcleos a serem usados ao compilar o código-fonte. Útil para definir make -j
.ASDF_DOWNLOAD_PATH
- o caminho para onde o código fonte ou binário foi baixado pelo script bin/download
.Essas variáveis de ambiente adicionais estarão disponíveis para o script bin/download
:
ASDF_DOWNLOAD_PATH
- o caminho para onde o código-fonte ou binário deve ser baixado.Deve imprimir uma string com uma lista de versões separadas por espaço. A saída de exemplo seria a seguinte:
1.0.1 1.0.2 1.3.0 1.4
Observe que a versão mais recente deve ser listada por último para que apareça mais próxima do prompt do usuário. Isso é útil já que o comando list-all
imprime cada versão em sua própria linha. Se houver muitas versões, é possível que as primeiras versões fiquem fora da tela.
Se as versões estiverem sendo extraídas da página de lançamentos em um site, é recomendável não classificar as versões, se possível. Muitas vezes as versões já estão na ordem correta ou, na ordem inversa, nesse caso algo como tac
deve ser suficiente. Se você precisar classificar as versões manualmente, não poderá confiar em sort -V
, pois não é suportado no OSX. Uma função de classificação alternativa como esta é uma escolha melhor.
Este script deve baixar o código fonte ou binário, no caminho contido na variável de ambiente ASDF_DOWNLOAD_PATH
. Se o código-fonte ou binário baixado estiver compactado, apenas o código-fonte ou binário descompactado poderá ser colocado no diretório ASDF_DOWNLOAD_PATH
.
O script deve sair com um status de 0
quando o download for bem-sucedido. Se o download falhar, o script deve sair com qualquer status de saída diferente de zero.
Se possível, o script deve apenas colocar arquivos no ASDF_DOWNLOAD_PATH
. Se o download falhar, nenhum arquivo deve ser colocado no diretório.
Se este script não estiver presente, o asdf assumirá que o script bin/install
está presente e fará o download e instalará a versão. asdf só funciona sem este script para suportar plugins legados. Todos os plugins devem incluir este script e, eventualmente, o suporte para plugins legados será removido.
Este script deve instalar a versão, no caminho mencionado em ASDF_INSTALL_PATH
. Por padrão, o asdf criará shims para qualquer arquivo em $ASDF_INSTALL_PATH/bin
(isso pode ser personalizado com o script opcional bin/list-bin-paths).
O script de instalação deve sair com um status de 0
quando a instalação for bem-sucedida. Se a instalação falhar, o script deve sair com qualquer status de saída diferente de zero.
Se possível, o script deve apenas colocar os arquivos no diretório ASDF_INSTALL_PATH
uma vez que a compilação e instalação da ferramenta são consideradas bem sucedidas pelo script de instalação. asdf verifica a existência do diretório ASDF_INSTALL_PATH
para determinar se essa versão da ferramenta está instalado. Se o diretório ASDF_INSTALL_PATH
for preenchido no início do processo de instalação, outros comandos asdf executados em outros terminais durante a instalação podem considerar essa versão da ferramenta instalada, mesmo quando não estiver totalmente instalada.
Se você quiser que seu plugin funcione com asdf versão 0.7._ e anterior e versão 0.8._ e mais recente, verifique a presença da variável de ambiente ASDF_DOWNLOAD_PATH
. Se não estiver definido, baixe o código-fonte no retorno de chamada bin/install. Se estiver definido, suponha que o script bin/download
já tenha baixado.
Este não é um script de retorno de chamada, mas sim um conjunto de scripts de retorno de chamada que imprimem documentação diferente para STDOUT. Os scripts de retorno de chamada possíveis estão listados abaixo. Observe que bin/help.overview
é um caso especial, pois deve estar presente para que qualquer saída de ajuda seja exibida para o script.
bin/help.overview
- Este script deve gerar uma descrição geral sobre o plugin e a ferramenta que está sendo gerenciada. Nenhum título deve ser impresso, pois o asdf imprimirá títulos. A saída pode ser um texto de formato livre, mas idealmente apenas um parágrafo curto. Este script deve estar presente se você quiser que o asdf forneça informações de ajuda para seu plugin. Todos os outros scripts de retorno de chamada de ajuda são opcionais.bin/help.deps
- Esse script deve gerar a lista de dependências adaptadas ao sistema operacional. Uma dependência por linha.bin/help.config
- Este script deve imprimir qualquer configuração obrigatória ou opcional que possa estar disponível para o plug-in e a ferramenta. Quaisquer variáveis de ambiente ou outros sinalizadores necessários para instalar ou compilar a ferramenta (para o sistema operacional dos usuários quando possível). A saída pode ser texto de formato livre.bin/help.links
- Esta deve ser uma lista de links relevantes para o plug-in e a ferramenta (mais uma vez, adaptados ao sistema operacional atual, quando possível). Um link por linha. As linhas podem estar no formato <title>: <link>
ou apenas <link>
.Cada um desses scripts deve adaptar sua saída ao sistema operacional atual. Por exemplo, quando no Ubuntu, o script deps pode gerar as dependências como pacotes apt-get que devem ser instalados. O script também deve adaptar sua saída ao valor de ASDF_INSTALL_VERSION
e ASDF_INSTALL_TYPE
quando as variáveis forem definidas. Eles são opcionais e nem sempre serão definidos.
O script de retorno de chamada de ajuda NÃO DEVE gerar nenhuma informação que já esteja coberta na documentação principal do asdf-vm. As informações gerais de uso do asdf não devem estar presentes.
Liste os executáveis para a versão especificada da ferramenta. Deve imprimir uma string com uma lista separada por espaços de caminhos de diretórios que contêm executáveis. Os caminhos devem ser relativos ao caminho de instalação passado. A saída de exemplo seria:
bin tools veggies
Isso instruirá o asdf a criar shims para os arquivos em <install-path>/bin
, <install-path>/tools
e <install-path>/veggies
Se este script não for especificado, o asdf procurará o diretório bin
em uma instalação e criará shims para eles.
Configure o env para executar os binários no pacote.
Obtenha o caminho executável para a versão especificada da ferramenta. Deve imprimir uma string com o caminho executável relativo. Isso permite que o plug-in substitua condicionalmente o caminho executável especificado do shim, caso contrário, retorne o caminho padrão especificado pelo shim.
Usage:
+ plugin/bin/exec-path <install-path> <command> <executable-path>
+
+Example Call:
+ ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"
+
+Output:
+ bin/foox
Desinstala uma versão específica de uma ferramenta.
Registre arquivos setter adicionais para este plugin. Deve imprimir uma string com uma lista de nomes de arquivos separados por espaços.
.ruby-version .rvmrc
Nota: Isso só se aplica a usuários que habilitaram a opção legacy_version_file
em seu ~/.asdfrc
.
Isso pode ser usado para analisar ainda mais o arquivo legado encontrado pelo asdf. Se o parse-legacy-file
não for implementado, o asdf simplesmente irá cat o arquivo para determinar a versão. O script receberá o caminho do arquivo como seu primeiro argumento.
Isso pode ser usado para executar qualquer ação pós-instalação depois que o plug-in for adicionado ao asdf.
O script tem acesso ao caminho em que o plugin foi instalado (\${ASDF_PLUGIN_PATH}
) e o URL de origem (\${ASDF_PLUGIN_SOURCE_URL}
), se algum foi usado.
Veja também os ganchos relacionados:
pre_asdf_plugin_add
pre_asdf_plugin_add_\${plugin_name}
post_asdf_plugin_add
post_asdf_plugin_add_\${plugin_name}
Isso pode ser usado para executar qualquer ação de pré-remoção antes que o plug-in seja removido do asdf.
O script tem acesso ao caminho em que o plugin foi instalado (\${ASDF_PLUGIN_PATH}
).
Veja também os ganchos relacionados:
pre_asdf_plugin_remove
pre_asdf_plugin_remove_\${plugin_name}
post_asdf_plugin_remove
post_asdf_plugin_remove_\${plugin_name}
É possível que plugins definam novos comandos asdf fornecendo scripts ou executáveis lib/commands/command*.bash
que será chamado usando a interface de linha de comando asdf usando o nome do plug-in como um subcomando.
Por exemplo, suponha que um plugin foo
tenha:
foo/
+ lib/commands/
+ command.bash
+ command-bat.bash
+ command-bat-man.bash
+ command-help.bash
Os usuários agora podem executar
$ asdf foo # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash\`
+$ asdf foo bar # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar\`
+$ asdf foo help # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash\`
+$ asdf foo bat man # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash\`
+$ asdf foo bat baz # same as running \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz\`
Os autores de plugins podem usar esse recurso para fornecer utilitários relacionados às suas ferramentas, ou até mesmo criar plugins que são apenas novas extensões de comando para o próprio asdf.
Quando invocados, se os comandos de extensão não tiverem seus bits executáveis definidos, eles serão originado como scripts bash, tendo todas as funções de $ASDF_DIR/lib/utils.bash
disponíveis. Além disso, o $ASDF_CMD_FILE
resolve para o caminho completo do arquivo que está sendo originado. Se o bit executável estiver definido, eles são apenas executados e substituem a execução do asdf.
Um bom exemplo desse recurso é para plugins como haxe
que fornece o asdf haxe neko-dylibs-link
para corrigir um problema onde os executáveis haxe esperam encontrar bibliotecas dinâmicas relativas ao diretório executável.
Se o seu plug-in fornecer um comando de extensão asdf, certifique-se de mencioná-lo no README do seu plug-in.
POR FAVOR, use este recurso apenas se for absolutamente necessário
asdf permite modelos de calços personalizados. Para um executável chamado foo
, se houver um arquivo shims/foo
no plug-in, o asdf copiará esse arquivo em vez de usar seu modelo padrão de shim.
Isso deve ser usado com sabedoria. Por enquanto AFAIK, está sendo usado apenas no plugin Elixir, porque um executável também é lido como um arquivo Elixir, além de ser apenas um executável. O que torna impossível usar o calço bash padrão.
asdf
contém o comando plugin-test
para testar seu plugin. Você pode usá-lo da seguinte forma
asdf plugin test <plugin-name> <plugin-url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git-ref>] [test-command*]
Apenas os dois primeiros argumentos são necessários. Se _version for especificado, a ferramenta será instalada com essa versão específica. O padrão é o que retorna asdf latest <plugin-name>
. Se git-ref for especificado, o plug-in em si é verificado nesse commit/branch/tag, útil para testar um pull-request no CI do seu plug-in. O padrão é o branch default do repositório do plugin.
Os argumentos Rest são considerados o comando a ser executado para garantir que a ferramenta instalada funcione corretamente. Normalmente seria algo que leva --version
ou --help
. Por exemplo, para testar o plugin NodeJS, podemos executar
asdf plugin test nodejs https://github.com/asdf-vm/asdf-nodejs.git node --version
É altamente recomendável que você teste seu plug-in em um ambiente CI e verifique se ele funciona no Linux e no OSX.
O repositório asdf-vm/actions fornece uma ação do GitHub para testar seus plugins hospedados no github.
steps:
+ - name: asdf_plugin_test
+ uses: asdf-vm/actions/plugin-test@v1
+ with:
+ command: "my_tool --version"
+ env:
+ GITHUB_API_TOKEN: \${{ secrets.GITHUB_TOKEN }} # automatically provided
Aqui está um arquivo .travis.yml
de amostra, personalize-o de acordo com suas necessidades
language: c
+script: asdf plugin test nodejs $TRAVIS_BUILD_DIR 'node --version'
+before_script:
+ - git clone https://github.com/asdf-vm/asdf.git asdf
+ - . asdf/asdf.sh
+os:
+ - linux
+ - osx
Notas: Ao usar outro IC, você precisará verificar qual variável mapeia para o caminho do repositório.
Você também tem a opção de passar um caminho relativo para plugin-test
.
Por exemplo, se o script de teste for executado no diretório: asdf plugin test nodejs . 'node --version'
.
Se o list-all
do seu plug-in depender do acesso à API do GitHub, certifique-se de fornecer um token de autorização ao acessá-lo, caso contrário, seus testes podem falhar devido à limitação de taxa.
Para fazer isso, crie um novo token pessoal com apenas acesso public_repo
.
Em seguida, nas configurações de compilação do travis.ci, adicione uma variável de ambiente secure para ela chamada algo como GITHUB_API_TOKEN
. E NUNCA publique seu token em seu código.
Finalmente, adicione algo como o seguinte para bin/list-all
cmd="curl -s"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"
asdf
pode facilmente instalar plugins especificando o url do repositório de plugins, por exemplo. plugin add my-plugin https://github.com/user/asdf-my-plugin.git
.
Para facilitar para seus usuários, você pode adicionar seu plugin ao repositório oficial de plugins para ter seu plugin listado e facilmente instalável usando um comando mais curto, por exemplo asdf plugin add my-plugin
.
Siga as instruções no repositório de plugins: asdf-vm/asdf-plugins.
`,102)]))}const k=s(n,[["render",t]]);export{u as __pageData,k as default}; diff --git a/assets/style.p0L2iRKi.css b/assets/style.p0L2iRKi.css new file mode 100644 index 00000000..b61f707f --- /dev/null +++ b/assets/style.p0L2iRKi.css @@ -0,0 +1 @@ +@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-cyrillic.C5lxZ8CY.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek-ext.CqjqNYQ-.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-greek.BBVDIX6e.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-vietnamese.BjW4sHH5.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin-ext.4ZJIpNVo.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:normal;font-weight:100 900;font-display:swap;src:url(/assets/inter-roman-latin.Di8DUHzh.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic-ext.r48I6akx.woff2) format("woff2");unicode-range:U+0460-052F,U+1C80-1C88,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-cyrillic.By2_1cv3.woff2) format("woff2");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek-ext.1u6EdAuj.woff2) format("woff2");unicode-range:U+1F00-1FFF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-greek.DJ8dCoTZ.woff2) format("woff2");unicode-range:U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-vietnamese.BSbpV94h.woff2) format("woff2");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin-ext.CN1xVJS-.woff2) format("woff2");unicode-range:U+0100-02AF,U+0304,U+0308,U+0329,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Inter;font-style:italic;font-weight:100 900;font-display:swap;src:url(/assets/inter-italic-latin.C2AdPX0b.woff2) format("woff2");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+2074,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Punctuation SC;font-weight:400;src:local("PingFang SC Regular"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:500;src:local("PingFang SC Medium"),local("Noto Sans CJK SC"),local("Microsoft YaHei");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:600;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}@font-face{font-family:Punctuation SC;font-weight:700;src:local("PingFang SC Semibold"),local("Noto Sans CJK SC Bold"),local("Microsoft YaHei Bold");unicode-range:U+201C,U+201D,U+2018,U+2019,U+2E3A,U+2014,U+2013,U+2026,U+00B7,U+007E,U+002F}:root{--vp-c-white: #ffffff;--vp-c-black: #000000;--vp-c-neutral: var(--vp-c-black);--vp-c-neutral-inverse: var(--vp-c-white)}.dark{--vp-c-neutral: var(--vp-c-white);--vp-c-neutral-inverse: var(--vp-c-black)}:root{--vp-c-gray-1: #dddde3;--vp-c-gray-2: #e4e4e9;--vp-c-gray-3: #ebebef;--vp-c-gray-soft: rgba(142, 150, 170, .14);--vp-c-indigo-1: #3451b2;--vp-c-indigo-2: #3a5ccc;--vp-c-indigo-3: #5672cd;--vp-c-indigo-soft: rgba(100, 108, 255, .14);--vp-c-purple-1: #6f42c1;--vp-c-purple-2: #7e4cc9;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .14);--vp-c-green-1: #18794e;--vp-c-green-2: #299764;--vp-c-green-3: #30a46c;--vp-c-green-soft: rgba(16, 185, 129, .14);--vp-c-yellow-1: #915930;--vp-c-yellow-2: #946300;--vp-c-yellow-3: #9f6a00;--vp-c-yellow-soft: rgba(234, 179, 8, .14);--vp-c-red-1: #b8272c;--vp-c-red-2: #d5393e;--vp-c-red-3: #e0575b;--vp-c-red-soft: rgba(244, 63, 94, .14);--vp-c-sponsor: #db2777}.dark{--vp-c-gray-1: #515c67;--vp-c-gray-2: #414853;--vp-c-gray-3: #32363f;--vp-c-gray-soft: rgba(101, 117, 133, .16);--vp-c-indigo-1: #a8b1ff;--vp-c-indigo-2: #5c73e7;--vp-c-indigo-3: #3e63dd;--vp-c-indigo-soft: rgba(100, 108, 255, .16);--vp-c-purple-1: #c8abfa;--vp-c-purple-2: #a879e6;--vp-c-purple-3: #8e5cd9;--vp-c-purple-soft: rgba(159, 122, 234, .16);--vp-c-green-1: #3dd68c;--vp-c-green-2: #30a46c;--vp-c-green-3: #298459;--vp-c-green-soft: rgba(16, 185, 129, .16);--vp-c-yellow-1: #f9b44e;--vp-c-yellow-2: #da8b17;--vp-c-yellow-3: #a46a0a;--vp-c-yellow-soft: rgba(234, 179, 8, .16);--vp-c-red-1: #f66f81;--vp-c-red-2: #f14158;--vp-c-red-3: #b62a3c;--vp-c-red-soft: rgba(244, 63, 94, .16)}:root{--vp-c-bg: #ffffff;--vp-c-bg-alt: #f6f6f7;--vp-c-bg-elv: #ffffff;--vp-c-bg-soft: #f6f6f7}.dark{--vp-c-bg: #1b1b1f;--vp-c-bg-alt: #161618;--vp-c-bg-elv: #202127;--vp-c-bg-soft: #202127}:root{--vp-c-border: #c2c2c4;--vp-c-divider: #e2e2e3;--vp-c-gutter: #e2e2e3}.dark{--vp-c-border: #3c3f44;--vp-c-divider: #2e2e32;--vp-c-gutter: #000000}:root{--vp-c-text-1: rgba(60, 60, 67);--vp-c-text-2: rgba(60, 60, 67, .78);--vp-c-text-3: rgba(60, 60, 67, .56)}.dark{--vp-c-text-1: rgba(255, 255, 245, .86);--vp-c-text-2: rgba(235, 235, 245, .6);--vp-c-text-3: rgba(235, 235, 245, .38)}:root{--vp-c-default-1: var(--vp-c-gray-1);--vp-c-default-2: var(--vp-c-gray-2);--vp-c-default-3: var(--vp-c-gray-3);--vp-c-default-soft: var(--vp-c-gray-soft);--vp-c-brand-1: var(--vp-c-indigo-1);--vp-c-brand-2: var(--vp-c-indigo-2);--vp-c-brand-3: var(--vp-c-indigo-3);--vp-c-brand-soft: var(--vp-c-indigo-soft);--vp-c-brand: var(--vp-c-brand-1);--vp-c-tip-1: var(--vp-c-brand-1);--vp-c-tip-2: var(--vp-c-brand-2);--vp-c-tip-3: var(--vp-c-brand-3);--vp-c-tip-soft: var(--vp-c-brand-soft);--vp-c-note-1: var(--vp-c-brand-1);--vp-c-note-2: var(--vp-c-brand-2);--vp-c-note-3: var(--vp-c-brand-3);--vp-c-note-soft: var(--vp-c-brand-soft);--vp-c-success-1: var(--vp-c-green-1);--vp-c-success-2: var(--vp-c-green-2);--vp-c-success-3: var(--vp-c-green-3);--vp-c-success-soft: var(--vp-c-green-soft);--vp-c-important-1: var(--vp-c-purple-1);--vp-c-important-2: var(--vp-c-purple-2);--vp-c-important-3: var(--vp-c-purple-3);--vp-c-important-soft: var(--vp-c-purple-soft);--vp-c-warning-1: var(--vp-c-yellow-1);--vp-c-warning-2: var(--vp-c-yellow-2);--vp-c-warning-3: var(--vp-c-yellow-3);--vp-c-warning-soft: var(--vp-c-yellow-soft);--vp-c-danger-1: var(--vp-c-red-1);--vp-c-danger-2: var(--vp-c-red-2);--vp-c-danger-3: var(--vp-c-red-3);--vp-c-danger-soft: var(--vp-c-red-soft);--vp-c-caution-1: var(--vp-c-red-1);--vp-c-caution-2: var(--vp-c-red-2);--vp-c-caution-3: var(--vp-c-red-3);--vp-c-caution-soft: var(--vp-c-red-soft)}:root{--vp-font-family-base: "Inter", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--vp-font-family-mono: ui-monospace, "Menlo", "Monaco", "Consolas", "Liberation Mono", "Courier New", monospace;font-optical-sizing:auto}:root:where(:lang(zh)){--vp-font-family-base: "Punctuation SC", "Inter", ui-sans-serif, system-ui, "PingFang SC", "Noto Sans CJK SC", "Noto Sans SC", "Heiti SC", "Microsoft YaHei", "DengXian", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"}:root{--vp-shadow-1: 0 1px 2px rgba(0, 0, 0, .04), 0 1px 2px rgba(0, 0, 0, .06);--vp-shadow-2: 0 3px 12px rgba(0, 0, 0, .07), 0 1px 4px rgba(0, 0, 0, .07);--vp-shadow-3: 0 12px 32px rgba(0, 0, 0, .1), 0 2px 6px rgba(0, 0, 0, .08);--vp-shadow-4: 0 14px 44px rgba(0, 0, 0, .12), 0 3px 9px rgba(0, 0, 0, .12);--vp-shadow-5: 0 18px 56px rgba(0, 0, 0, .16), 0 4px 12px rgba(0, 0, 0, .16)}:root{--vp-z-index-footer: 10;--vp-z-index-local-nav: 20;--vp-z-index-nav: 30;--vp-z-index-layout-top: 40;--vp-z-index-backdrop: 50;--vp-z-index-sidebar: 60}@media (min-width: 960px){:root{--vp-z-index-sidebar: 25}}:root{--vp-layout-max-width: 1440px}:root{--vp-header-anchor-symbol: "#"}:root{--vp-code-line-height: 1.7;--vp-code-font-size: .875em;--vp-code-color: var(--vp-c-brand-1);--vp-code-link-color: var(--vp-c-brand-1);--vp-code-link-hover-color: var(--vp-c-brand-2);--vp-code-bg: var(--vp-c-default-soft);--vp-code-block-color: var(--vp-c-text-2);--vp-code-block-bg: var(--vp-c-bg-alt);--vp-code-block-divider-color: var(--vp-c-gutter);--vp-code-lang-color: var(--vp-c-text-3);--vp-code-line-highlight-color: var(--vp-c-default-soft);--vp-code-line-number-color: var(--vp-c-text-3);--vp-code-line-diff-add-color: var(--vp-c-success-soft);--vp-code-line-diff-add-symbol-color: var(--vp-c-success-1);--vp-code-line-diff-remove-color: var(--vp-c-danger-soft);--vp-code-line-diff-remove-symbol-color: var(--vp-c-danger-1);--vp-code-line-warning-color: var(--vp-c-warning-soft);--vp-code-line-error-color: var(--vp-c-danger-soft);--vp-code-copy-code-border-color: var(--vp-c-divider);--vp-code-copy-code-bg: var(--vp-c-bg-soft);--vp-code-copy-code-hover-border-color: var(--vp-c-divider);--vp-code-copy-code-hover-bg: var(--vp-c-bg);--vp-code-copy-code-active-text: var(--vp-c-text-2);--vp-code-copy-copied-text-content: "Copied";--vp-code-tab-divider: var(--vp-code-block-divider-color);--vp-code-tab-text-color: var(--vp-c-text-2);--vp-code-tab-bg: var(--vp-code-block-bg);--vp-code-tab-hover-text-color: var(--vp-c-text-1);--vp-code-tab-active-text-color: var(--vp-c-text-1);--vp-code-tab-active-bar-color: var(--vp-c-brand-1)}:root{--vp-button-brand-border: transparent;--vp-button-brand-text: var(--vp-c-white);--vp-button-brand-bg: var(--vp-c-brand-3);--vp-button-brand-hover-border: transparent;--vp-button-brand-hover-text: var(--vp-c-white);--vp-button-brand-hover-bg: var(--vp-c-brand-2);--vp-button-brand-active-border: transparent;--vp-button-brand-active-text: var(--vp-c-white);--vp-button-brand-active-bg: var(--vp-c-brand-1);--vp-button-alt-border: transparent;--vp-button-alt-text: var(--vp-c-text-1);--vp-button-alt-bg: var(--vp-c-default-3);--vp-button-alt-hover-border: transparent;--vp-button-alt-hover-text: var(--vp-c-text-1);--vp-button-alt-hover-bg: var(--vp-c-default-2);--vp-button-alt-active-border: transparent;--vp-button-alt-active-text: var(--vp-c-text-1);--vp-button-alt-active-bg: var(--vp-c-default-1);--vp-button-sponsor-border: var(--vp-c-text-2);--vp-button-sponsor-text: var(--vp-c-text-2);--vp-button-sponsor-bg: transparent;--vp-button-sponsor-hover-border: var(--vp-c-sponsor);--vp-button-sponsor-hover-text: var(--vp-c-sponsor);--vp-button-sponsor-hover-bg: transparent;--vp-button-sponsor-active-border: var(--vp-c-sponsor);--vp-button-sponsor-active-text: var(--vp-c-sponsor);--vp-button-sponsor-active-bg: transparent}:root{--vp-custom-block-font-size: 14px;--vp-custom-block-code-font-size: 13px;--vp-custom-block-info-border: transparent;--vp-custom-block-info-text: var(--vp-c-text-1);--vp-custom-block-info-bg: var(--vp-c-default-soft);--vp-custom-block-info-code-bg: var(--vp-c-default-soft);--vp-custom-block-note-border: transparent;--vp-custom-block-note-text: var(--vp-c-text-1);--vp-custom-block-note-bg: var(--vp-c-default-soft);--vp-custom-block-note-code-bg: var(--vp-c-default-soft);--vp-custom-block-tip-border: transparent;--vp-custom-block-tip-text: var(--vp-c-text-1);--vp-custom-block-tip-bg: var(--vp-c-tip-soft);--vp-custom-block-tip-code-bg: var(--vp-c-tip-soft);--vp-custom-block-important-border: transparent;--vp-custom-block-important-text: var(--vp-c-text-1);--vp-custom-block-important-bg: var(--vp-c-important-soft);--vp-custom-block-important-code-bg: var(--vp-c-important-soft);--vp-custom-block-warning-border: transparent;--vp-custom-block-warning-text: var(--vp-c-text-1);--vp-custom-block-warning-bg: var(--vp-c-warning-soft);--vp-custom-block-warning-code-bg: var(--vp-c-warning-soft);--vp-custom-block-danger-border: transparent;--vp-custom-block-danger-text: var(--vp-c-text-1);--vp-custom-block-danger-bg: var(--vp-c-danger-soft);--vp-custom-block-danger-code-bg: var(--vp-c-danger-soft);--vp-custom-block-caution-border: transparent;--vp-custom-block-caution-text: var(--vp-c-text-1);--vp-custom-block-caution-bg: var(--vp-c-caution-soft);--vp-custom-block-caution-code-bg: var(--vp-c-caution-soft);--vp-custom-block-details-border: var(--vp-custom-block-info-border);--vp-custom-block-details-text: var(--vp-custom-block-info-text);--vp-custom-block-details-bg: var(--vp-custom-block-info-bg);--vp-custom-block-details-code-bg: var(--vp-custom-block-info-code-bg)}:root{--vp-input-border-color: var(--vp-c-border);--vp-input-bg-color: var(--vp-c-bg-alt);--vp-input-switch-bg-color: var(--vp-c-default-soft)}:root{--vp-nav-height: 64px;--vp-nav-bg-color: var(--vp-c-bg);--vp-nav-screen-bg-color: var(--vp-c-bg);--vp-nav-logo-height: 24px}.hide-nav{--vp-nav-height: 0px}.hide-nav .VPSidebar{--vp-nav-height: 22px}:root{--vp-local-nav-bg-color: var(--vp-c-bg)}:root{--vp-sidebar-width: 272px;--vp-sidebar-bg-color: var(--vp-c-bg-alt)}:root{--vp-backdrop-bg-color: rgba(0, 0, 0, .6)}:root{--vp-home-hero-name-color: var(--vp-c-brand-1);--vp-home-hero-name-background: transparent;--vp-home-hero-image-background-image: none;--vp-home-hero-image-filter: none}:root{--vp-badge-info-border: transparent;--vp-badge-info-text: var(--vp-c-text-2);--vp-badge-info-bg: var(--vp-c-default-soft);--vp-badge-tip-border: transparent;--vp-badge-tip-text: var(--vp-c-tip-1);--vp-badge-tip-bg: var(--vp-c-tip-soft);--vp-badge-warning-border: transparent;--vp-badge-warning-text: var(--vp-c-warning-1);--vp-badge-warning-bg: var(--vp-c-warning-soft);--vp-badge-danger-border: transparent;--vp-badge-danger-text: var(--vp-c-danger-1);--vp-badge-danger-bg: var(--vp-c-danger-soft)}:root{--vp-carbon-ads-text-color: var(--vp-c-text-1);--vp-carbon-ads-poweredby-color: var(--vp-c-text-2);--vp-carbon-ads-bg-color: var(--vp-c-bg-soft);--vp-carbon-ads-hover-text-color: var(--vp-c-brand-1);--vp-carbon-ads-hover-poweredby-color: var(--vp-c-text-1)}:root{--vp-local-search-bg: var(--vp-c-bg);--vp-local-search-result-bg: var(--vp-c-bg);--vp-local-search-result-border: var(--vp-c-divider);--vp-local-search-result-selected-bg: var(--vp-c-bg);--vp-local-search-result-selected-border: var(--vp-c-brand-1);--vp-local-search-highlight-bg: var(--vp-c-brand-1);--vp-local-search-highlight-text: var(--vp-c-neutral-inverse)}@media (prefers-reduced-motion: reduce){*,:before,:after{animation-delay:-1ms!important;animation-duration:1ms!important;animation-iteration-count:1!important;background-attachment:initial!important;scroll-behavior:auto!important;transition-duration:0s!important;transition-delay:0s!important}}*,:before,:after{box-sizing:border-box}html{line-height:1.4;font-size:16px;-webkit-text-size-adjust:100%}html.dark{color-scheme:dark}body{margin:0;width:100%;min-width:320px;min-height:100vh;line-height:24px;font-family:var(--vp-font-family-base);font-size:16px;font-weight:400;color:var(--vp-c-text-1);background-color:var(--vp-c-bg);font-synthesis:style;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}main{display:block}h1,h2,h3,h4,h5,h6{margin:0;line-height:24px;font-size:16px;font-weight:400}p{margin:0}strong,b{font-weight:600}a,area,button,[role=button],input,label,select,summary,textarea{touch-action:manipulation}a{color:inherit;text-decoration:inherit}ol,ul{list-style:none;margin:0;padding:0}blockquote{margin:0}pre,code,kbd,samp{font-family:var(--vp-font-family-mono)}img,svg,video,canvas,audio,iframe,embed,object{display:block}figure{margin:0}img,video{max-width:100%;height:auto}button,input,optgroup,select,textarea{border:0;padding:0;line-height:inherit;color:inherit}button{padding:0;font-family:inherit;background-color:transparent;background-image:none}button:enabled,[role=button]:enabled{cursor:pointer}button:focus,button:focus-visible{outline:1px dotted;outline:4px auto -webkit-focus-ring-color}button:focus:not(:focus-visible){outline:none!important}input:focus,textarea:focus,select:focus{outline:none}table{border-collapse:collapse}input{background-color:transparent}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:var(--vp-c-text-3)}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:var(--vp-c-text-3)}input::placeholder,textarea::placeholder{color:var(--vp-c-text-3)}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}input[type=number]{-moz-appearance:textfield}textarea{resize:vertical}select{-webkit-appearance:none}fieldset{margin:0;padding:0}h1,h2,h3,h4,h5,h6,li,p{overflow-wrap:break-word}vite-error-overlay{z-index:9999}mjx-container{overflow-x:auto}mjx-container>svg{display:inline-block;margin:auto}[class^=vpi-],[class*=" vpi-"],.vp-icon{width:1em;height:1em}[class^=vpi-].bg,[class*=" vpi-"].bg,.vp-icon.bg{background-size:100% 100%;background-color:transparent}[class^=vpi-]:not(.bg),[class*=" vpi-"]:not(.bg),.vp-icon:not(.bg){-webkit-mask:var(--icon) no-repeat;mask:var(--icon) no-repeat;-webkit-mask-size:100% 100%;mask-size:100% 100%;background-color:currentColor;color:inherit}.vpi-align-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M21 6H3M15 12H3M17 18H3'/%3E%3C/svg%3E")}.vpi-arrow-right,.vpi-arrow-down,.vpi-arrow-left,.vpi-arrow-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5l7 7-7 7'/%3E%3C/svg%3E")}.vpi-chevron-right,.vpi-chevron-down,.vpi-chevron-left,.vpi-chevron-up{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 18 6-6-6-6'/%3E%3C/svg%3E")}.vpi-chevron-down,.vpi-arrow-down{transform:rotate(90deg)}.vpi-chevron-left,.vpi-arrow-left{transform:rotate(180deg)}.vpi-chevron-up,.vpi-arrow-up{transform:rotate(-90deg)}.vpi-square-pen{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7'/%3E%3Cpath d='M18.375 2.625a2.121 2.121 0 1 1 3 3L12 15l-4 1 1-4Z'/%3E%3C/svg%3E")}.vpi-plus{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M5 12h14M12 5v14'/%3E%3C/svg%3E")}.vpi-sun{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='4'/%3E%3Cpath d='M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41'/%3E%3C/svg%3E")}.vpi-moon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z'/%3E%3C/svg%3E")}.vpi-more-horizontal{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='1'/%3E%3Ccircle cx='19' cy='12' r='1'/%3E%3Ccircle cx='5' cy='12' r='1'/%3E%3C/svg%3E")}.vpi-languages{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6'/%3E%3C/svg%3E")}.vpi-heart{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z'/%3E%3C/svg%3E")}.vpi-search{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.3-4.3'/%3E%3C/svg%3E")}.vpi-layout-list{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='7' height='7' x='3' y='3' rx='1'/%3E%3Crect width='7' height='7' x='3' y='14' rx='1'/%3E%3Cpath d='M14 4h7M14 9h7M14 15h7M14 20h7'/%3E%3C/svg%3E")}.vpi-delete{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='M20 5H9l-7 7 7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2ZM18 9l-6 6M12 9l6 6'/%3E%3C/svg%3E")}.vpi-corner-down-left{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Cpath d='m9 10-5 5 5 5'/%3E%3Cpath d='M20 4v7a4 4 0 0 1-4 4H4'/%3E%3C/svg%3E")}:root{--vp-icon-copy: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3C/svg%3E");--vp-icon-copied: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' stroke='rgba(128,128,128,1)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' viewBox='0 0 24 24'%3E%3Crect width='8' height='4' x='8' y='2' rx='1' ry='1'/%3E%3Cpath d='M16 4h2a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h2'/%3E%3Cpath d='m9 14 2 2 4-4'/%3E%3C/svg%3E")}.vpi-social-discord{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.317 4.37a19.791 19.791 0 0 0-4.885-1.515.074.074 0 0 0-.079.037c-.21.375-.444.864-.608 1.25a18.27 18.27 0 0 0-5.487 0 12.64 12.64 0 0 0-.617-1.25.077.077 0 0 0-.079-.037A19.736 19.736 0 0 0 3.677 4.37a.07.07 0 0 0-.032.027C.533 9.046-.32 13.58.099 18.057a.082.082 0 0 0 .031.057 19.9 19.9 0 0 0 5.993 3.03.078.078 0 0 0 .084-.028c.462-.63.874-1.295 1.226-1.994a.076.076 0 0 0-.041-.106 13.107 13.107 0 0 1-1.872-.892.077.077 0 0 1-.008-.128 10.2 10.2 0 0 0 .372-.292.074.074 0 0 1 .077-.01c3.928 1.793 8.18 1.793 12.062 0a.074.074 0 0 1 .078.01c.12.098.246.198.373.292a.077.077 0 0 1-.006.127 12.299 12.299 0 0 1-1.873.892.077.077 0 0 0-.041.107c.36.698.772 1.362 1.225 1.993a.076.076 0 0 0 .084.028 19.839 19.839 0 0 0 6.002-3.03.077.077 0 0 0 .032-.054c.5-5.177-.838-9.674-3.549-13.66a.061.061 0 0 0-.031-.03zM8.02 15.33c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.956-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.956 2.418-2.157 2.418zm7.975 0c-1.183 0-2.157-1.085-2.157-2.419 0-1.333.955-2.419 2.157-2.419 1.21 0 2.176 1.096 2.157 2.42 0 1.333-.946 2.418-2.157 2.418Z'/%3E%3C/svg%3E")}.vpi-social-facebook{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M9.101 23.691v-7.98H6.627v-3.667h2.474v-1.58c0-4.085 1.848-5.978 5.858-5.978.401 0 .955.042 1.468.103a8.68 8.68 0 0 1 1.141.195v3.325a8.623 8.623 0 0 0-.653-.036 26.805 26.805 0 0 0-.733-.009c-.707 0-1.259.096-1.675.309a1.686 1.686 0 0 0-.679.622c-.258.42-.374.995-.374 1.752v1.297h3.919l-.386 2.103-.287 1.564h-3.246v8.245C19.396 23.238 24 18.179 24 12.044c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.628 3.874 10.35 9.101 11.647Z'/%3E%3C/svg%3E")}.vpi-social-github{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E")}.vpi-social-instagram{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M7.03.084c-1.277.06-2.149.264-2.91.563a5.874 5.874 0 0 0-2.124 1.388 5.878 5.878 0 0 0-1.38 2.127C.321 4.926.12 5.8.064 7.076.008 8.354-.005 8.764.001 12.023c.007 3.259.021 3.667.083 4.947.061 1.277.264 2.149.563 2.911.308.789.72 1.457 1.388 2.123a5.872 5.872 0 0 0 2.129 1.38c.763.295 1.636.496 2.913.552 1.278.056 1.689.069 4.947.063 3.257-.007 3.668-.021 4.947-.082 1.28-.06 2.147-.265 2.91-.563a5.881 5.881 0 0 0 2.123-1.388 5.881 5.881 0 0 0 1.38-2.129c.295-.763.496-1.636.551-2.912.056-1.28.07-1.69.063-4.948-.006-3.258-.02-3.667-.081-4.947-.06-1.28-.264-2.148-.564-2.911a5.892 5.892 0 0 0-1.387-2.123 5.857 5.857 0 0 0-2.128-1.38C19.074.322 18.202.12 16.924.066 15.647.009 15.236-.006 11.977 0 8.718.008 8.31.021 7.03.084m.14 21.693c-1.17-.05-1.805-.245-2.228-.408a3.736 3.736 0 0 1-1.382-.895 3.695 3.695 0 0 1-.9-1.378c-.165-.423-.363-1.058-.417-2.228-.06-1.264-.072-1.644-.08-4.848-.006-3.204.006-3.583.061-4.848.05-1.169.246-1.805.408-2.228.216-.561.477-.96.895-1.382a3.705 3.705 0 0 1 1.379-.9c.423-.165 1.057-.361 2.227-.417 1.265-.06 1.644-.072 4.848-.08 3.203-.006 3.583.006 4.85.062 1.168.05 1.804.244 2.227.408.56.216.96.475 1.382.895.421.42.681.817.9 1.378.165.422.362 1.056.417 2.227.06 1.265.074 1.645.08 4.848.005 3.203-.006 3.583-.061 4.848-.051 1.17-.245 1.805-.408 2.23-.216.56-.477.96-.896 1.38a3.705 3.705 0 0 1-1.378.9c-.422.165-1.058.362-2.226.418-1.266.06-1.645.072-4.85.079-3.204.007-3.582-.006-4.848-.06m9.783-16.192a1.44 1.44 0 1 0 1.437-1.442 1.44 1.44 0 0 0-1.437 1.442M5.839 12.012a6.161 6.161 0 1 0 12.323-.024 6.162 6.162 0 0 0-12.323.024M8 12.008A4 4 0 1 1 12.008 16 4 4 0 0 1 8 12.008'/%3E%3C/svg%3E")}.vpi-social-linkedin{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z'/%3E%3C/svg%3E")}.vpi-social-mastodon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z'/%3E%3C/svg%3E")}.vpi-social-npm{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M1.763 0C.786 0 0 .786 0 1.763v20.474C0 23.214.786 24 1.763 24h20.474c.977 0 1.763-.786 1.763-1.763V1.763C24 .786 23.214 0 22.237 0zM5.13 5.323l13.837.019-.009 13.836h-3.464l.01-10.382h-3.456L12.04 19.17H5.113z'/%3E%3C/svg%3E")}.vpi-social-slack{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M5.042 15.165a2.528 2.528 0 0 1-2.52 2.523A2.528 2.528 0 0 1 0 15.165a2.527 2.527 0 0 1 2.522-2.52h2.52v2.52zm1.271 0a2.527 2.527 0 0 1 2.521-2.52 2.527 2.527 0 0 1 2.521 2.52v6.313A2.528 2.528 0 0 1 8.834 24a2.528 2.528 0 0 1-2.521-2.522v-6.313zM8.834 5.042a2.528 2.528 0 0 1-2.521-2.52A2.528 2.528 0 0 1 8.834 0a2.528 2.528 0 0 1 2.521 2.522v2.52H8.834zm0 1.271a2.528 2.528 0 0 1 2.521 2.521 2.528 2.528 0 0 1-2.521 2.521H2.522A2.528 2.528 0 0 1 0 8.834a2.528 2.528 0 0 1 2.522-2.521h6.312zm10.122 2.521a2.528 2.528 0 0 1 2.522-2.521A2.528 2.528 0 0 1 24 8.834a2.528 2.528 0 0 1-2.522 2.521h-2.522V8.834zm-1.268 0a2.528 2.528 0 0 1-2.523 2.521 2.527 2.527 0 0 1-2.52-2.521V2.522A2.527 2.527 0 0 1 15.165 0a2.528 2.528 0 0 1 2.523 2.522v6.312zm-2.523 10.122a2.528 2.528 0 0 1 2.523 2.522A2.528 2.528 0 0 1 15.165 24a2.527 2.527 0 0 1-2.52-2.522v-2.522h2.52zm0-1.268a2.527 2.527 0 0 1-2.52-2.523 2.526 2.526 0 0 1 2.52-2.52h6.313A2.527 2.527 0 0 1 24 15.165a2.528 2.528 0 0 1-2.522 2.523h-6.313z'/%3E%3C/svg%3E")}.vpi-social-twitter,.vpi-social-x{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M18.901 1.153h3.68l-8.04 9.19L24 22.846h-7.406l-5.8-7.584-6.638 7.584H.474l8.6-9.83L0 1.154h7.594l5.243 6.932ZM17.61 20.644h2.039L6.486 3.24H4.298Z'/%3E%3C/svg%3E")}.vpi-social-youtube{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z'/%3E%3C/svg%3E")}.visually-hidden{position:absolute;width:1px;height:1px;white-space:nowrap;clip:rect(0 0 0 0);clip-path:inset(50%);overflow:hidden}.custom-block{border:1px solid transparent;border-radius:8px;padding:16px 16px 8px;line-height:24px;font-size:var(--vp-custom-block-font-size);color:var(--vp-c-text-2)}.custom-block.info{border-color:var(--vp-custom-block-info-border);color:var(--vp-custom-block-info-text);background-color:var(--vp-custom-block-info-bg)}.custom-block.info a,.custom-block.info code{color:var(--vp-c-brand-1)}.custom-block.info a:hover,.custom-block.info a:hover>code{color:var(--vp-c-brand-2)}.custom-block.info code{background-color:var(--vp-custom-block-info-code-bg)}.custom-block.note{border-color:var(--vp-custom-block-note-border);color:var(--vp-custom-block-note-text);background-color:var(--vp-custom-block-note-bg)}.custom-block.note a,.custom-block.note code{color:var(--vp-c-brand-1)}.custom-block.note a:hover,.custom-block.note a:hover>code{color:var(--vp-c-brand-2)}.custom-block.note code{background-color:var(--vp-custom-block-note-code-bg)}.custom-block.tip{border-color:var(--vp-custom-block-tip-border);color:var(--vp-custom-block-tip-text);background-color:var(--vp-custom-block-tip-bg)}.custom-block.tip a,.custom-block.tip code{color:var(--vp-c-tip-1)}.custom-block.tip a:hover,.custom-block.tip a:hover>code{color:var(--vp-c-tip-2)}.custom-block.tip code{background-color:var(--vp-custom-block-tip-code-bg)}.custom-block.important{border-color:var(--vp-custom-block-important-border);color:var(--vp-custom-block-important-text);background-color:var(--vp-custom-block-important-bg)}.custom-block.important a,.custom-block.important code{color:var(--vp-c-important-1)}.custom-block.important a:hover,.custom-block.important a:hover>code{color:var(--vp-c-important-2)}.custom-block.important code{background-color:var(--vp-custom-block-important-code-bg)}.custom-block.warning{border-color:var(--vp-custom-block-warning-border);color:var(--vp-custom-block-warning-text);background-color:var(--vp-custom-block-warning-bg)}.custom-block.warning a,.custom-block.warning code{color:var(--vp-c-warning-1)}.custom-block.warning a:hover,.custom-block.warning a:hover>code{color:var(--vp-c-warning-2)}.custom-block.warning code{background-color:var(--vp-custom-block-warning-code-bg)}.custom-block.danger{border-color:var(--vp-custom-block-danger-border);color:var(--vp-custom-block-danger-text);background-color:var(--vp-custom-block-danger-bg)}.custom-block.danger a,.custom-block.danger code{color:var(--vp-c-danger-1)}.custom-block.danger a:hover,.custom-block.danger a:hover>code{color:var(--vp-c-danger-2)}.custom-block.danger code{background-color:var(--vp-custom-block-danger-code-bg)}.custom-block.caution{border-color:var(--vp-custom-block-caution-border);color:var(--vp-custom-block-caution-text);background-color:var(--vp-custom-block-caution-bg)}.custom-block.caution a,.custom-block.caution code{color:var(--vp-c-caution-1)}.custom-block.caution a:hover,.custom-block.caution a:hover>code{color:var(--vp-c-caution-2)}.custom-block.caution code{background-color:var(--vp-custom-block-caution-code-bg)}.custom-block.details{border-color:var(--vp-custom-block-details-border);color:var(--vp-custom-block-details-text);background-color:var(--vp-custom-block-details-bg)}.custom-block.details a{color:var(--vp-c-brand-1)}.custom-block.details a:hover,.custom-block.details a:hover>code{color:var(--vp-c-brand-2)}.custom-block.details code{background-color:var(--vp-custom-block-details-code-bg)}.custom-block-title{font-weight:600}.custom-block p+p{margin:8px 0}.custom-block.details summary{margin:0 0 8px;font-weight:700;cursor:pointer;-webkit-user-select:none;user-select:none}.custom-block.details summary+p{margin:8px 0}.custom-block a{color:inherit;font-weight:600;text-decoration:underline;text-underline-offset:2px;transition:opacity .25s}.custom-block a:hover{opacity:.75}.custom-block code{font-size:var(--vp-custom-block-code-font-size)}.custom-block.custom-block th,.custom-block.custom-block blockquote>p{font-size:var(--vp-custom-block-font-size);color:inherit}.dark .vp-code span{color:var(--shiki-dark, inherit)}html:not(.dark) .vp-code span{color:var(--shiki-light, inherit)}.vp-code-group{margin-top:16px}.vp-code-group .tabs{position:relative;display:flex;margin-right:-24px;margin-left:-24px;padding:0 12px;background-color:var(--vp-code-tab-bg);overflow-x:auto;overflow-y:hidden;box-shadow:inset 0 -1px var(--vp-code-tab-divider)}@media (min-width: 640px){.vp-code-group .tabs{margin-right:0;margin-left:0;border-radius:8px 8px 0 0}}.vp-code-group .tabs input{position:fixed;opacity:0;pointer-events:none}.vp-code-group .tabs label{position:relative;display:inline-block;border-bottom:1px solid transparent;padding:0 12px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-code-tab-text-color);white-space:nowrap;cursor:pointer;transition:color .25s}.vp-code-group .tabs label:after{position:absolute;right:8px;bottom:-1px;left:8px;z-index:1;height:2px;border-radius:2px;content:"";background-color:transparent;transition:background-color .25s}.vp-code-group label:hover{color:var(--vp-code-tab-hover-text-color)}.vp-code-group input:checked+label{color:var(--vp-code-tab-active-text-color)}.vp-code-group input:checked+label:after{background-color:var(--vp-code-tab-active-bar-color)}.vp-code-group div[class*=language-],.vp-block{display:none;margin-top:0!important;border-top-left-radius:0!important;border-top-right-radius:0!important}.vp-code-group div[class*=language-].active,.vp-block.active{display:block}.vp-block{padding:20px 24px}.vp-doc h1,.vp-doc h2,.vp-doc h3,.vp-doc h4,.vp-doc h5,.vp-doc h6{position:relative;font-weight:600;outline:none}.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:28px}.vp-doc h2{margin:48px 0 16px;border-top:1px solid var(--vp-c-divider);padding-top:24px;letter-spacing:-.02em;line-height:32px;font-size:24px}.vp-doc h3{margin:32px 0 0;letter-spacing:-.01em;line-height:28px;font-size:20px}.vp-doc h4{margin:24px 0 0;letter-spacing:-.01em;line-height:24px;font-size:18px}.vp-doc .header-anchor{position:absolute;top:0;left:0;margin-left:-.87em;font-weight:500;-webkit-user-select:none;user-select:none;opacity:0;text-decoration:none;transition:color .25s,opacity .25s}.vp-doc .header-anchor:before{content:var(--vp-header-anchor-symbol)}.vp-doc h1:hover .header-anchor,.vp-doc h1 .header-anchor:focus,.vp-doc h2:hover .header-anchor,.vp-doc h2 .header-anchor:focus,.vp-doc h3:hover .header-anchor,.vp-doc h3 .header-anchor:focus,.vp-doc h4:hover .header-anchor,.vp-doc h4 .header-anchor:focus,.vp-doc h5:hover .header-anchor,.vp-doc h5 .header-anchor:focus,.vp-doc h6:hover .header-anchor,.vp-doc h6 .header-anchor:focus{opacity:1}@media (min-width: 768px){.vp-doc h1{letter-spacing:-.02em;line-height:40px;font-size:32px}}.vp-doc h2 .header-anchor{top:24px}.vp-doc p,.vp-doc summary{margin:16px 0}.vp-doc p{line-height:28px}.vp-doc blockquote{margin:16px 0;border-left:2px solid var(--vp-c-divider);padding-left:16px;transition:border-color .5s;color:var(--vp-c-text-2)}.vp-doc blockquote>p{margin:0;font-size:16px;transition:color .5s}.vp-doc a{font-weight:500;color:var(--vp-c-brand-1);text-decoration:underline;text-underline-offset:2px;transition:color .25s,opacity .25s}.vp-doc a:hover{color:var(--vp-c-brand-2)}.vp-doc strong{font-weight:600}.vp-doc ul,.vp-doc ol{padding-left:1.25rem;margin:16px 0}.vp-doc ul{list-style:disc}.vp-doc ol{list-style:decimal}.vp-doc li+li{margin-top:8px}.vp-doc li>ol,.vp-doc li>ul{margin:8px 0 0}.vp-doc table{display:block;border-collapse:collapse;margin:20px 0;overflow-x:auto}.vp-doc tr{background-color:var(--vp-c-bg);border-top:1px solid var(--vp-c-divider);transition:background-color .5s}.vp-doc tr:nth-child(2n){background-color:var(--vp-c-bg-soft)}.vp-doc th,.vp-doc td{border:1px solid var(--vp-c-divider);padding:8px 16px}.vp-doc th{text-align:left;font-size:14px;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-doc td{font-size:14px}.vp-doc hr{margin:16px 0;border:none;border-top:1px solid var(--vp-c-divider)}.vp-doc .custom-block{margin:16px 0}.vp-doc .custom-block p{margin:8px 0;line-height:24px}.vp-doc .custom-block p:first-child{margin:0}.vp-doc .custom-block div[class*=language-]{margin:8px 0;border-radius:8px}.vp-doc .custom-block div[class*=language-] code{font-weight:400;background-color:transparent}.vp-doc .custom-block .vp-code-group .tabs{margin:0;border-radius:8px 8px 0 0}.vp-doc :not(pre,h1,h2,h3,h4,h5,h6)>code{font-size:var(--vp-code-font-size);color:var(--vp-code-color)}.vp-doc :not(pre)>code{border-radius:4px;padding:3px 6px;background-color:var(--vp-code-bg);transition:color .25s,background-color .5s}.vp-doc a>code{color:var(--vp-code-link-color)}.vp-doc a:hover>code{color:var(--vp-code-link-hover-color)}.vp-doc h1>code,.vp-doc h2>code,.vp-doc h3>code,.vp-doc h4>code{font-size:.9em}.vp-doc div[class*=language-],.vp-block{position:relative;margin:16px -24px;background-color:var(--vp-code-block-bg);overflow-x:auto;transition:background-color .5s}@media (min-width: 640px){.vp-doc div[class*=language-],.vp-block{border-radius:8px;margin:16px 0}}@media (max-width: 639px){.vp-doc li div[class*=language-]{border-radius:8px 0 0 8px}}.vp-doc div[class*=language-]+div[class*=language-],.vp-doc div[class$=-api]+div[class*=language-],.vp-doc div[class*=language-]+div[class$=-api]>div[class*=language-]{margin-top:-8px}.vp-doc [class*=language-] pre,.vp-doc [class*=language-] code{direction:ltr;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}.vp-doc [class*=language-] pre{position:relative;z-index:1;margin:0;padding:20px 0;background:transparent;overflow-x:auto}.vp-doc [class*=language-] code{display:block;padding:0 24px;width:fit-content;min-width:100%;line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-block-color);transition:color .5s}.vp-doc [class*=language-] code .highlighted{background-color:var(--vp-code-line-highlight-color);transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .highlighted.error{background-color:var(--vp-code-line-error-color)}.vp-doc [class*=language-] code .highlighted.warning{background-color:var(--vp-code-line-warning-color)}.vp-doc [class*=language-] code .diff{transition:background-color .5s;margin:0 -24px;padding:0 24px;width:calc(100% + 48px);display:inline-block}.vp-doc [class*=language-] code .diff:before{position:absolute;left:10px}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){filter:blur(.095rem);opacity:.4;transition:filter .35s,opacity .35s}.vp-doc [class*=language-] .has-focused-lines .line:not(.has-focus){opacity:.7;transition:filter .35s,opacity .35s}.vp-doc [class*=language-]:hover .has-focused-lines .line:not(.has-focus){filter:blur(0);opacity:1}.vp-doc [class*=language-] code .diff.remove{background-color:var(--vp-code-line-diff-remove-color);opacity:.7}.vp-doc [class*=language-] code .diff.remove:before{content:"-";color:var(--vp-code-line-diff-remove-symbol-color)}.vp-doc [class*=language-] code .diff.add{background-color:var(--vp-code-line-diff-add-color)}.vp-doc [class*=language-] code .diff.add:before{content:"+";color:var(--vp-code-line-diff-add-symbol-color)}.vp-doc div[class*=language-].line-numbers-mode{padding-left:32px}.vp-doc .line-numbers-wrapper{position:absolute;top:0;bottom:0;left:0;z-index:3;border-right:1px solid var(--vp-code-block-divider-color);padding-top:20px;width:32px;text-align:center;font-family:var(--vp-font-family-mono);line-height:var(--vp-code-line-height);font-size:var(--vp-code-font-size);color:var(--vp-code-line-number-color);transition:border-color .5s,color .5s}.vp-doc [class*=language-]>button.copy{direction:ltr;position:absolute;top:12px;right:12px;z-index:3;border:1px solid var(--vp-code-copy-code-border-color);border-radius:4px;width:40px;height:40px;background-color:var(--vp-code-copy-code-bg);opacity:0;cursor:pointer;background-image:var(--vp-icon-copy);background-position:50%;background-size:20px;background-repeat:no-repeat;transition:border-color .25s,background-color .25s,opacity .25s}.vp-doc [class*=language-]:hover>button.copy,.vp-doc [class*=language-]>button.copy:focus{opacity:1}.vp-doc [class*=language-]>button.copy:hover,.vp-doc [class*=language-]>button.copy.copied{border-color:var(--vp-code-copy-code-hover-border-color);background-color:var(--vp-code-copy-code-hover-bg)}.vp-doc [class*=language-]>button.copy.copied,.vp-doc [class*=language-]>button.copy:hover.copied{border-radius:0 4px 4px 0;background-color:var(--vp-code-copy-code-hover-bg);background-image:var(--vp-icon-copied)}.vp-doc [class*=language-]>button.copy.copied:before,.vp-doc [class*=language-]>button.copy:hover.copied:before{position:relative;top:-1px;transform:translate(calc(-100% - 1px));display:flex;justify-content:center;align-items:center;border:1px solid var(--vp-code-copy-code-hover-border-color);border-right:0;border-radius:4px 0 0 4px;padding:0 10px;width:fit-content;height:40px;text-align:center;font-size:12px;font-weight:500;color:var(--vp-code-copy-code-active-text);background-color:var(--vp-code-copy-code-hover-bg);white-space:nowrap;content:var(--vp-code-copy-copied-text-content)}.vp-doc [class*=language-]>span.lang{position:absolute;top:2px;right:8px;z-index:2;font-size:12px;font-weight:500;color:var(--vp-code-lang-color);transition:color .4s,opacity .4s}.vp-doc [class*=language-]:hover>button.copy+span.lang,.vp-doc [class*=language-]>button.copy:focus+span.lang{opacity:0}.vp-doc .VPTeamMembers{margin-top:24px}.vp-doc .VPTeamMembers.small.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}.vp-doc .VPTeamMembers.small.count-2 .container,.vp-doc .VPTeamMembers.small.count-3 .container{max-width:100%!important}.vp-doc .VPTeamMembers.medium.count-1 .container{margin:0!important;max-width:calc((100% - 24px)/2)!important}:is(.vp-external-link-icon,.vp-doc a[href*="://"],.vp-doc a[target=_blank]):not(.no-icon):after{display:inline-block;margin-top:-1px;margin-left:4px;width:11px;height:11px;background:currentColor;color:var(--vp-c-text-3);flex-shrink:0;--icon: url("data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' %3E%3Cpath d='M0 0h24v24H0V0z' fill='none' /%3E%3Cpath d='M9 5v2h6.59L4 18.59 5.41 20 17 8.41V15h2V5H9z' /%3E%3C/svg%3E");-webkit-mask-image:var(--icon);mask-image:var(--icon)}.vp-external-link-icon:after{content:""}.external-link-icon-enabled :is(.vp-doc a[href*="://"],.vp-doc a[target=_blank]):after{content:"";color:currentColor}.vp-sponsor{border-radius:16px;overflow:hidden}.vp-sponsor.aside{border-radius:12px}.vp-sponsor-section+.vp-sponsor-section{margin-top:4px}.vp-sponsor-tier{margin:0 0 4px!important;text-align:center;letter-spacing:1px!important;line-height:24px;width:100%;font-weight:600;color:var(--vp-c-text-2);background-color:var(--vp-c-bg-soft)}.vp-sponsor.normal .vp-sponsor-tier{padding:13px 0 11px;font-size:14px}.vp-sponsor.aside .vp-sponsor-tier{padding:9px 0 7px;font-size:12px}.vp-sponsor-grid+.vp-sponsor-tier{margin-top:4px}.vp-sponsor-grid{display:flex;flex-wrap:wrap;gap:4px}.vp-sponsor-grid.xmini .vp-sponsor-grid-link{height:64px}.vp-sponsor-grid.xmini .vp-sponsor-grid-image{max-width:64px;max-height:22px}.vp-sponsor-grid.mini .vp-sponsor-grid-link{height:72px}.vp-sponsor-grid.mini .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.small .vp-sponsor-grid-link{height:96px}.vp-sponsor-grid.small .vp-sponsor-grid-image{max-width:96px;max-height:24px}.vp-sponsor-grid.medium .vp-sponsor-grid-link{height:112px}.vp-sponsor-grid.medium .vp-sponsor-grid-image{max-width:120px;max-height:36px}.vp-sponsor-grid.big .vp-sponsor-grid-link{height:184px}.vp-sponsor-grid.big .vp-sponsor-grid-image{max-width:192px;max-height:56px}.vp-sponsor-grid[data-vp-grid="2"] .vp-sponsor-grid-item{width:calc((100% - 4px)/2)}.vp-sponsor-grid[data-vp-grid="3"] .vp-sponsor-grid-item{width:calc((100% - 4px * 2) / 3)}.vp-sponsor-grid[data-vp-grid="4"] .vp-sponsor-grid-item{width:calc((100% - 12px)/4)}.vp-sponsor-grid[data-vp-grid="5"] .vp-sponsor-grid-item{width:calc((100% - 16px)/5)}.vp-sponsor-grid[data-vp-grid="6"] .vp-sponsor-grid-item{width:calc((100% - 4px * 5) / 6)}.vp-sponsor-grid-item{flex-shrink:0;width:100%;background-color:var(--vp-c-bg-soft);transition:background-color .25s}.vp-sponsor-grid-item:hover{background-color:var(--vp-c-default-soft)}.vp-sponsor-grid-item:hover .vp-sponsor-grid-image{filter:grayscale(0) invert(0)}.vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.dark .vp-sponsor-grid-item:hover{background-color:var(--vp-c-white)}.dark .vp-sponsor-grid-item.empty:hover{background-color:var(--vp-c-bg-soft)}.vp-sponsor-grid-link{display:flex}.vp-sponsor-grid-box{display:flex;justify-content:center;align-items:center;width:100%}.vp-sponsor-grid-image{max-width:100%;filter:grayscale(1);transition:filter .25s}.dark .vp-sponsor-grid-image{filter:grayscale(1) invert(1)}.VPBadge{display:inline-block;margin-left:2px;border:1px solid transparent;border-radius:12px;padding:0 10px;line-height:22px;font-size:12px;font-weight:500;transform:translateY(-2px)}.VPBadge.small{padding:0 6px;line-height:18px;font-size:10px;transform:translateY(-8px)}.VPDocFooter .VPBadge{display:none}.vp-doc h1>.VPBadge{margin-top:4px;vertical-align:top}.vp-doc h2>.VPBadge{margin-top:3px;padding:0 8px;vertical-align:top}.vp-doc h3>.VPBadge{vertical-align:middle}.vp-doc h4>.VPBadge,.vp-doc h5>.VPBadge,.vp-doc h6>.VPBadge{vertical-align:middle;line-height:18px}.VPBadge.info{border-color:var(--vp-badge-info-border);color:var(--vp-badge-info-text);background-color:var(--vp-badge-info-bg)}.VPBadge.tip{border-color:var(--vp-badge-tip-border);color:var(--vp-badge-tip-text);background-color:var(--vp-badge-tip-bg)}.VPBadge.warning{border-color:var(--vp-badge-warning-border);color:var(--vp-badge-warning-text);background-color:var(--vp-badge-warning-bg)}.VPBadge.danger{border-color:var(--vp-badge-danger-border);color:var(--vp-badge-danger-text);background-color:var(--vp-badge-danger-bg)}.VPBackdrop[data-v-54a304ca]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:var(--vp-z-index-backdrop);background:var(--vp-backdrop-bg-color);transition:opacity .5s}.VPBackdrop.fade-enter-from[data-v-54a304ca],.VPBackdrop.fade-leave-to[data-v-54a304ca]{opacity:0}.VPBackdrop.fade-leave-active[data-v-54a304ca]{transition-duration:.25s}@media (min-width: 1280px){.VPBackdrop[data-v-54a304ca]{display:none}}.NotFound[data-v-6ff51ddd]{padding:64px 24px 96px;text-align:center}@media (min-width: 768px){.NotFound[data-v-6ff51ddd]{padding:96px 32px 168px}}.code[data-v-6ff51ddd]{line-height:64px;font-size:64px;font-weight:600}.title[data-v-6ff51ddd]{padding-top:12px;letter-spacing:2px;line-height:20px;font-size:20px;font-weight:700}.divider[data-v-6ff51ddd]{margin:24px auto 18px;width:64px;height:1px;background-color:var(--vp-c-divider)}.quote[data-v-6ff51ddd]{margin:0 auto;max-width:256px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.action[data-v-6ff51ddd]{padding-top:20px}.link[data-v-6ff51ddd]{display:inline-block;border:1px solid var(--vp-c-brand-1);border-radius:16px;padding:3px 16px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:border-color .25s,color .25s}.link[data-v-6ff51ddd]:hover{border-color:var(--vp-c-brand-2);color:var(--vp-c-brand-2)}.root[data-v-53c99d69]{position:relative;z-index:1}.nested[data-v-53c99d69]{padding-right:16px;padding-left:16px}.outline-link[data-v-53c99d69]{display:block;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;transition:color .5s}.outline-link[data-v-53c99d69]:hover,.outline-link.active[data-v-53c99d69]{color:var(--vp-c-text-1);transition:color .25s}.outline-link.nested[data-v-53c99d69]{padding-left:13px}.VPDocAsideOutline[data-v-f610f197]{display:none}.VPDocAsideOutline.has-outline[data-v-f610f197]{display:block}.content[data-v-f610f197]{position:relative;border-left:1px solid var(--vp-c-divider);padding-left:16px;font-size:13px;font-weight:500}.outline-marker[data-v-f610f197]{position:absolute;top:32px;left:-1px;z-index:0;opacity:0;width:2px;border-radius:2px;height:18px;background-color:var(--vp-c-brand-1);transition:top .25s cubic-bezier(0,1,.5,1),background-color .5s,opacity .25s}.outline-title[data-v-f610f197]{line-height:32px;font-size:14px;font-weight:600}.VPDocAside[data-v-cb998dce]{display:flex;flex-direction:column;flex-grow:1}.spacer[data-v-cb998dce]{flex-grow:1}.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideSponsors,.VPDocAside[data-v-cb998dce] .spacer+.VPDocAsideCarbonAds{margin-top:24px}.VPDocAside[data-v-cb998dce] .VPDocAsideSponsors+.VPDocAsideCarbonAds{margin-top:16px}.VPLastUpdated[data-v-1bb0c8a8]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 640px){.VPLastUpdated[data-v-1bb0c8a8]{line-height:32px;font-size:14px;font-weight:500}}.VPDocFooter[data-v-1bcd8184]{margin-top:64px}.edit-info[data-v-1bcd8184]{padding-bottom:18px}@media (min-width: 640px){.edit-info[data-v-1bcd8184]{display:flex;justify-content:space-between;align-items:center;padding-bottom:14px}}.edit-link-button[data-v-1bcd8184]{display:flex;align-items:center;border:0;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.edit-link-button[data-v-1bcd8184]:hover{color:var(--vp-c-brand-2)}.edit-link-icon[data-v-1bcd8184]{margin-right:8px}.prev-next[data-v-1bcd8184]{border-top:1px solid var(--vp-c-divider);padding-top:24px;display:grid;grid-row-gap:8px}@media (min-width: 640px){.prev-next[data-v-1bcd8184]{grid-template-columns:repeat(2,1fr);grid-column-gap:16px}}.pager-link[data-v-1bcd8184]{display:block;border:1px solid var(--vp-c-divider);border-radius:8px;padding:11px 16px 13px;width:100%;height:100%;transition:border-color .25s}.pager-link[data-v-1bcd8184]:hover{border-color:var(--vp-c-brand-1)}.pager-link.next[data-v-1bcd8184]{margin-left:auto;text-align:right}.desc[data-v-1bcd8184]{display:block;line-height:20px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.title[data-v-1bcd8184]{display:block;line-height:20px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1);transition:color .25s}.VPDoc[data-v-e6f2a212]{padding:32px 24px 96px;width:100%}@media (min-width: 768px){.VPDoc[data-v-e6f2a212]{padding:48px 32px 128px}}@media (min-width: 960px){.VPDoc[data-v-e6f2a212]{padding:48px 32px 0}.VPDoc:not(.has-sidebar) .container[data-v-e6f2a212]{display:flex;justify-content:center;max-width:992px}.VPDoc:not(.has-sidebar) .content[data-v-e6f2a212]{max-width:752px}}@media (min-width: 1280px){.VPDoc .container[data-v-e6f2a212]{display:flex;justify-content:center}.VPDoc .aside[data-v-e6f2a212]{display:block}}@media (min-width: 1440px){.VPDoc:not(.has-sidebar) .content[data-v-e6f2a212]{max-width:784px}.VPDoc:not(.has-sidebar) .container[data-v-e6f2a212]{max-width:1104px}}.container[data-v-e6f2a212]{margin:0 auto;width:100%}.aside[data-v-e6f2a212]{position:relative;display:none;order:2;flex-grow:1;padding-left:32px;width:100%;max-width:256px}.left-aside[data-v-e6f2a212]{order:1;padding-left:unset;padding-right:32px}.aside-container[data-v-e6f2a212]{position:fixed;top:0;padding-top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + var(--vp-doc-top-height, 0px) + 48px);width:224px;height:100vh;overflow-x:hidden;overflow-y:auto;scrollbar-width:none}.aside-container[data-v-e6f2a212]::-webkit-scrollbar{display:none}.aside-curtain[data-v-e6f2a212]{position:fixed;bottom:0;z-index:10;width:224px;height:32px;background:linear-gradient(transparent,var(--vp-c-bg) 70%)}.aside-content[data-v-e6f2a212]{display:flex;flex-direction:column;min-height:calc(100vh - (var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px));padding-bottom:32px}.content[data-v-e6f2a212]{position:relative;margin:0 auto;width:100%}@media (min-width: 960px){.content[data-v-e6f2a212]{padding:0 32px 128px}}@media (min-width: 1280px){.content[data-v-e6f2a212]{order:1;margin:0;min-width:640px}}.content-container[data-v-e6f2a212]{margin:0 auto}.VPDoc.has-aside .content-container[data-v-e6f2a212]{max-width:688px}.VPButton[data-v-c9cf0e3c]{display:inline-block;border:1px solid transparent;text-align:center;font-weight:600;white-space:nowrap;transition:color .25s,border-color .25s,background-color .25s}.VPButton[data-v-c9cf0e3c]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-c9cf0e3c]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-c9cf0e3c]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-c9cf0e3c]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-c9cf0e3c]:hover{border-color:var(--vp-button-brand-hover-border);color:var(--vp-button-brand-hover-text);background-color:var(--vp-button-brand-hover-bg)}.VPButton.brand[data-v-c9cf0e3c]:active{border-color:var(--vp-button-brand-active-border);color:var(--vp-button-brand-active-text);background-color:var(--vp-button-brand-active-bg)}.VPButton.alt[data-v-c9cf0e3c]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-c9cf0e3c]:hover{border-color:var(--vp-button-alt-hover-border);color:var(--vp-button-alt-hover-text);background-color:var(--vp-button-alt-hover-bg)}.VPButton.alt[data-v-c9cf0e3c]:active{border-color:var(--vp-button-alt-active-border);color:var(--vp-button-alt-active-text);background-color:var(--vp-button-alt-active-bg)}.VPButton.sponsor[data-v-c9cf0e3c]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-c9cf0e3c]:hover{border-color:var(--vp-button-sponsor-hover-border);color:var(--vp-button-sponsor-hover-text);background-color:var(--vp-button-sponsor-hover-bg)}.VPButton.sponsor[data-v-c9cf0e3c]:active{border-color:var(--vp-button-sponsor-active-border);color:var(--vp-button-sponsor-active-text);background-color:var(--vp-button-sponsor-active-bg)}html:not(.dark) .VPImage.dark[data-v-ab19afbb]{display:none}.dark .VPImage.light[data-v-ab19afbb]{display:none}.VPHero[data-v-b10c5094]{margin-top:calc((var(--vp-nav-height) + var(--vp-layout-top-height, 0px)) * -1);padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 48px) 24px 48px}@media (min-width: 640px){.VPHero[data-v-b10c5094]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 48px 64px}}@media (min-width: 960px){.VPHero[data-v-b10c5094]{padding:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px) + 80px) 64px 64px}}.container[data-v-b10c5094]{display:flex;flex-direction:column;margin:0 auto;max-width:1152px}@media (min-width: 960px){.container[data-v-b10c5094]{flex-direction:row}}.main[data-v-b10c5094]{position:relative;z-index:10;order:2;flex-grow:1;flex-shrink:0}.VPHero.has-image .container[data-v-b10c5094]{text-align:center}@media (min-width: 960px){.VPHero.has-image .container[data-v-b10c5094]{text-align:left}}@media (min-width: 960px){.main[data-v-b10c5094]{order:1;width:calc((100% / 3) * 2)}.VPHero.has-image .main[data-v-b10c5094]{max-width:592px}}.name[data-v-b10c5094],.text[data-v-b10c5094]{max-width:392px;letter-spacing:-.4px;line-height:40px;font-size:32px;font-weight:700;white-space:pre-wrap}.VPHero.has-image .name[data-v-b10c5094],.VPHero.has-image .text[data-v-b10c5094]{margin:0 auto}.name[data-v-b10c5094]{color:var(--vp-home-hero-name-color)}.clip[data-v-b10c5094]{background:var(--vp-home-hero-name-background);-webkit-background-clip:text;background-clip:text;-webkit-text-fill-color:var(--vp-home-hero-name-color)}@media (min-width: 640px){.name[data-v-b10c5094],.text[data-v-b10c5094]{max-width:576px;line-height:56px;font-size:48px}}@media (min-width: 960px){.name[data-v-b10c5094],.text[data-v-b10c5094]{line-height:64px;font-size:56px}.VPHero.has-image .name[data-v-b10c5094],.VPHero.has-image .text[data-v-b10c5094]{margin:0}}.tagline[data-v-b10c5094]{padding-top:8px;max-width:392px;line-height:28px;font-size:18px;font-weight:500;white-space:pre-wrap;color:var(--vp-c-text-2)}.VPHero.has-image .tagline[data-v-b10c5094]{margin:0 auto}@media (min-width: 640px){.tagline[data-v-b10c5094]{padding-top:12px;max-width:576px;line-height:32px;font-size:20px}}@media (min-width: 960px){.tagline[data-v-b10c5094]{line-height:36px;font-size:24px}.VPHero.has-image .tagline[data-v-b10c5094]{margin:0}}.actions[data-v-b10c5094]{display:flex;flex-wrap:wrap;margin:-6px;padding-top:24px}.VPHero.has-image .actions[data-v-b10c5094]{justify-content:center}@media (min-width: 640px){.actions[data-v-b10c5094]{padding-top:32px}}@media (min-width: 960px){.VPHero.has-image .actions[data-v-b10c5094]{justify-content:flex-start}}.action[data-v-b10c5094]{flex-shrink:0;padding:6px}.image[data-v-b10c5094]{order:1;margin:-76px -24px -48px}@media (min-width: 640px){.image[data-v-b10c5094]{margin:-108px -24px -48px}}@media (min-width: 960px){.image[data-v-b10c5094]{flex-grow:1;order:2;margin:0;min-height:100%}}.image-container[data-v-b10c5094]{position:relative;margin:0 auto;width:320px;height:320px}@media (min-width: 640px){.image-container[data-v-b10c5094]{width:392px;height:392px}}@media (min-width: 960px){.image-container[data-v-b10c5094]{display:flex;justify-content:center;align-items:center;width:100%;height:100%;transform:translate(-32px,-32px)}}.image-bg[data-v-b10c5094]{position:absolute;top:50%;left:50%;border-radius:50%;width:192px;height:192px;background-image:var(--vp-home-hero-image-background-image);filter:var(--vp-home-hero-image-filter);transform:translate(-50%,-50%)}@media (min-width: 640px){.image-bg[data-v-b10c5094]{width:256px;height:256px}}@media (min-width: 960px){.image-bg[data-v-b10c5094]{width:320px;height:320px}}[data-v-b10c5094] .image-src{position:absolute;top:50%;left:50%;max-width:192px;max-height:192px;transform:translate(-50%,-50%)}@media (min-width: 640px){[data-v-b10c5094] .image-src{max-width:256px;max-height:256px}}@media (min-width: 960px){[data-v-b10c5094] .image-src{max-width:320px;max-height:320px}}.VPFeature[data-v-bd37d1a2]{display:block;border:1px solid var(--vp-c-bg-soft);border-radius:12px;height:100%;background-color:var(--vp-c-bg-soft);transition:border-color .25s,background-color .25s}.VPFeature.link[data-v-bd37d1a2]:hover{border-color:var(--vp-c-brand-1)}.box[data-v-bd37d1a2]{display:flex;flex-direction:column;padding:24px;height:100%}.box[data-v-bd37d1a2]>.VPImage{margin-bottom:20px}.icon[data-v-bd37d1a2]{display:flex;justify-content:center;align-items:center;margin-bottom:20px;border-radius:6px;background-color:var(--vp-c-default-soft);width:48px;height:48px;font-size:24px;transition:background-color .25s}.title[data-v-bd37d1a2]{line-height:24px;font-size:16px;font-weight:600}.details[data-v-bd37d1a2]{flex-grow:1;padding-top:8px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.link-text[data-v-bd37d1a2]{padding-top:8px}.link-text-value[data-v-bd37d1a2]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.link-text-icon[data-v-bd37d1a2]{margin-left:6px}.VPFeatures[data-v-b1eea84a]{position:relative;padding:0 24px}@media (min-width: 640px){.VPFeatures[data-v-b1eea84a]{padding:0 48px}}@media (min-width: 960px){.VPFeatures[data-v-b1eea84a]{padding:0 64px}}.container[data-v-b1eea84a]{margin:0 auto;max-width:1152px}.items[data-v-b1eea84a]{display:flex;flex-wrap:wrap;margin:-8px}.item[data-v-b1eea84a]{padding:8px;width:100%}@media (min-width: 640px){.item.grid-2[data-v-b1eea84a],.item.grid-4[data-v-b1eea84a],.item.grid-6[data-v-b1eea84a]{width:50%}}@media (min-width: 768px){.item.grid-2[data-v-b1eea84a],.item.grid-4[data-v-b1eea84a]{width:50%}.item.grid-3[data-v-b1eea84a],.item.grid-6[data-v-b1eea84a]{width:calc(100% / 3)}}@media (min-width: 960px){.item.grid-4[data-v-b1eea84a]{width:25%}}.container[data-v-c141a4bd]{margin:auto;width:100%;max-width:1280px;padding:0 24px}@media (min-width: 640px){.container[data-v-c141a4bd]{padding:0 48px}}@media (min-width: 960px){.container[data-v-c141a4bd]{width:100%;padding:0 64px}}.vp-doc[data-v-c141a4bd] .VPHomeSponsors,.vp-doc[data-v-c141a4bd] .VPTeamPage{margin-left:var(--vp-offset, calc(50% - 50vw) );margin-right:var(--vp-offset, calc(50% - 50vw) )}.vp-doc[data-v-c141a4bd] .VPHomeSponsors h2{border-top:none;letter-spacing:normal}.vp-doc[data-v-c141a4bd] .VPHomeSponsors a,.vp-doc[data-v-c141a4bd] .VPTeamPage a{text-decoration:none}.VPHome[data-v-07b1ad08]{margin-bottom:96px}@media (min-width: 768px){.VPHome[data-v-07b1ad08]{margin-bottom:128px}}.VPContent[data-v-9a6c75ad]{flex-grow:1;flex-shrink:0;margin:var(--vp-layout-top-height, 0px) auto 0;width:100%}.VPContent.is-home[data-v-9a6c75ad]{width:100%;max-width:100%}.VPContent.has-sidebar[data-v-9a6c75ad]{margin:0}@media (min-width: 960px){.VPContent[data-v-9a6c75ad]{padding-top:var(--vp-nav-height)}.VPContent.has-sidebar[data-v-9a6c75ad]{margin:var(--vp-layout-top-height, 0px) 0 0;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPContent.has-sidebar[data-v-9a6c75ad]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.VPFooter[data-v-566314d4]{position:relative;z-index:var(--vp-z-index-footer);border-top:1px solid var(--vp-c-gutter);padding:32px 24px;background-color:var(--vp-c-bg)}.VPFooter.has-sidebar[data-v-566314d4]{display:none}.VPFooter[data-v-566314d4] a{text-decoration-line:underline;text-underline-offset:2px;transition:color .25s}.VPFooter[data-v-566314d4] a:hover{color:var(--vp-c-text-1)}@media (min-width: 768px){.VPFooter[data-v-566314d4]{padding:32px}}.container[data-v-566314d4]{margin:0 auto;max-width:var(--vp-layout-max-width);text-align:center}.message[data-v-566314d4],.copyright[data-v-566314d4]{line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-2)}.VPLocalNavOutlineDropdown[data-v-883964e0]{padding:12px 20px 11px}@media (min-width: 960px){.VPLocalNavOutlineDropdown[data-v-883964e0]{padding:12px 36px 11px}}.VPLocalNavOutlineDropdown button[data-v-883964e0]{display:block;font-size:12px;font-weight:500;line-height:24px;color:var(--vp-c-text-2);transition:color .5s;position:relative}.VPLocalNavOutlineDropdown button[data-v-883964e0]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPLocalNavOutlineDropdown button.open[data-v-883964e0]{color:var(--vp-c-text-1)}.icon[data-v-883964e0]{display:inline-block;vertical-align:middle;margin-left:2px;font-size:14px;transform:rotate(0);transition:transform .25s}@media (min-width: 960px){.VPLocalNavOutlineDropdown button[data-v-883964e0]{font-size:14px}.icon[data-v-883964e0]{font-size:16px}}.open>.icon[data-v-883964e0]{transform:rotate(90deg)}.items[data-v-883964e0]{position:absolute;top:40px;right:16px;left:16px;display:grid;gap:1px;border:1px solid var(--vp-c-border);border-radius:8px;background-color:var(--vp-c-gutter);max-height:calc(var(--vp-vh, 100vh) - 86px);overflow:hidden auto;box-shadow:var(--vp-shadow-3)}@media (min-width: 960px){.items[data-v-883964e0]{right:auto;left:calc(var(--vp-sidebar-width) + 32px);width:320px}}.header[data-v-883964e0]{background-color:var(--vp-c-bg-soft)}.top-link[data-v-883964e0]{display:block;padding:0 16px;line-height:48px;font-size:14px;font-weight:500;color:var(--vp-c-brand-1)}.outline[data-v-883964e0]{padding:8px 0;background-color:var(--vp-c-bg-soft)}.flyout-enter-active[data-v-883964e0]{transition:all .2s ease-out}.flyout-leave-active[data-v-883964e0]{transition:all .15s ease-in}.flyout-enter-from[data-v-883964e0],.flyout-leave-to[data-v-883964e0]{opacity:0;transform:translateY(-16px)}.VPLocalNav[data-v-2488c25a]{position:sticky;top:0;left:0;z-index:var(--vp-z-index-local-nav);border-bottom:1px solid var(--vp-c-gutter);padding-top:var(--vp-layout-top-height, 0px);width:100%;background-color:var(--vp-local-nav-bg-color)}.VPLocalNav.fixed[data-v-2488c25a]{position:fixed}@media (min-width: 960px){.VPLocalNav[data-v-2488c25a]{top:var(--vp-nav-height)}.VPLocalNav.has-sidebar[data-v-2488c25a]{padding-left:var(--vp-sidebar-width)}.VPLocalNav.empty[data-v-2488c25a]{display:none}}@media (min-width: 1280px){.VPLocalNav[data-v-2488c25a]{display:none}}@media (min-width: 1440px){.VPLocalNav.has-sidebar[data-v-2488c25a]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.container[data-v-2488c25a]{display:flex;justify-content:space-between;align-items:center}.menu[data-v-2488c25a]{display:flex;align-items:center;padding:12px 24px 11px;line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.menu[data-v-2488c25a]:hover{color:var(--vp-c-text-1);transition:color .25s}@media (min-width: 768px){.menu[data-v-2488c25a]{padding:0 32px}}@media (min-width: 960px){.menu[data-v-2488c25a]{display:none}}.menu-icon[data-v-2488c25a]{margin-right:8px;font-size:14px}.VPOutlineDropdown[data-v-2488c25a]{padding:12px 24px 11px}@media (min-width: 768px){.VPOutlineDropdown[data-v-2488c25a]{padding:12px 32px 11px}}.VPSwitch[data-v-b4ccac88]{position:relative;border-radius:11px;display:block;width:40px;height:22px;flex-shrink:0;border:1px solid var(--vp-input-border-color);background-color:var(--vp-input-switch-bg-color);transition:border-color .25s!important}.VPSwitch[data-v-b4ccac88]:hover{border-color:var(--vp-c-brand-1)}.check[data-v-b4ccac88]{position:absolute;top:1px;left:1px;width:18px;height:18px;border-radius:50%;background-color:var(--vp-c-neutral-inverse);box-shadow:var(--vp-shadow-1);transition:transform .25s!important}.icon[data-v-b4ccac88]{position:relative;display:block;width:18px;height:18px;border-radius:50%;overflow:hidden}.icon[data-v-b4ccac88] [class^=vpi-]{position:absolute;top:3px;left:3px;width:12px;height:12px;color:var(--vp-c-text-2)}.dark .icon[data-v-b4ccac88] [class^=vpi-]{color:var(--vp-c-text-1);transition:opacity .25s!important}.sun[data-v-be9742d9]{opacity:1}.moon[data-v-be9742d9],.dark .sun[data-v-be9742d9]{opacity:0}.dark .moon[data-v-be9742d9]{opacity:1}.dark .VPSwitchAppearance[data-v-be9742d9] .check{transform:translate(18px)}.VPNavBarAppearance[data-v-3f90c1a5]{display:none}@media (min-width: 1280px){.VPNavBarAppearance[data-v-3f90c1a5]{display:flex;align-items:center}}.VPMenuGroup+.VPMenuLink[data-v-f51f088d]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-f51f088d]{display:block;border-radius:6px;padding:0 12px;line-height:32px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);white-space:nowrap;transition:background-color .25s,color .25s}.link[data-v-f51f088d]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-f51f088d]{color:var(--vp-c-brand-1)}.VPMenuGroup[data-v-a6b0397c]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.VPMenuGroup[data-v-a6b0397c]:first-child{margin-top:0;border-top:0;padding-top:0}.VPMenuGroup+.VPMenuGroup[data-v-a6b0397c]{margin-top:12px;border-top:1px solid var(--vp-c-divider)}.title[data-v-a6b0397c]{padding:0 12px;line-height:32px;font-size:14px;font-weight:600;color:var(--vp-c-text-2);white-space:nowrap;transition:color .25s}.VPMenu[data-v-20ed86d6]{border-radius:12px;padding:12px;min-width:128px;border:1px solid var(--vp-c-divider);background-color:var(--vp-c-bg-elv);box-shadow:var(--vp-shadow-3);transition:background-color .5s;max-height:calc(100vh - var(--vp-nav-height));overflow-y:auto}.VPMenu[data-v-20ed86d6] .group{margin:0 -12px;padding:0 12px 12px}.VPMenu[data-v-20ed86d6] .group+.group{border-top:1px solid var(--vp-c-divider);padding:11px 12px 12px}.VPMenu[data-v-20ed86d6] .group:last-child{padding-bottom:0}.VPMenu[data-v-20ed86d6] .group+.item{border-top:1px solid var(--vp-c-divider);padding:11px 16px 0}.VPMenu[data-v-20ed86d6] .item{padding:0 16px;white-space:nowrap}.VPMenu[data-v-20ed86d6] .label{flex-grow:1;line-height:28px;font-size:12px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.VPMenu[data-v-20ed86d6] .action{padding-left:24px}.VPFlyout[data-v-af5898d3]{position:relative}.VPFlyout[data-v-af5898d3]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-af5898d3]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-af5898d3]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-af5898d3]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-af5898d3]{color:var(--vp-c-brand-2)}.VPFlyout:hover .menu[data-v-af5898d3],.button[aria-expanded=true]+.menu[data-v-af5898d3]{opacity:1;visibility:visible;transform:translateY(0)}.button[aria-expanded=false]+.menu[data-v-af5898d3]{opacity:0;visibility:hidden;transform:translateY(0)}.button[data-v-af5898d3]{display:flex;align-items:center;padding:0 12px;height:var(--vp-nav-height);color:var(--vp-c-text-1);transition:color .5s}.text[data-v-af5898d3]{display:flex;align-items:center;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.option-icon[data-v-af5898d3]{margin-right:0;font-size:16px}.text-icon[data-v-af5898d3]{margin-left:4px;font-size:14px}.icon[data-v-af5898d3]{font-size:20px;transition:fill .25s}.menu[data-v-af5898d3]{position:absolute;top:calc(var(--vp-nav-height) / 2 + 20px);right:0;opacity:0;visibility:hidden;transition:opacity .25s,visibility .25s,transform .25s}.VPSocialLink[data-v-358b6670]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-358b6670]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-358b6670]>svg,.VPSocialLink[data-v-358b6670]>[class^=vpi-social-]{width:20px;height:20px;fill:currentColor}.VPSocialLinks[data-v-e71e869c]{display:flex;justify-content:center}.VPNavBarExtra[data-v-f953d92f]{display:none;margin-right:-12px}@media (min-width: 768px){.VPNavBarExtra[data-v-f953d92f]{display:block}}@media (min-width: 1280px){.VPNavBarExtra[data-v-f953d92f]{display:none}}.trans-title[data-v-f953d92f]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.item.appearance[data-v-f953d92f],.item.social-links[data-v-f953d92f]{display:flex;align-items:center;padding:0 12px}.item.appearance[data-v-f953d92f]{min-width:176px}.appearance-action[data-v-f953d92f]{margin-right:-2px}.social-links-list[data-v-f953d92f]{margin:-4px -8px}.VPNavBarHamburger[data-v-6bee1efd]{display:flex;justify-content:center;align-items:center;width:48px;height:var(--vp-nav-height)}@media (min-width: 768px){.VPNavBarHamburger[data-v-6bee1efd]{display:none}}.container[data-v-6bee1efd]{position:relative;width:16px;height:14px;overflow:hidden}.VPNavBarHamburger:hover .top[data-v-6bee1efd]{top:0;left:0;transform:translate(4px)}.VPNavBarHamburger:hover .middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(0)}.VPNavBarHamburger:hover .bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(8px)}.VPNavBarHamburger.active .top[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(225deg)}.VPNavBarHamburger.active .middle[data-v-6bee1efd]{top:6px;transform:translate(16px)}.VPNavBarHamburger.active .bottom[data-v-6bee1efd]{top:6px;transform:translate(0) rotate(135deg)}.VPNavBarHamburger.active:hover .top[data-v-6bee1efd],.VPNavBarHamburger.active:hover .middle[data-v-6bee1efd],.VPNavBarHamburger.active:hover .bottom[data-v-6bee1efd]{background-color:var(--vp-c-text-2);transition:top .25s,background-color .25s,transform .25s}.top[data-v-6bee1efd],.middle[data-v-6bee1efd],.bottom[data-v-6bee1efd]{position:absolute;width:16px;height:2px;background-color:var(--vp-c-text-1);transition:top .25s,background-color .5s,transform .25s}.top[data-v-6bee1efd]{top:0;left:0;transform:translate(0)}.middle[data-v-6bee1efd]{top:6px;left:0;transform:translate(8px)}.bottom[data-v-6bee1efd]{top:12px;left:0;transform:translate(4px)}.VPNavBarMenuLink[data-v-08fbf4b6]{display:flex;align-items:center;padding:0 12px;line-height:var(--vp-nav-height);font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.VPNavBarMenuLink.active[data-v-08fbf4b6],.VPNavBarMenuLink[data-v-08fbf4b6]:hover{color:var(--vp-c-brand-1)}.VPNavBarMenu[data-v-afb2845e]{display:none}@media (min-width: 768px){.VPNavBarMenu[data-v-afb2845e]{display:flex}}/*! @docsearch/css 3.6.2 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */:root{--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:rgba(101,108,133,.8);--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 hsla(0,0%,100%,.5),0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px rgba(30,35,90,.4);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 rgba(30,35,90,.4);--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 rgba(69,98,155,.12)}html[data-theme=dark]{--docsearch-text-color:#f5f6f7;--docsearch-container-background:rgba(9,10,17,.8);--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 rgba(3,4,9,.3);--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 rgba(3,4,9,.30196078431372547);--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 rgba(73,76,106,.5),0 -4px 8px 0 rgba(0,0,0,.2);--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;margin:0 0 0 16px;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:none}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;position:relative;padding:0 0 2px;border:0;top:-1px;width:20px}.DocSearch-Button-Key--pressed{transform:translate3d(0,1px,0);box-shadow:var(--docsearch-key-pressed-shadow)}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder{display:none}}.DocSearch--active{overflow:hidden!important}.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Container a{text-decoration:none}.DocSearch-Link{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:transparent;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:none;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator{display:none}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}}.DocSearch-Reset{animation:fade-in .1s ease-in forwards;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Cancel{display:none}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:transparent}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{color:var(--docsearch-muted-color);display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--deleting{transition:none}}.DocSearch-Hit--deleting{opacity:0;transition:all .25s linear}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit--favoriting{transition:none}}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:all .25s linear;transition-delay:.25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;stroke-width:var(--docsearch-icon-stroke-width);width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit[aria-selected=true] mark{text-decoration:underline}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color);stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{transition:none}}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:none;text-decoration:underline}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li{align-items:center;display:flex}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{align-items:center;background:var(--docsearch-key-gradient);border-radius:2px;box-shadow:var(--docsearch-key-shadow);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;color:var(--docsearch-muted-color);border:0;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@media (max-width:768px){:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh, 1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Dropdown{max-height:calc(var(--docsearch-vh, 1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Cancel{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:none;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}}@keyframes fade-in{0%{opacity:0}to{opacity:1}}[class*=DocSearch]{--docsearch-primary-color: var(--vp-c-brand-1);--docsearch-highlight-color: var(--docsearch-primary-color);--docsearch-text-color: var(--vp-c-text-1);--docsearch-muted-color: var(--vp-c-text-2);--docsearch-searchbox-shadow: none;--docsearch-searchbox-background: transparent;--docsearch-searchbox-focus-background: transparent;--docsearch-key-gradient: transparent;--docsearch-key-shadow: none;--docsearch-modal-background: var(--vp-c-bg-soft);--docsearch-footer-background: var(--vp-c-bg)}.dark [class*=DocSearch]{--docsearch-modal-shadow: none;--docsearch-footer-shadow: none;--docsearch-logo-color: var(--vp-c-text-2);--docsearch-hit-background: var(--vp-c-default-soft);--docsearch-hit-color: var(--vp-c-text-2);--docsearch-hit-shadow: none}.DocSearch-Button{display:flex;justify-content:center;align-items:center;margin:0;padding:0;width:48px;height:55px;background:transparent;transition:border-color .25s}.DocSearch-Button:hover{background:transparent}.DocSearch-Button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.DocSearch-Button-Key--pressed{transform:none;box-shadow:none}.DocSearch-Button:focus:not(:focus-visible){outline:none!important}@media (min-width: 768px){.DocSearch-Button{justify-content:flex-start;border:1px solid transparent;border-radius:8px;padding:0 10px 0 12px;width:100%;height:40px;background-color:var(--vp-c-bg-alt)}.DocSearch-Button:hover{border-color:var(--vp-c-brand-1);background:var(--vp-c-bg-alt)}}.DocSearch-Button .DocSearch-Button-Container{display:flex;align-items:center}.DocSearch-Button .DocSearch-Search-Icon{position:relative;width:16px;height:16px;color:var(--vp-c-text-1);fill:currentColor;transition:color .5s}.DocSearch-Button:hover .DocSearch-Search-Icon{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Search-Icon{top:1px;margin-right:8px;width:14px;height:14px;color:var(--vp-c-text-2)}}.DocSearch-Button .DocSearch-Button-Placeholder{display:none;margin-top:2px;padding:0 16px 0 0;font-size:13px;font-weight:500;color:var(--vp-c-text-2);transition:color .5s}.DocSearch-Button:hover .DocSearch-Button-Placeholder{color:var(--vp-c-text-1)}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Placeholder{display:inline-block}}.DocSearch-Button .DocSearch-Button-Keys{direction:ltr;display:none;min-width:auto}@media (min-width: 768px){.DocSearch-Button .DocSearch-Button-Keys{display:flex;align-items:center}}.DocSearch-Button .DocSearch-Button-Key{display:block;margin:2px 0 0;border:1px solid var(--vp-c-divider);border-right:none;border-radius:4px 0 0 4px;padding-left:6px;min-width:0;width:auto;height:22px;line-height:22px;font-family:var(--vp-font-family-base);font-size:12px;font-weight:500;transition:color .5s,border-color .5s}.DocSearch-Button .DocSearch-Button-Key+.DocSearch-Button-Key{border-right:1px solid var(--vp-c-divider);border-left:none;border-radius:0 4px 4px 0;padding-left:2px;padding-right:6px}.DocSearch-Button .DocSearch-Button-Key:first-child{font-size:0!important}.DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"Ctrl";font-size:12px;letter-spacing:normal;color:var(--docsearch-muted-color)}.mac .DocSearch-Button .DocSearch-Button-Key:first-child:after{content:"⌘"}.DocSearch-Button .DocSearch-Button-Key:first-child>*{display:none}.DocSearch-Search-Icon{--icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' stroke-width='1.6' viewBox='0 0 20 20'%3E%3Cpath fill='none' stroke='currentColor' stroke-linecap='round' stroke-linejoin='round' d='m14.386 14.386 4.088 4.088-4.088-4.088A7.533 7.533 0 1 1 3.733 3.733a7.533 7.533 0 0 1 10.653 10.653z'/%3E%3C/svg%3E")}.VPNavBarSearch{display:flex;align-items:center}@media (min-width: 768px){.VPNavBarSearch{flex-grow:1;padding-left:24px}}@media (min-width: 960px){.VPNavBarSearch{padding-left:32px}}.dark .DocSearch-Footer{border-top:1px solid var(--vp-c-divider)}.DocSearch-Form{border:1px solid var(--vp-c-brand-1);background-color:var(--vp-c-white)}.dark .DocSearch-Form{background-color:var(--vp-c-default-soft)}.DocSearch-Screen-Icon>svg{margin:auto}.VPNavBarSocialLinks[data-v-ef6192dc]{display:none}@media (min-width: 1280px){.VPNavBarSocialLinks[data-v-ef6192dc]{display:flex;align-items:center}}.title[data-v-0ad69264]{display:flex;align-items:center;border-bottom:1px solid transparent;width:100%;height:var(--vp-nav-height);font-size:16px;font-weight:600;color:var(--vp-c-text-1);transition:opacity .25s}@media (min-width: 960px){.title[data-v-0ad69264]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-0ad69264]{border-bottom-color:var(--vp-c-divider)}}[data-v-0ad69264] .logo{margin-right:8px;height:var(--vp-nav-logo-height)}.VPNavBarTranslations[data-v-acee064b]{display:none}@media (min-width: 1280px){.VPNavBarTranslations[data-v-acee064b]{display:flex;align-items:center}}.title[data-v-acee064b]{padding:0 24px 0 12px;line-height:32px;font-size:14px;font-weight:700;color:var(--vp-c-text-1)}.VPNavBar[data-v-9fd4d1dd]{position:relative;height:var(--vp-nav-height);pointer-events:none;white-space:nowrap;transition:background-color .25s}.VPNavBar.screen-open[data-v-9fd4d1dd]{transition:none;background-color:var(--vp-nav-bg-color);border-bottom:1px solid var(--vp-c-divider)}.VPNavBar[data-v-9fd4d1dd]:not(.home){background-color:var(--vp-nav-bg-color)}@media (min-width: 960px){.VPNavBar[data-v-9fd4d1dd]:not(.home){background-color:transparent}.VPNavBar[data-v-9fd4d1dd]:not(.has-sidebar):not(.home.top){background-color:var(--vp-nav-bg-color)}}.wrapper[data-v-9fd4d1dd]{padding:0 8px 0 24px}@media (min-width: 768px){.wrapper[data-v-9fd4d1dd]{padding:0 32px}}@media (min-width: 960px){.VPNavBar.has-sidebar .wrapper[data-v-9fd4d1dd]{padding:0}}.container[data-v-9fd4d1dd]{display:flex;justify-content:space-between;margin:0 auto;max-width:calc(var(--vp-layout-max-width) - 64px);height:var(--vp-nav-height);pointer-events:none}.container>.title[data-v-9fd4d1dd],.container>.content[data-v-9fd4d1dd]{pointer-events:none}.container[data-v-9fd4d1dd] *{pointer-events:auto}@media (min-width: 960px){.VPNavBar.has-sidebar .container[data-v-9fd4d1dd]{max-width:100%}}.title[data-v-9fd4d1dd]{flex-shrink:0;height:calc(var(--vp-nav-height) - 1px);transition:background-color .5s}@media (min-width: 960px){.VPNavBar.has-sidebar .title[data-v-9fd4d1dd]{position:absolute;top:0;left:0;z-index:2;padding:0 32px;width:var(--vp-sidebar-width);height:var(--vp-nav-height);background-color:transparent}}@media (min-width: 1440px){.VPNavBar.has-sidebar .title[data-v-9fd4d1dd]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}.content[data-v-9fd4d1dd]{flex-grow:1}@media (min-width: 960px){.VPNavBar.has-sidebar .content[data-v-9fd4d1dd]{position:relative;z-index:1;padding-right:32px;padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .content[data-v-9fd4d1dd]{padding-right:calc((100vw - var(--vp-layout-max-width)) / 2 + 32px);padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.content-body[data-v-9fd4d1dd]{display:flex;justify-content:flex-end;align-items:center;height:var(--vp-nav-height);transition:background-color .5s}@media (min-width: 960px){.VPNavBar:not(.home.top) .content-body[data-v-9fd4d1dd]{position:relative;background-color:var(--vp-nav-bg-color)}.VPNavBar:not(.has-sidebar):not(.home.top) .content-body[data-v-9fd4d1dd]{background-color:transparent}}@media (max-width: 767px){.content-body[data-v-9fd4d1dd]{column-gap:.5rem}}.menu+.translations[data-v-9fd4d1dd]:before,.menu+.appearance[data-v-9fd4d1dd]:before,.menu+.social-links[data-v-9fd4d1dd]:before,.translations+.appearance[data-v-9fd4d1dd]:before,.appearance+.social-links[data-v-9fd4d1dd]:before{margin-right:8px;margin-left:8px;width:1px;height:24px;background-color:var(--vp-c-divider);content:""}.menu+.appearance[data-v-9fd4d1dd]:before,.translations+.appearance[data-v-9fd4d1dd]:before{margin-right:16px}.appearance+.social-links[data-v-9fd4d1dd]:before{margin-left:16px}.social-links[data-v-9fd4d1dd]{margin-right:-8px}.divider[data-v-9fd4d1dd]{width:100%;height:1px}@media (min-width: 960px){.VPNavBar.has-sidebar .divider[data-v-9fd4d1dd]{padding-left:var(--vp-sidebar-width)}}@media (min-width: 1440px){.VPNavBar.has-sidebar .divider[data-v-9fd4d1dd]{padding-left:calc((100vw - var(--vp-layout-max-width)) / 2 + var(--vp-sidebar-width))}}.divider-line[data-v-9fd4d1dd]{width:100%;height:1px;transition:background-color .5s}.VPNavBar:not(.home) .divider-line[data-v-9fd4d1dd]{background-color:var(--vp-c-gutter)}@media (min-width: 960px){.VPNavBar:not(.home.top) .divider-line[data-v-9fd4d1dd]{background-color:var(--vp-c-gutter)}.VPNavBar:not(.has-sidebar):not(.home.top) .divider[data-v-9fd4d1dd]{background-color:var(--vp-c-gutter)}}.VPNavScreenAppearance[data-v-a3e2920d]{display:flex;justify-content:space-between;align-items:center;border-radius:8px;padding:12px 14px 12px 16px;background-color:var(--vp-c-bg-soft)}.text[data-v-a3e2920d]{line-height:24px;font-size:12px;font-weight:500;color:var(--vp-c-text-2)}.VPNavScreenMenuLink[data-v-1a934d60]{display:block;border-bottom:1px solid var(--vp-c-divider);padding:12px 0 11px;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:border-color .25s,color .25s}.VPNavScreenMenuLink[data-v-1a934d60]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-aea78dd1]{display:block;margin-left:12px;line-height:32px;font-size:14px;font-weight:400;color:var(--vp-c-text-1);transition:color .25s}.VPNavScreenMenuGroupLink[data-v-aea78dd1]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupSection[data-v-f60dbfa7]{display:block}.title[data-v-f60dbfa7]{line-height:32px;font-size:13px;font-weight:700;color:var(--vp-c-text-2);transition:color .25s}.VPNavScreenMenuGroup[data-v-d99bfeec]{border-bottom:1px solid var(--vp-c-divider);height:48px;overflow:hidden;transition:border-color .5s}.VPNavScreenMenuGroup .items[data-v-d99bfeec]{visibility:hidden}.VPNavScreenMenuGroup.open .items[data-v-d99bfeec]{visibility:visible}.VPNavScreenMenuGroup.open[data-v-d99bfeec]{padding-bottom:10px;height:auto}.VPNavScreenMenuGroup.open .button[data-v-d99bfeec]{padding-bottom:6px;color:var(--vp-c-brand-1)}.VPNavScreenMenuGroup.open .button-icon[data-v-d99bfeec]{transform:rotate(45deg)}.button[data-v-d99bfeec]{display:flex;justify-content:space-between;align-items:center;padding:12px 4px 11px 0;width:100%;line-height:24px;font-size:14px;font-weight:500;color:var(--vp-c-text-1);transition:color .25s}.button[data-v-d99bfeec]:hover{color:var(--vp-c-brand-1)}.button-icon[data-v-d99bfeec]{transition:transform .25s}.group[data-v-d99bfeec]:first-child{padding-top:0}.group+.group[data-v-d99bfeec],.group+.item[data-v-d99bfeec]{padding-top:4px}.VPNavScreenTranslations[data-v-516e4bc3]{height:24px;overflow:hidden}.VPNavScreenTranslations.open[data-v-516e4bc3]{height:auto}.title[data-v-516e4bc3]{display:flex;align-items:center;font-size:14px;font-weight:500;color:var(--vp-c-text-1)}.icon[data-v-516e4bc3]{font-size:16px}.icon.lang[data-v-516e4bc3]{margin-right:8px}.icon.chevron[data-v-516e4bc3]{margin-left:4px}.list[data-v-516e4bc3]{padding:4px 0 0 24px}.link[data-v-516e4bc3]{line-height:32px;font-size:13px;color:var(--vp-c-text-1)}.VPNavScreen[data-v-2dd6d0c7]{position:fixed;top:calc(var(--vp-nav-height) + var(--vp-layout-top-height, 0px));right:0;bottom:0;left:0;padding:0 32px;width:100%;background-color:var(--vp-nav-screen-bg-color);overflow-y:auto;transition:background-color .25s;pointer-events:auto}.VPNavScreen.fade-enter-active[data-v-2dd6d0c7],.VPNavScreen.fade-leave-active[data-v-2dd6d0c7]{transition:opacity .25s}.VPNavScreen.fade-enter-active .container[data-v-2dd6d0c7],.VPNavScreen.fade-leave-active .container[data-v-2dd6d0c7]{transition:transform .25s ease}.VPNavScreen.fade-enter-from[data-v-2dd6d0c7],.VPNavScreen.fade-leave-to[data-v-2dd6d0c7]{opacity:0}.VPNavScreen.fade-enter-from .container[data-v-2dd6d0c7],.VPNavScreen.fade-leave-to .container[data-v-2dd6d0c7]{transform:translateY(-8px)}@media (min-width: 768px){.VPNavScreen[data-v-2dd6d0c7]{display:none}}.container[data-v-2dd6d0c7]{margin:0 auto;padding:24px 0 96px;max-width:288px}.menu+.translations[data-v-2dd6d0c7],.menu+.appearance[data-v-2dd6d0c7],.translations+.appearance[data-v-2dd6d0c7]{margin-top:24px}.menu+.social-links[data-v-2dd6d0c7]{margin-top:16px}.appearance+.social-links[data-v-2dd6d0c7]{margin-top:16px}.VPNav[data-v-7ad780c2]{position:relative;top:var(--vp-layout-top-height, 0px);left:0;z-index:var(--vp-z-index-nav);width:100%;pointer-events:none;transition:background-color .5s}@media (min-width: 960px){.VPNav[data-v-7ad780c2]{position:fixed}}.VPSidebarItem.level-0[data-v-edd2eed8]{padding-bottom:24px}.VPSidebarItem.collapsed.level-0[data-v-edd2eed8]{padding-bottom:10px}.item[data-v-edd2eed8]{position:relative;display:flex;width:100%}.VPSidebarItem.collapsible>.item[data-v-edd2eed8]{cursor:pointer}.indicator[data-v-edd2eed8]{position:absolute;top:6px;bottom:6px;left:-17px;width:2px;border-radius:2px;transition:background-color .25s}.VPSidebarItem.level-2.is-active>.item>.indicator[data-v-edd2eed8],.VPSidebarItem.level-3.is-active>.item>.indicator[data-v-edd2eed8],.VPSidebarItem.level-4.is-active>.item>.indicator[data-v-edd2eed8],.VPSidebarItem.level-5.is-active>.item>.indicator[data-v-edd2eed8]{background-color:var(--vp-c-brand-1)}.link[data-v-edd2eed8]{display:flex;align-items:center;flex-grow:1}.text[data-v-edd2eed8]{flex-grow:1;padding:4px 0;line-height:24px;font-size:14px;transition:color .25s}.VPSidebarItem.level-0 .text[data-v-edd2eed8]{font-weight:700;color:var(--vp-c-text-1)}.VPSidebarItem.level-1 .text[data-v-edd2eed8],.VPSidebarItem.level-2 .text[data-v-edd2eed8],.VPSidebarItem.level-3 .text[data-v-edd2eed8],.VPSidebarItem.level-4 .text[data-v-edd2eed8],.VPSidebarItem.level-5 .text[data-v-edd2eed8]{font-weight:500;color:var(--vp-c-text-2)}.VPSidebarItem.level-0.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-1.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-2.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-3.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-4.is-link>.item>.link:hover .text[data-v-edd2eed8],.VPSidebarItem.level-5.is-link>.item>.link:hover .text[data-v-edd2eed8]{color:var(--vp-c-brand-1)}.VPSidebarItem.level-0.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-1.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-2.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-3.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-4.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-5.has-active>.item>.text[data-v-edd2eed8],.VPSidebarItem.level-0.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-1.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-2.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-3.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-4.has-active>.item>.link>.text[data-v-edd2eed8],.VPSidebarItem.level-5.has-active>.item>.link>.text[data-v-edd2eed8]{color:var(--vp-c-text-1)}.VPSidebarItem.level-0.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-1.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-2.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-3.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-4.is-active>.item .link>.text[data-v-edd2eed8],.VPSidebarItem.level-5.is-active>.item .link>.text[data-v-edd2eed8]{color:var(--vp-c-brand-1)}.caret[data-v-edd2eed8]{display:flex;justify-content:center;align-items:center;margin-right:-7px;width:32px;height:32px;color:var(--vp-c-text-3);cursor:pointer;transition:color .25s;flex-shrink:0}.item:hover .caret[data-v-edd2eed8]{color:var(--vp-c-text-2)}.item:hover .caret[data-v-edd2eed8]:hover{color:var(--vp-c-text-1)}.caret-icon[data-v-edd2eed8]{font-size:18px;transform:rotate(90deg);transition:transform .25s}.VPSidebarItem.collapsed .caret-icon[data-v-edd2eed8]{transform:rotate(0)}.VPSidebarItem.level-1 .items[data-v-edd2eed8],.VPSidebarItem.level-2 .items[data-v-edd2eed8],.VPSidebarItem.level-3 .items[data-v-edd2eed8],.VPSidebarItem.level-4 .items[data-v-edd2eed8],.VPSidebarItem.level-5 .items[data-v-edd2eed8]{border-left:1px solid var(--vp-c-divider);padding-left:16px}.VPSidebarItem.collapsed .items[data-v-edd2eed8]{display:none}.no-transition[data-v-51288d80] .caret-icon{transition:none}.group+.group[data-v-51288d80]{border-top:1px solid var(--vp-c-divider);padding-top:10px}@media (min-width: 960px){.group[data-v-51288d80]{padding-top:10px;width:calc(var(--vp-sidebar-width) - 64px)}}.VPSidebar[data-v-42c4c606]{position:fixed;top:var(--vp-layout-top-height, 0px);bottom:0;left:0;z-index:var(--vp-z-index-sidebar);padding:32px 32px 96px;width:calc(100vw - 64px);max-width:320px;background-color:var(--vp-sidebar-bg-color);opacity:0;box-shadow:var(--vp-c-shadow-3);overflow-x:hidden;overflow-y:auto;transform:translate(-100%);transition:opacity .5s,transform .25s ease;overscroll-behavior:contain}.VPSidebar.open[data-v-42c4c606]{opacity:1;visibility:visible;transform:translate(0);transition:opacity .25s,transform .5s cubic-bezier(.19,1,.22,1)}.dark .VPSidebar[data-v-42c4c606]{box-shadow:var(--vp-shadow-1)}@media (min-width: 960px){.VPSidebar[data-v-42c4c606]{padding-top:var(--vp-nav-height);width:var(--vp-sidebar-width);max-width:100%;background-color:var(--vp-sidebar-bg-color);opacity:1;visibility:visible;box-shadow:none;transform:translate(0)}}@media (min-width: 1440px){.VPSidebar[data-v-42c4c606]{padding-left:max(32px,calc((100% - (var(--vp-layout-max-width) - 64px)) / 2));width:calc((100% - (var(--vp-layout-max-width) - 64px)) / 2 + var(--vp-sidebar-width) - 32px)}}@media (min-width: 960px){.curtain[data-v-42c4c606]{position:sticky;top:-64px;left:0;z-index:1;margin-top:calc(var(--vp-nav-height) * -1);margin-right:-32px;margin-left:-32px;height:var(--vp-nav-height);background-color:var(--vp-sidebar-bg-color)}}.nav[data-v-42c4c606]{outline:0}.VPSkipLink[data-v-c8291ffa]{top:8px;left:8px;padding:8px 16px;z-index:999;border-radius:8px;font-size:12px;font-weight:700;text-decoration:none;color:var(--vp-c-brand-1);box-shadow:var(--vp-shadow-3);background-color:var(--vp-c-bg)}.VPSkipLink[data-v-c8291ffa]:focus{height:auto;width:auto;clip:auto;clip-path:none}@media (min-width: 1280px){.VPSkipLink[data-v-c8291ffa]{top:14px;left:16px}}.Layout[data-v-d8b57b2d]{display:flex;flex-direction:column;min-height:100vh}.VPHomeSponsors[data-v-3dc26e1d]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPHomeSponsors[data-v-3dc26e1d]{margin:96px 0}@media (min-width: 768px){.VPHomeSponsors[data-v-3dc26e1d]{margin:128px 0}}.VPHomeSponsors[data-v-3dc26e1d]{padding:0 24px}@media (min-width: 768px){.VPHomeSponsors[data-v-3dc26e1d]{padding:0 48px}}@media (min-width: 960px){.VPHomeSponsors[data-v-3dc26e1d]{padding:0 64px}}.container[data-v-3dc26e1d]{margin:0 auto;max-width:1152px}.love[data-v-3dc26e1d]{margin:0 auto;width:fit-content;font-size:28px;color:var(--vp-c-text-3)}.icon[data-v-3dc26e1d]{display:inline-block}.message[data-v-3dc26e1d]{margin:0 auto;padding-top:10px;max-width:320px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.sponsors[data-v-3dc26e1d]{padding-top:32px}.action[data-v-3dc26e1d]{padding-top:40px;text-align:center}.VPTeamPage[data-v-a5329171]{margin:96px 0}@media (min-width: 768px){.VPTeamPage[data-v-a5329171]{margin:128px 0}}.VPHome .VPTeamPageTitle[data-v-a5329171-s]{border-top:1px solid var(--vp-c-gutter);padding-top:88px!important}.VPTeamPageSection+.VPTeamPageSection[data-v-a5329171-s],.VPTeamMembers+.VPTeamPageSection[data-v-a5329171-s]{margin-top:64px}.VPTeamMembers+.VPTeamMembers[data-v-a5329171-s]{margin-top:24px}@media (min-width: 768px){.VPTeamPageTitle+.VPTeamPageSection[data-v-a5329171-s]{margin-top:16px}.VPTeamPageSection+.VPTeamPageSection[data-v-a5329171-s],.VPTeamMembers+.VPTeamPageSection[data-v-a5329171-s]{margin-top:96px}}.VPTeamMembers[data-v-a5329171-s]{padding:0 24px}@media (min-width: 768px){.VPTeamMembers[data-v-a5329171-s]{padding:0 48px}}@media (min-width: 960px){.VPTeamMembers[data-v-a5329171-s]{padding:0 64px}}.VPTeamPageTitle[data-v-46c5e327]{padding:48px 32px;text-align:center}@media (min-width: 768px){.VPTeamPageTitle[data-v-46c5e327]{padding:64px 48px 48px}}@media (min-width: 960px){.VPTeamPageTitle[data-v-46c5e327]{padding:80px 64px 48px}}.title[data-v-46c5e327]{letter-spacing:0;line-height:44px;font-size:36px;font-weight:500}@media (min-width: 768px){.title[data-v-46c5e327]{letter-spacing:-.5px;line-height:56px;font-size:48px}}.lead[data-v-46c5e327]{margin:0 auto;max-width:512px;padding-top:12px;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}@media (min-width: 768px){.lead[data-v-46c5e327]{max-width:592px;letter-spacing:.15px;line-height:28px;font-size:20px}}.VPTeamPageSection[data-v-3bf2e850]{padding:0 32px}@media (min-width: 768px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 48px}}@media (min-width: 960px){.VPTeamPageSection[data-v-3bf2e850]{padding:0 64px}}.title[data-v-3bf2e850]{position:relative;margin:0 auto;max-width:1152px;text-align:center;color:var(--vp-c-text-2)}.title-line[data-v-3bf2e850]{position:absolute;top:16px;left:0;width:100%;height:1px;background-color:var(--vp-c-divider)}.title-text[data-v-3bf2e850]{position:relative;display:inline-block;padding:0 24px;letter-spacing:0;line-height:32px;font-size:20px;font-weight:500;background-color:var(--vp-c-bg)}.lead[data-v-3bf2e850]{margin:0 auto;max-width:480px;padding-top:12px;text-align:center;line-height:24px;font-size:16px;font-weight:500;color:var(--vp-c-text-2)}.members[data-v-3bf2e850]{padding-top:40px}.VPTeamMembersItem[data-v-acff304e]{display:flex;flex-direction:column;gap:2px;border-radius:12px;width:100%;height:100%;overflow:hidden}.VPTeamMembersItem.small .profile[data-v-acff304e]{padding:32px}.VPTeamMembersItem.small .data[data-v-acff304e]{padding-top:20px}.VPTeamMembersItem.small .avatar[data-v-acff304e]{width:64px;height:64px}.VPTeamMembersItem.small .name[data-v-acff304e]{line-height:24px;font-size:16px}.VPTeamMembersItem.small .affiliation[data-v-acff304e]{padding-top:4px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .desc[data-v-acff304e]{padding-top:12px;line-height:20px;font-size:14px}.VPTeamMembersItem.small .links[data-v-acff304e]{margin:0 -16px -20px;padding:10px 0 0}.VPTeamMembersItem.medium .profile[data-v-acff304e]{padding:48px 32px}.VPTeamMembersItem.medium .data[data-v-acff304e]{padding-top:24px;text-align:center}.VPTeamMembersItem.medium .avatar[data-v-acff304e]{width:96px;height:96px}.VPTeamMembersItem.medium .name[data-v-acff304e]{letter-spacing:.15px;line-height:28px;font-size:20px}.VPTeamMembersItem.medium .affiliation[data-v-acff304e]{padding-top:4px;font-size:16px}.VPTeamMembersItem.medium .desc[data-v-acff304e]{padding-top:16px;max-width:288px;font-size:16px}.VPTeamMembersItem.medium .links[data-v-acff304e]{margin:0 -16px -12px;padding:16px 12px 0}.profile[data-v-acff304e]{flex-grow:1;background-color:var(--vp-c-bg-soft)}.data[data-v-acff304e]{text-align:center}.avatar[data-v-acff304e]{position:relative;flex-shrink:0;margin:0 auto;border-radius:50%;box-shadow:var(--vp-shadow-3)}.avatar-img[data-v-acff304e]{position:absolute;top:0;right:0;bottom:0;left:0;border-radius:50%;object-fit:cover}.name[data-v-acff304e]{margin:0;font-weight:600}.affiliation[data-v-acff304e]{margin:0;font-weight:500;color:var(--vp-c-text-2)}.org.link[data-v-acff304e]{color:var(--vp-c-text-2);transition:color .25s}.org.link[data-v-acff304e]:hover{color:var(--vp-c-brand-1)}.desc[data-v-acff304e]{margin:0 auto}.desc[data-v-acff304e] a{font-weight:500;color:var(--vp-c-brand-1);text-decoration-style:dotted;transition:color .25s}.links[data-v-acff304e]{display:flex;justify-content:center;height:56px}.sp-link[data-v-acff304e]{display:flex;justify-content:center;align-items:center;text-align:center;padding:16px;font-size:14px;font-weight:500;color:var(--vp-c-sponsor);background-color:var(--vp-c-bg-soft);transition:color .25s,background-color .25s}.sp .sp-link.link[data-v-acff304e]:hover,.sp .sp-link.link[data-v-acff304e]:focus{outline:none;color:var(--vp-c-white);background-color:var(--vp-c-sponsor)}.sp-icon[data-v-acff304e]{margin-right:8px;font-size:16px}.VPTeamMembers.small .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(224px,1fr))}.VPTeamMembers.small.count-1 .container[data-v-bf782009]{max-width:276px}.VPTeamMembers.small.count-2 .container[data-v-bf782009]{max-width:576px}.VPTeamMembers.small.count-3 .container[data-v-bf782009]{max-width:876px}.VPTeamMembers.medium .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(256px,1fr))}@media (min-width: 375px){.VPTeamMembers.medium .container[data-v-bf782009]{grid-template-columns:repeat(auto-fit,minmax(288px,1fr))}}.VPTeamMembers.medium.count-1 .container[data-v-bf782009]{max-width:368px}.VPTeamMembers.medium.count-2 .container[data-v-bf782009]{max-width:760px}.container[data-v-bf782009]{display:grid;gap:24px;margin:0 auto;max-width:1152px}:root{--vp-c-brand-1: #b744b8;--vp-c-brand-2: #a379c9;--vp-c-brand-3: #a379c9}.VPLocalSearchBox[data-v-40ea83c9]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-40ea83c9]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-40ea83c9]{position:relative;padding:12px;margin:64px auto;display:flex;flex-direction:column;gap:16px;background:var(--vp-local-search-bg);width:min(100vw - 60px,900px);height:min-content;max-height:min(100vh - 128px,900px);border-radius:6px}@media (max-width: 767px){.shell[data-v-40ea83c9]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-40ea83c9]{border:1px solid var(--vp-c-divider);border-radius:4px;display:flex;align-items:center;padding:0 12px;cursor:text}@media (max-width: 767px){.search-bar[data-v-40ea83c9]{padding:0 8px}}.search-bar[data-v-40ea83c9]:focus-within{border-color:var(--vp-c-brand-1)}.local-search-icon[data-v-40ea83c9]{display:block;font-size:18px}.navigate-icon[data-v-40ea83c9]{display:block;font-size:14px}.search-icon[data-v-40ea83c9]{margin:8px}@media (max-width: 767px){.search-icon[data-v-40ea83c9]{display:none}}.search-input[data-v-40ea83c9]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-40ea83c9]{padding:6px 4px}}.search-actions[data-v-40ea83c9]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-40ea83c9]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-40ea83c9]{display:none}}.search-actions button[data-v-40ea83c9]{padding:8px}.search-actions button[data-v-40ea83c9]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-40ea83c9]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-40ea83c9]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-40ea83c9]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-40ea83c9]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-40ea83c9]{display:none}}.search-keyboard-shortcuts kbd[data-v-40ea83c9]{background:#8080801a;border-radius:4px;padding:3px 6px;min-width:24px;display:inline-block;text-align:center;vertical-align:middle;border:1px solid rgba(128,128,128,.15);box-shadow:0 2px 2px #0000001a}.results[data-v-40ea83c9]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-40ea83c9]{display:flex;align-items:center;gap:8px;border-radius:4px;transition:none;line-height:1rem;border:solid 2px var(--vp-local-search-result-border);outline:none}.result>div[data-v-40ea83c9]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-40ea83c9]{margin:8px}}.titles[data-v-40ea83c9]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-40ea83c9]{display:flex;align-items:center;gap:4px}.title.main[data-v-40ea83c9]{font-weight:500}.title-icon[data-v-40ea83c9]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-40ea83c9]{opacity:.5}.result.selected[data-v-40ea83c9]{--vp-local-search-result-bg: var(--vp-local-search-result-selected-bg);border-color:var(--vp-local-search-result-selected-border)}.excerpt-wrapper[data-v-40ea83c9]{position:relative}.excerpt[data-v-40ea83c9]{opacity:50%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;margin-top:4px}.result.selected .excerpt[data-v-40ea83c9]{opacity:1}.excerpt[data-v-40ea83c9] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-40ea83c9] mark,.excerpt[data-v-40ea83c9] mark{background-color:var(--vp-local-search-highlight-bg);color:var(--vp-local-search-highlight-text);border-radius:2px;padding:0 2px}.excerpt[data-v-40ea83c9] .vp-code-group .tabs{display:none}.excerpt[data-v-40ea83c9] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-40ea83c9]{position:absolute;bottom:-1px;left:0;width:100%;height:8px;background:linear-gradient(transparent,var(--vp-local-search-result-bg));z-index:1000}.excerpt-gradient-top[data-v-40ea83c9]{position:absolute;top:-1px;left:0;width:100%;height:8px;background:linear-gradient(var(--vp-local-search-result-bg),transparent);z-index:1000}.result.selected .titles[data-v-40ea83c9],.result.selected .title-icon[data-v-40ea83c9]{color:var(--vp-c-brand-1)!important}.no-results[data-v-40ea83c9]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-40ea83c9]{flex:none} diff --git a/assets/zh-hans_contribute_core.md.oF4_zk5Q.js b/assets/zh-hans_contribute_core.md.oF4_zk5Q.js new file mode 100644 index 00000000..0406bafa --- /dev/null +++ b/assets/zh-hans_contribute_core.md.oF4_zk5Q.js @@ -0,0 +1,25 @@ +import{_ as a,c as e,a2 as i,o as t}from"./chunks/framework.C9NVOr0y.js";const k=JSON.parse('{"title":"asdf","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/contribute/core.md","filePath":"zh-hans/contribute/core.md","lastUpdated":1687069487000}'),n={name:"zh-hans/contribute/core.md"};function l(p,s,h,o,r,d){return t(),e("div",null,s[0]||(s[0]=[i(`asdf
核心贡献指南.
在 Github 上 fork asdf
并且/或者使用 Git 克隆默认分支:
# 克隆你 fork 的 asdf
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# 或者直接克隆 asdf
+git clone https://github.com/asdf-vm/asdf.git
核心开发所需的工具都列举在这个存储库的 .tool-versions
文件中。如果你想要使用 asdf
自身来管理它,请使用以下命令添加这些插件:
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git
使用以下命令安装这些版本来开发 asdf
:
asdf install
在本地机器的开发过程中不使用 asdf
来管理工具 或许 对你有帮助,因为你可能需要打破某些可能会影响到你的开发工具链的功能。以下是所需工具的原始列表:
如果你想要在不更改已安装的 asdf
的情况下尝试应用你的更改,可以将 $ASDF_DIR
变量设置为克隆存储库的路径,并临时将目录的 bin
和 shims
目录添加到你的路径中。
最好在提交或推送到远程之前,在本地做好格式化、lint 检查和测试你的代码。可以使用以下脚本/命令:
# 脚本检查
+./scripts/shellcheck.bash
+
+# 格式化
+./scripts/shfmt.bash
+
+# 测试:所有案例
+bats test/
+# 测试:特定命令
+bats test/list_commands.bash
提示
增加测试! - 新特性需要进行测试,并加快错误修复的审查速度。请在创建拉取请求之前覆盖新的代码路径。查看 bats-core 文档 了解更多。
强烈建议在编写测试之前检查现有的测试套件和 bats-core 文档。
Bats 调试有时可能很困难。使用带有 -t
标识的 TAP 输出将使你能够在测试执行期间打印带有特殊文件描述符 >&3
的输出,从而简化调试。例如:
# test/some_tests.bats
+
+printf "%s\\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\\n" "Will be printed during bats -t test/some_tests.bats" >&3
进一步相关文档请查看 bats-core 的 Printing to the Terminal 部分.
asdf
正在使用一个名为 Release Please 的自动发布工具来自动碰撞 SemVer 版本并生成 变更日志。这个信息是通过读取自上次发布以来的提交历史记录来确定的。
约定式提交 定义了拉取请求标题的格式,该标题成为默认分支上的提交消息格式。这是通过 Github Action amannn/action-semantic-pull-request
强制执行的。
约定式提交遵循以下格式:
<type>[optional scope][optional !]: <description>
+
+<!-- 例子 -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change
<types>
的所有类型包含: feat
、fix
、docs
、style
、refactor
、perf
、test
、build
、ci
、chore
、revert
。
!
:表示重大更改fix
:将会创建一个新的 SemVer patch
补丁feat
:将会创建一个新的 SemVer minor
小版本<type>!
:将会创建一个新的 SemVer major
大版本拉取请求标题必须遵循这种格式。
提示
请使用约定式提交信息格式作为拉取请求标题。
asdf-alpine 和 asdf-ubuntu 项目正在努力提供一些 asdf 工具的容器化镜像。你可以使用这些容器镜像作为开发服务器的基础镜像,或者运行生产应用。
`,32)]))}const g=a(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/zh-hans_contribute_core.md.oF4_zk5Q.lean.js b/assets/zh-hans_contribute_core.md.oF4_zk5Q.lean.js new file mode 100644 index 00000000..0406bafa --- /dev/null +++ b/assets/zh-hans_contribute_core.md.oF4_zk5Q.lean.js @@ -0,0 +1,25 @@ +import{_ as a,c as e,a2 as i,o as t}from"./chunks/framework.C9NVOr0y.js";const k=JSON.parse('{"title":"asdf","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/contribute/core.md","filePath":"zh-hans/contribute/core.md","lastUpdated":1687069487000}'),n={name:"zh-hans/contribute/core.md"};function l(p,s,h,o,r,d){return t(),e("div",null,s[0]||(s[0]=[i(`asdf
核心贡献指南.
在 Github 上 fork asdf
并且/或者使用 Git 克隆默认分支:
# 克隆你 fork 的 asdf
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# 或者直接克隆 asdf
+git clone https://github.com/asdf-vm/asdf.git
核心开发所需的工具都列举在这个存储库的 .tool-versions
文件中。如果你想要使用 asdf
自身来管理它,请使用以下命令添加这些插件:
asdf plugin add bats https://github.com/timgluz/asdf-bats.git
+asdf plugin add shellcheck https://github.com/luizm/asdf-shellcheck.git
+asdf plugin add shfmt https://github.com/luizm/asdf-shfmt.git
使用以下命令安装这些版本来开发 asdf
:
asdf install
在本地机器的开发过程中不使用 asdf
来管理工具 或许 对你有帮助,因为你可能需要打破某些可能会影响到你的开发工具链的功能。以下是所需工具的原始列表:
如果你想要在不更改已安装的 asdf
的情况下尝试应用你的更改,可以将 $ASDF_DIR
变量设置为克隆存储库的路径,并临时将目录的 bin
和 shims
目录添加到你的路径中。
最好在提交或推送到远程之前,在本地做好格式化、lint 检查和测试你的代码。可以使用以下脚本/命令:
# 脚本检查
+./scripts/shellcheck.bash
+
+# 格式化
+./scripts/shfmt.bash
+
+# 测试:所有案例
+bats test/
+# 测试:特定命令
+bats test/list_commands.bash
提示
增加测试! - 新特性需要进行测试,并加快错误修复的审查速度。请在创建拉取请求之前覆盖新的代码路径。查看 bats-core 文档 了解更多。
强烈建议在编写测试之前检查现有的测试套件和 bats-core 文档。
Bats 调试有时可能很困难。使用带有 -t
标识的 TAP 输出将使你能够在测试执行期间打印带有特殊文件描述符 >&3
的输出,从而简化调试。例如:
# test/some_tests.bats
+
+printf "%s\\n" "Will not be printed during bats test/some_tests.bats"
+printf "%s\\n" "Will be printed during bats -t test/some_tests.bats" >&3
进一步相关文档请查看 bats-core 的 Printing to the Terminal 部分.
asdf
正在使用一个名为 Release Please 的自动发布工具来自动碰撞 SemVer 版本并生成 变更日志。这个信息是通过读取自上次发布以来的提交历史记录来确定的。
约定式提交 定义了拉取请求标题的格式,该标题成为默认分支上的提交消息格式。这是通过 Github Action amannn/action-semantic-pull-request
强制执行的。
约定式提交遵循以下格式:
<type>[optional scope][optional !]: <description>
+
+<!-- 例子 -->
+fix: some fix
+feat: a new feature
+docs: some documentation update
+docs(website): some change for the website
+feat!: feature with breaking change
<types>
的所有类型包含: feat
、fix
、docs
、style
、refactor
、perf
、test
、build
、ci
、chore
、revert
。
!
:表示重大更改fix
:将会创建一个新的 SemVer patch
补丁feat
:将会创建一个新的 SemVer minor
小版本<type>!
:将会创建一个新的 SemVer major
大版本拉取请求标题必须遵循这种格式。
提示
请使用约定式提交信息格式作为拉取请求标题。
asdf-alpine 和 asdf-ubuntu 项目正在努力提供一些 asdf 工具的容器化镜像。你可以使用这些容器镜像作为开发服务器的基础镜像,或者运行生产应用。
`,32)]))}const g=a(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/zh-hans_contribute_documentation.md.DL3_2XKG.js b/assets/zh-hans_contribute_documentation.md.DL3_2XKG.js new file mode 100644 index 00000000..7b6bdb3d --- /dev/null +++ b/assets/zh-hans_contribute_documentation.md.DL3_2XKG.js @@ -0,0 +1,29 @@ +import{_ as a,c as i,a2 as e,o as n}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"文档 & 网站","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/contribute/documentation.md","filePath":"zh-hans/contribute/documentation.md","lastUpdated":1687069487000}'),t={name:"zh-hans/contribute/documentation.md"};function l(p,s,h,k,d,r){return n(),i("div",null,s[0]||(s[0]=[e(`文档 & 网站贡献指南。
在 Github 上 fork asdf
并且/或者使用 Git 克隆默认分支:
# 克隆你 fork 的 asdf
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# 或者直接克隆 asdf
+git clone https://github.com/asdf-vm/asdf.git
文档网站开发所需的工具都在文件 docs/.tool-versions
中使用 asdf
进行管理。使用以下命令添加插件:
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs
使用以下命令安装工具版本:
asdf install
根据 docs/package.json
文件安装 Node.js 依赖:
npm install
Vuepress (v2) 是我们用来构建 asdf 文档网站的静态站点生成器(SSG)。它被选中来取代 Docsify.js,因为我们希望在用户没有可用或未启用 JavaScript 时支持仅依靠 HTML。Docsify 无法做到这一点。除此之外,两者特性集合大致相同,重点是 Vuepress 可以用最少的配置编写 Markdown 文件。
package.json
包含了开发所需的脚本:
启动本地开发服务器:
npm run dev
在提交之前格式化代码:
npm run format
asdf
正在使用依赖 PR 标题中的约定式提交的自动化发布流水线。具体的文档可以查看 核心贡献指南.
当为文档更改创建 PR 请求时,请确保 PR 标题使用了约定式提交类型 docs
以及 docs: <description>
的格式。
网站的配置包含在几个 JavaScript 文件中,其中 JS 对象用于表示配置。它们是:
docs/.vuepress/config.js
:网站的根配置文件。请查看 Vuepress 文档 了解更多详情。为了简化根配置文件,更大的 JS 对象表示 导航栏和侧边栏 配置已经被提取并按照语言类型分隔开来。请参考以下文件:
docs/.vuepress/navbar.js
docs/.vuepress/sidebar.js
这些配置的官方文档位于 默认主题参考。
Vuepress 有一流的国际化支持。根配置文件 docs/.vuepress/config.js
定义了支持的语言类型及其 URL、在选择下拉菜单中的标题以及导航栏/侧边栏配置引用。
导航栏/侧边栏配置在上述配置文件中捕获,按语言类型分隔开并单独导出。
每种语言的 markdown 内容必须位于与根配置文件中 locale
键同名的目录位置。也就是:
{
+ ...
+ themeConfig: {
+ locales: {
+ "/": {
+ selectLanguageName: "English (US)",
+ sidebar: sidebar.en,
+ navbar: navbar.en
+ },
+ "/pt-BR/": {
+ selectLanguageName: "Brazilian Portuguese",
+ sidebar: sidebar.pt_br,
+ navbar: navbar.pt_br
+ }
+ }
+ }
+}
/pt-BR/
将要求 markdown 文件的同一集合位于 docs/pt-BR/
目录下,如下所示:
docs
+├─ README.md
+├─ foo.md
+├─ nested
+│ └─ README.md
+└─ pt-BR
+ ├─ README.md
+ ├─ foo.md
+ └─ nested
+ └─ README.md
请查看 Vuepress i18n 国际化官方文档 了解更多详情。
`,37)]))}const g=a(t,[["render",l]]);export{c as __pageData,g as default}; diff --git a/assets/zh-hans_contribute_documentation.md.DL3_2XKG.lean.js b/assets/zh-hans_contribute_documentation.md.DL3_2XKG.lean.js new file mode 100644 index 00000000..7b6bdb3d --- /dev/null +++ b/assets/zh-hans_contribute_documentation.md.DL3_2XKG.lean.js @@ -0,0 +1,29 @@ +import{_ as a,c as i,a2 as e,o as n}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"文档 & 网站","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/contribute/documentation.md","filePath":"zh-hans/contribute/documentation.md","lastUpdated":1687069487000}'),t={name:"zh-hans/contribute/documentation.md"};function l(p,s,h,k,d,r){return n(),i("div",null,s[0]||(s[0]=[e(`文档 & 网站贡献指南。
在 Github 上 fork asdf
并且/或者使用 Git 克隆默认分支:
# 克隆你 fork 的 asdf
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# 或者直接克隆 asdf
+git clone https://github.com/asdf-vm/asdf.git
文档网站开发所需的工具都在文件 docs/.tool-versions
中使用 asdf
进行管理。使用以下命令添加插件:
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs
使用以下命令安装工具版本:
asdf install
根据 docs/package.json
文件安装 Node.js 依赖:
npm install
Vuepress (v2) 是我们用来构建 asdf 文档网站的静态站点生成器(SSG)。它被选中来取代 Docsify.js,因为我们希望在用户没有可用或未启用 JavaScript 时支持仅依靠 HTML。Docsify 无法做到这一点。除此之外,两者特性集合大致相同,重点是 Vuepress 可以用最少的配置编写 Markdown 文件。
package.json
包含了开发所需的脚本:
启动本地开发服务器:
npm run dev
在提交之前格式化代码:
npm run format
asdf
正在使用依赖 PR 标题中的约定式提交的自动化发布流水线。具体的文档可以查看 核心贡献指南.
当为文档更改创建 PR 请求时,请确保 PR 标题使用了约定式提交类型 docs
以及 docs: <description>
的格式。
网站的配置包含在几个 JavaScript 文件中,其中 JS 对象用于表示配置。它们是:
docs/.vuepress/config.js
:网站的根配置文件。请查看 Vuepress 文档 了解更多详情。为了简化根配置文件,更大的 JS 对象表示 导航栏和侧边栏 配置已经被提取并按照语言类型分隔开来。请参考以下文件:
docs/.vuepress/navbar.js
docs/.vuepress/sidebar.js
这些配置的官方文档位于 默认主题参考。
Vuepress 有一流的国际化支持。根配置文件 docs/.vuepress/config.js
定义了支持的语言类型及其 URL、在选择下拉菜单中的标题以及导航栏/侧边栏配置引用。
导航栏/侧边栏配置在上述配置文件中捕获,按语言类型分隔开并单独导出。
每种语言的 markdown 内容必须位于与根配置文件中 locale
键同名的目录位置。也就是:
{
+ ...
+ themeConfig: {
+ locales: {
+ "/": {
+ selectLanguageName: "English (US)",
+ sidebar: sidebar.en,
+ navbar: navbar.en
+ },
+ "/pt-BR/": {
+ selectLanguageName: "Brazilian Portuguese",
+ sidebar: sidebar.pt_br,
+ navbar: navbar.pt_br
+ }
+ }
+ }
+}
/pt-BR/
将要求 markdown 文件的同一集合位于 docs/pt-BR/
目录下,如下所示:
docs
+├─ README.md
+├─ foo.md
+├─ nested
+│ └─ README.md
+└─ pt-BR
+ ├─ README.md
+ ├─ foo.md
+ └─ nested
+ └─ README.md
请查看 Vuepress i18n 国际化官方文档 了解更多详情。
`,37)]))}const g=a(t,[["render",l]]);export{c as __pageData,g as default}; diff --git a/assets/zh-hans_contribute_first-party-plugins.md.CaobaPwV.js b/assets/zh-hans_contribute_first-party-plugins.md.CaobaPwV.js new file mode 100644 index 00000000..c8ba361f --- /dev/null +++ b/assets/zh-hans_contribute_first-party-plugins.md.CaobaPwV.js @@ -0,0 +1 @@ +import{_ as a,c as r,a2 as t,o as s}from"./chunks/framework.C9NVOr0y.js";const p=JSON.parse('{"title":"官方插件","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/contribute/first-party-plugins.md","filePath":"zh-hans/contribute/first-party-plugins.md","lastUpdated":1643288544000}'),i={name:"zh-hans/contribute/first-party-plugins.md"};function l(o,e,n,d,f,c){return s(),r("div",null,e[0]||(e[0]=[t('asdf 核心团队已经开发了一些与他们日常工作相关的插件。随时欢迎大家维护和改进这些插件。这些插件所对应的存储库链接如下所示:
对于社区插件,请参考:
asdf-community
组织:一个用于长期维护 asdf
插件的协作、社区驱动的项目。asdf-plugins
缩写存储库:asdf
核心用于查找流行的 asdf
插件的缩写列表。asdf-plugin
主题搜索asdf 核心团队已经开发了一些与他们日常工作相关的插件。随时欢迎大家维护和改进这些插件。这些插件所对应的存储库链接如下所示:
对于社区插件,请参考:
asdf-community
组织:一个用于长期维护 asdf
插件的协作、社区驱动的项目。asdf-plugins
缩写存储库:asdf
核心用于查找流行的 asdf
插件的缩写列表。asdf-plugin
主题搜索asdf
安装过程包括:
asdf
核心asdf
.tool-versions
配置文件设置全局和项目版本asdf primarily requires git
& curl
. Here is a non-exhaustive list of commands to run for your package manager (some might automatically install these tools in later steps).
OS | Package Manager | Command |
---|---|---|
linux | Aptitude | apt install curl git |
linux | DNF | dnf install curl git |
linux | Pacman | pacman -S curl git |
linux | Zypper | zypper install curl git |
macOS | Homebrew | brew install coreutils curl git |
macOS | Spack | spack install coreutils curl git |
Note
sudo
may be required depending on your system configuration.
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1
We highly recommend using the official git
method.
Method | Command |
---|---|
Homebrew | brew install asdf |
Pacman | git clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper |
根据 Shell 脚本、操作系统和安装方法的组合不同,相应的配置也会不同。展开以下与你的系统最匹配的选项:
在 ~/.bashrc
文件中加入以下内容:
. "$HOME/.asdf/asdf.sh"
补全功能必须在 .bashrc
文件中加入以下内容来配置完成:
. "$HOME/.asdf/completions/asdf.bash"
如果你正在使用 macOS Catalina 或者更新的版本, 默认的 shell 已经被修改为 ZSH。除非修改回 Bash, 否则请遵循 ZSH 的说明。
在 ~/.bash_profile
文件中加入以下内容:
. "$HOME/.asdf/asdf.sh"
补全功能必须在 .bash_profile
文件中使用以下内容手动配置完成:
. "$HOME/.asdf/completions/asdf.bash"
使用以下命令将 asdf.sh
加入到 ~/.bashrc
文件中:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bashrc
补全功能将需要 按照 Homebrew 的说明完成配置 或者执行以下命令:
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
如果你正在使用 macOS Catalina 或者更新的版本, 默认的 shell 已经被修改为 ZSH。除非修改回 Bash, 否则请遵循 ZSH 的说明。
使用以下命令将 asdf.sh
加入到 ~/.bash_profile
文件中:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bash_profile
补全功能将需要 按照 Homebrew 的说明完成配置 或者执行以下命令:
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
在 ~/.config/fish/config.fish
文件中加入以下内容:
source ~/.asdf/asdf.fish
补全功能必须按照以下命令手动配置完成:
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
使用以下命令将 asdf.fish
加入到 ~/.config/fish/config.fish
文件中:
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish
Fish shell 的补全功能可以交给 Homebrew 处理. 很友好!
在 ~/.config/fish/config.fish
文件中加入以下内容:
source /opt/asdf-vm/asdf.fish
补全功能将会在安装过程中由 AUR 包管理器自动配置完成。
使用以下命令将 asdf.elv
加入到 ~/.config/elvish/rc.elv
文件中:
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
补全功能将会自动配置。
使用以下命令将 asdf.elv
加入到 ~/.config/elvish/rc.elv
文件中:
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
补全功能将会自动配置。
使用以下命令将 asdf.elv
加入到 ~/.config/elvish/rc.elv
文件中:
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
补全功能将会自动配置。
在 ~/.zshrc
文件中加入以下内容:
. "$HOME/.asdf/asdf.sh"
或者 使用 ZSH 框架插件,比如 asdf for oh-my-zsh 将会使脚本生效并安装补全功能。
补全功能会被 ZSH 框架 asdf
插件或者通过在 .zshrc
文件中加入以下内容自动配置:
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
compinit
配置,请确保 compinit
在 asdf.sh
生效位置的下方compinit
配置和 ZSH 框架,请确保 compinit
在框架生效位置的下方警告
如果你正在使用 ZSH 框架,有关的 asdf
插件或许需要更新才能通过 fpath
正确地使用最新的 ZSH 补全功能。Oh-My-ZSH asdf 插件还在更新中,请查看 ohmyzsh/ohmyzsh#8837 了解更多。
使用以下命令将 asdf.sh
加入到 ~/.zshrc
文件中:
echo -e "\\n. $(brew --prefix asdf)/libexec/asdf.sh" >> \${ZDOTDIR:-~}/.zshrc
或者 使用 ZSH 框架插件,比如 asdf for oh-my-zsh 将会使脚本生效并安装补全功能。
补全功能可以被 ZSH 框架 asdf
或者 按照 Homebrew 的指引 完成配置。如果你正在使用 ZSH 框架,有关的 asdf
插件或许需要更新才能通过 fpath
正确地使用最新的 ZSH 补全功能。Oh-My-ZSH asdf 插件还在更新中,请查看 ohmyzsh/ohmyzsh#8837 了解更多。
在 ~/.zshrc
文件中加入以下内容:
. /opt/asdf-vm/asdf.sh
补全功能会被放在一个对 ZSH 很友好的位置,但是 ZSH 必须使用自动补全完成配置。
在 ~/.config/powershell/profile.ps1
文件中加入以下内容:
. "$HOME/.asdf/asdf.ps1"
使用以下命令将 asdf.ps1
加入到 ~/.config/powershell/profile.ps1
文件中:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
在 ~/.config/powershell/profile.ps1
文件中加入以下内容:
. /opt/asdf-vm/asdf.ps1
使用以下命令将 asdf.nu
加入到 ~/.config/nushell/config.nu
文件中:
"\\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path
补全功能将会自动配置。
使用以下命令将 asdf.nu
加入到 ~/.config/nushell/config.nu
文件中:
"\\n$env.ASDF_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\\n source " + (brew --prefix asdf | str trim | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path
补全功能将会自动配置。
使用以下命令将 asdf.nu
加入到 ~/.config/nushell/config.nu
文件中:
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path
补全功能将会自动配置。
在 ~/.profile
文件中加入以下内容:
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
使用以下命令将 asdf.sh
加入到 ~/.profile
文件中:
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
在 ~/.profile
文件中加入以下内容:
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh
asdf
脚本需要在设置好的 $PATH
之后和已经生效的框架(比如 oh-my-zsh 等等)之后的位置生效。
通常打开一个新的终端标签页来重启你的 shell 让 PATH
更改即时生效。
这样就完成了 asdf
核心的安装 🎉
asdf
仅在你安装插件、工具和管理它们的版本时才开始真正发挥作用。请继续阅读下面的指南来了解这些是如何做到的。
出于演示目的,我们将通过 asdf-nodejs
插件来安装和设置 Node.js。
每个插件都有依赖,所以我们需要确认应该列举了这些依赖的插件源码。对于 asdf-nodejs
来说,它们是:
操作系统 | 安装依赖 |
---|---|
Linux (Debian) | apt-get install dirmngr gpg curl gawk |
macOS | brew install gpg gawk |
我们应该提前安装这些依赖,因为有些插件有 post-install 钩子。
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
现在我们已经有了 Node.js 插件,所以我们可以开始安装某个版本了。
我们通过 asdf list all nodejs
可以看到所有可用的版本或者通过 asdf list all nodejs 14
查看版本子集。
我们将只安装最新可用的 latest
版本:
asdf install nodejs latest
注意
asdf
强制使用准确的版本。latest
是一个通过 asdf
来解析到执行时刻的实际版本号的辅助工具。
asdf
在从当前工作目录一直到 $HOME
目录的所有 .tool-versions
文件中进行工具的版本查找。查找在执行 asdf
管理的工具时实时发生。
警告
如果没有为工具找到指定的版本,则会出现错误。asdf current
将显示当前目录中的工具和版本解析结果,或者不存在,以便你可以观察哪些工具将无法执行。
全局默认配置在 $HOME/.tool-versions
文件中进行管理。使用以下命令可以设置一个全局版本:
asdf global nodejs latest
$HOME/.tool-versions
文件内容将会如下所示:
nodejs 16.5.0
某些操作系统已经有一些由系统而非 asdf
安装和管理的工具了,python
就是一个常见的例子。你需要告诉 asdf
将管理权还给系统。版本参考部分 将会引导你。
本地版本被定义在 $PWD/.tool-versions
文件中(当前工作目录)。通常,这将会是一个项目的 Git 存储库。当在你想要的目录执行:
asdf local nodejs latest
$PWD/.tool-versions
文件内容将会如下所示:
nodejs 16.5.0
asdf
支持从其他版本管理器的现有版本文件中迁移过来,比如 rbenv
的 .ruby-version
文件。这在每个插件中都原生支持。
asdf-nodejs
支持从 .nvmrc
和 .node-version
文件进行迁移。为了启用此功能,请在 asdf
配置文件 $HOME/.asdfrc
中加入以下内容:
legacy_version_file = yes
请查看 配置 参考页面可以了解更多配置选项。
恭喜你完成了 asdf
的快速上手 🎉 你现在可以管理你的项目的 nodejs
版本了。对于项目中的其他工具类型可以执行类似步骤即可!
asdf
还有更多命令需要熟悉,你可以通过运行 asdf --help
或者 asdf
来查看它们。命令主要分为三类:
asdf
安装过程包括:
asdf
核心asdf
.tool-versions
配置文件设置全局和项目版本asdf primarily requires git
& curl
. Here is a non-exhaustive list of commands to run for your package manager (some might automatically install these tools in later steps).
OS | Package Manager | Command |
---|---|---|
linux | Aptitude | apt install curl git |
linux | DNF | dnf install curl git |
linux | Pacman | pacman -S curl git |
linux | Zypper | zypper install curl git |
macOS | Homebrew | brew install coreutils curl git |
macOS | Spack | spack install coreutils curl git |
Note
sudo
may be required depending on your system configuration.
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.1
We highly recommend using the official git
method.
Method | Command |
---|---|
Homebrew | brew install asdf |
Pacman | git clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper |
根据 Shell 脚本、操作系统和安装方法的组合不同,相应的配置也会不同。展开以下与你的系统最匹配的选项:
在 ~/.bashrc
文件中加入以下内容:
. "$HOME/.asdf/asdf.sh"
补全功能必须在 .bashrc
文件中加入以下内容来配置完成:
. "$HOME/.asdf/completions/asdf.bash"
如果你正在使用 macOS Catalina 或者更新的版本, 默认的 shell 已经被修改为 ZSH。除非修改回 Bash, 否则请遵循 ZSH 的说明。
在 ~/.bash_profile
文件中加入以下内容:
. "$HOME/.asdf/asdf.sh"
补全功能必须在 .bash_profile
文件中使用以下内容手动配置完成:
. "$HOME/.asdf/completions/asdf.bash"
使用以下命令将 asdf.sh
加入到 ~/.bashrc
文件中:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bashrc
补全功能将需要 按照 Homebrew 的说明完成配置 或者执行以下命令:
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
如果你正在使用 macOS Catalina 或者更新的版本, 默认的 shell 已经被修改为 ZSH。除非修改回 Bash, 否则请遵循 ZSH 的说明。
使用以下命令将 asdf.sh
加入到 ~/.bash_profile
文件中:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bash_profile
补全功能将需要 按照 Homebrew 的说明完成配置 或者执行以下命令:
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
在 ~/.config/fish/config.fish
文件中加入以下内容:
source ~/.asdf/asdf.fish
补全功能必须按照以下命令手动配置完成:
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
使用以下命令将 asdf.fish
加入到 ~/.config/fish/config.fish
文件中:
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish
Fish shell 的补全功能可以交给 Homebrew 处理. 很友好!
在 ~/.config/fish/config.fish
文件中加入以下内容:
source /opt/asdf-vm/asdf.fish
补全功能将会在安装过程中由 AUR 包管理器自动配置完成。
使用以下命令将 asdf.elv
加入到 ~/.config/elvish/rc.elv
文件中:
mkdir -p ~/.config/elvish/lib; ln -s ~/.asdf/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
补全功能将会自动配置。
使用以下命令将 asdf.elv
加入到 ~/.config/elvish/rc.elv
文件中:
mkdir -p ~/.config/elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
补全功能将会自动配置。
使用以下命令将 asdf.elv
加入到 ~/.config/elvish/rc.elv
文件中:
mkdir -p ~/.config/elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.config/elvish/lib/asdf.elv
+echo "\\n"'use asdf _asdf; var asdf~ = $_asdf:asdf~' >> ~/.config/elvish/rc.elv
+echo "\\n"'set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.config/elvish/rc.elv
补全功能将会自动配置。
在 ~/.zshrc
文件中加入以下内容:
. "$HOME/.asdf/asdf.sh"
或者 使用 ZSH 框架插件,比如 asdf for oh-my-zsh 将会使脚本生效并安装补全功能。
补全功能会被 ZSH 框架 asdf
插件或者通过在 .zshrc
文件中加入以下内容自动配置:
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
compinit
配置,请确保 compinit
在 asdf.sh
生效位置的下方compinit
配置和 ZSH 框架,请确保 compinit
在框架生效位置的下方警告
如果你正在使用 ZSH 框架,有关的 asdf
插件或许需要更新才能通过 fpath
正确地使用最新的 ZSH 补全功能。Oh-My-ZSH asdf 插件还在更新中,请查看 ohmyzsh/ohmyzsh#8837 了解更多。
使用以下命令将 asdf.sh
加入到 ~/.zshrc
文件中:
echo -e "\\n. $(brew --prefix asdf)/libexec/asdf.sh" >> \${ZDOTDIR:-~}/.zshrc
或者 使用 ZSH 框架插件,比如 asdf for oh-my-zsh 将会使脚本生效并安装补全功能。
补全功能可以被 ZSH 框架 asdf
或者 按照 Homebrew 的指引 完成配置。如果你正在使用 ZSH 框架,有关的 asdf
插件或许需要更新才能通过 fpath
正确地使用最新的 ZSH 补全功能。Oh-My-ZSH asdf 插件还在更新中,请查看 ohmyzsh/ohmyzsh#8837 了解更多。
在 ~/.zshrc
文件中加入以下内容:
. /opt/asdf-vm/asdf.sh
补全功能会被放在一个对 ZSH 很友好的位置,但是 ZSH 必须使用自动补全完成配置。
在 ~/.config/powershell/profile.ps1
文件中加入以下内容:
. "$HOME/.asdf/asdf.ps1"
使用以下命令将 asdf.ps1
加入到 ~/.config/powershell/profile.ps1
文件中:
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
在 ~/.config/powershell/profile.ps1
文件中加入以下内容:
. /opt/asdf-vm/asdf.ps1
使用以下命令将 asdf.nu
加入到 ~/.config/nushell/config.nu
文件中:
"\\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path
补全功能将会自动配置。
使用以下命令将 asdf.nu
加入到 ~/.config/nushell/config.nu
文件中:
"\\n$env.ASDF_DIR = (brew --prefix asdf | str trim | into string | path join 'libexec')\\n source " + (brew --prefix asdf | str trim | into string | path join 'libexec/asdf.nu') | save --append $nu.config-path
补全功能将会自动配置。
使用以下命令将 asdf.nu
加入到 ~/.config/nushell/config.nu
文件中:
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path
补全功能将会自动配置。
在 ~/.profile
文件中加入以下内容:
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
使用以下命令将 asdf.sh
加入到 ~/.profile
文件中:
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
在 ~/.profile
文件中加入以下内容:
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh
asdf
脚本需要在设置好的 $PATH
之后和已经生效的框架(比如 oh-my-zsh 等等)之后的位置生效。
通常打开一个新的终端标签页来重启你的 shell 让 PATH
更改即时生效。
这样就完成了 asdf
核心的安装 🎉
asdf
仅在你安装插件、工具和管理它们的版本时才开始真正发挥作用。请继续阅读下面的指南来了解这些是如何做到的。
出于演示目的,我们将通过 asdf-nodejs
插件来安装和设置 Node.js。
每个插件都有依赖,所以我们需要确认应该列举了这些依赖的插件源码。对于 asdf-nodejs
来说,它们是:
操作系统 | 安装依赖 |
---|---|
Linux (Debian) | apt-get install dirmngr gpg curl gawk |
macOS | brew install gpg gawk |
我们应该提前安装这些依赖,因为有些插件有 post-install 钩子。
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
现在我们已经有了 Node.js 插件,所以我们可以开始安装某个版本了。
我们通过 asdf list all nodejs
可以看到所有可用的版本或者通过 asdf list all nodejs 14
查看版本子集。
我们将只安装最新可用的 latest
版本:
asdf install nodejs latest
注意
asdf
强制使用准确的版本。latest
是一个通过 asdf
来解析到执行时刻的实际版本号的辅助工具。
asdf
在从当前工作目录一直到 $HOME
目录的所有 .tool-versions
文件中进行工具的版本查找。查找在执行 asdf
管理的工具时实时发生。
警告
如果没有为工具找到指定的版本,则会出现错误。asdf current
将显示当前目录中的工具和版本解析结果,或者不存在,以便你可以观察哪些工具将无法执行。
全局默认配置在 $HOME/.tool-versions
文件中进行管理。使用以下命令可以设置一个全局版本:
asdf global nodejs latest
$HOME/.tool-versions
文件内容将会如下所示:
nodejs 16.5.0
某些操作系统已经有一些由系统而非 asdf
安装和管理的工具了,python
就是一个常见的例子。你需要告诉 asdf
将管理权还给系统。版本参考部分 将会引导你。
本地版本被定义在 $PWD/.tool-versions
文件中(当前工作目录)。通常,这将会是一个项目的 Git 存储库。当在你想要的目录执行:
asdf local nodejs latest
$PWD/.tool-versions
文件内容将会如下所示:
nodejs 16.5.0
asdf
支持从其他版本管理器的现有版本文件中迁移过来,比如 rbenv
的 .ruby-version
文件。这在每个插件中都原生支持。
asdf-nodejs
支持从 .nvmrc
和 .node-version
文件进行迁移。为了启用此功能,请在 asdf
配置文件 $HOME/.asdfrc
中加入以下内容:
legacy_version_file = yes
请查看 配置 参考页面可以了解更多配置选项。
恭喜你完成了 asdf
的快速上手 🎉 你现在可以管理你的项目的 nodejs
版本了。对于项目中的其他工具类型可以执行类似步骤即可!
asdf
还有更多命令需要熟悉,你可以通过运行 asdf --help
或者 asdf
来查看它们。命令主要分为三类:
asdf
是一个工具版本管理器。所有的工具版本定义都包含在一个文件(.tool-versions
)中,你可以将配置文件放在项目的 Git 存储库中以便于和团队其他成员共享,从而确保每个人都使用完全相同的工具版本。
传统工作方式需要多个命令行版本管理器,而且每个管理器都有其不同的 API、配置文件和实现方式(比如,$PATH
操作、垫片、环境变量等等)。asdf
提供单个交互方式和配置文件来简化开发工作流程,并可通过简单的插件接口扩展到所有工具和运行环境。
一旦 asdf
核心在 Shell 配置中设置好之后,你可以安装插件来管理特定的工具。当通过插件安装工具时,安装的可执行程序会为每个可执行程序创建 垫片。当你尝试运行其中一个可执行程序时,将运行垫片,从而允许 asdf
识别 .tool-versions
文件中设置的工具版本并执行该版本。
nvm, n 和 rbenv 等工具都是用 Shell 脚本写的,这些脚本能为工具安装的可执行程序创建垫片。
asdf
非常相似,目的是在工具/运行环境版本管理领域竞争。asdf
的区别之处在于它的插件系统,它消除了每个工具/运行环境对管理工具的需求、每个管理工具的不同命令以及存储库中不同的*-版本
文件。
使用可以根据当前目录加载和卸载环境变量的新功能增强现有 shell。
asdf
不管理环境变量,但是有一个插件 asdf-direnv
可以用来集成 direnv 的特性到 asdf
中。
请查看 direnv 文档 了解更多。
macOS(或者 Linux)上缺失包的管理器
Homebrew 管理你的软件包及其上游依赖。asdf
不管理上游依赖,它不是包管理器。这个责任取决于用户,尽管我们试图保持依赖关系列表很小。
请查看 Homebrew 文档 了解更多。
Nix 是一种采用独特方法进行软件包管理和系统配置的工具
NixOS 旨在通过管理每个工具的整个依赖关系树中软件包的确切版本来构建真正可重复的环境,有些是 asdf
无法做到的。NixOS 使用自己的编程语言、许多命令行工具和超过 60,000 个包的包集合来实现这一点。
同样,asdf
不管理上游依赖,并且它不是一个包管理器。
请查看 NixOS 文档 了解更多。
asdf
确保团队可以使用完全相同的工具版本,通过插件系统支持很多工具,以及作为 Shell 配置中包含的单个 Shell 脚本的 简单性和熟悉性 。
注意
asdf
并不打算成为一个系统包管理器。它是一个工具版本管理器。仅仅因为你可以为任何工具创建插件并使用 asdf
管理其版本,并不意味着这是这个特定工具的最佳实践方案。
asdf
是一个工具版本管理器。所有的工具版本定义都包含在一个文件(.tool-versions
)中,你可以将配置文件放在项目的 Git 存储库中以便于和团队其他成员共享,从而确保每个人都使用完全相同的工具版本。
传统工作方式需要多个命令行版本管理器,而且每个管理器都有其不同的 API、配置文件和实现方式(比如,$PATH
操作、垫片、环境变量等等)。asdf
提供单个交互方式和配置文件来简化开发工作流程,并可通过简单的插件接口扩展到所有工具和运行环境。
一旦 asdf
核心在 Shell 配置中设置好之后,你可以安装插件来管理特定的工具。当通过插件安装工具时,安装的可执行程序会为每个可执行程序创建 垫片。当你尝试运行其中一个可执行程序时,将运行垫片,从而允许 asdf
识别 .tool-versions
文件中设置的工具版本并执行该版本。
nvm, n 和 rbenv 等工具都是用 Shell 脚本写的,这些脚本能为工具安装的可执行程序创建垫片。
asdf
非常相似,目的是在工具/运行环境版本管理领域竞争。asdf
的区别之处在于它的插件系统,它消除了每个工具/运行环境对管理工具的需求、每个管理工具的不同命令以及存储库中不同的*-版本
文件。
使用可以根据当前目录加载和卸载环境变量的新功能增强现有 shell。
asdf
不管理环境变量,但是有一个插件 asdf-direnv
可以用来集成 direnv 的特性到 asdf
中。
请查看 direnv 文档 了解更多。
macOS(或者 Linux)上缺失包的管理器
Homebrew 管理你的软件包及其上游依赖。asdf
不管理上游依赖,它不是包管理器。这个责任取决于用户,尽管我们试图保持依赖关系列表很小。
请查看 Homebrew 文档 了解更多。
Nix 是一种采用独特方法进行软件包管理和系统配置的工具
NixOS 旨在通过管理每个工具的整个依赖关系树中软件包的确切版本来构建真正可重复的环境,有些是 asdf
无法做到的。NixOS 使用自己的编程语言、许多命令行工具和超过 60,000 个包的包集合来实现这一点。
同样,asdf
不管理上游依赖,并且它不是一个包管理器。
请查看 NixOS 文档 了解更多。
asdf
确保团队可以使用完全相同的工具版本,通过插件系统支持很多工具,以及作为 Shell 配置中包含的单个 Shell 脚本的 简单性和熟悉性 。
注意
asdf
并不打算成为一个系统包管理器。它是一个工具版本管理器。仅仅因为你可以为任何工具创建插件并使用 asdf
管理其版本,并不意味着这是这个特定工具的最佳实践方案。
asdf
中所有可用命令的列表。这个列表就是 asdf help
命令的打印内容。
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>] Add a plugin from the plugin repo OR,
+ add a Git repo as a plugin by
+ specifying the name and repo url
+asdf plugin list [--urls] [--refs] List installed plugins. Optionally show
+ git urls and git-ref
+asdf plugin list all List plugins registered on asdf-plugins
+ repository with URLs
+asdf plugin remove <name> Remove plugin and package versions
+asdf plugin update <name> [<git-ref>] Update a plugin to latest commit on
+ default branch or a particular git-ref
+asdf plugin update --all Update all plugins to latest commit on
+ default branch
+
+
+MANAGE PACKAGES
+asdf current Display current version set or being
+ used for all packages
+asdf current <name> Display current version set or being
+ used for package
+asdf global <name> <version> Set the package global version
+asdf global <name> latest[:<version>] Set the package global version to the
+ latest provided version
+asdf help <name> [<version>] Output documentation for plugin and tool
+asdf install Install all the package versions listed
+ in the .tool-versions file
+asdf install <name> Install one tool at the version
+ specified in the .tool-versions file
+asdf install <name> <version> Install a specific version of a package
+asdf install <name> latest[:<version>] Install the latest stable version of a
+ package, or with optional version,
+ install the latest stable version that
+ begins with the given string
+asdf latest <name> [<version>] Show latest stable version of a package
+asdf latest --all Show latest stable version of all the
+ packages and if they are installed
+asdf list <name> [version] List installed versions of a package and
+ optionally filter the versions
+asdf list all <name> [<version>] List all versions of a package and
+ optionally filter the returned versions
+asdf local <name> <version> Set the package local version
+asdf local <name> latest[:<version>] Set the package local version to the
+ latest provided version
+asdf shell <name> <version> Set the package version to
+ \`ASDF_\${LANG}_VERSION\` in the current shell
+asdf uninstall <name> <version> Remove a specific version of a package
+asdf where <name> [<version>] Display install path for an installed
+ or current version
+asdf which <command> Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...] Executes the command shim for current version
+asdf env <command> [util] Runs util (default: \`env\`) inside the
+ environment used for command shim execution.
+asdf info Print OS, Shell and ASDF debug information.
+asdf version Print the currently installed version of ASDF
+asdf reshim <name> <version> Recreate shims for version of a package
+asdf shim-versions <command> List the plugins and versions that
+ provide a command
+asdf update Update asdf to the latest stable release
+asdf update --head Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs: https://asdf-vm.com
asdf
中所有可用命令的列表。这个列表就是 asdf help
命令的打印内容。
MANAGE PLUGINS
+asdf plugin add <name> [<git-url>] Add a plugin from the plugin repo OR,
+ add a Git repo as a plugin by
+ specifying the name and repo url
+asdf plugin list [--urls] [--refs] List installed plugins. Optionally show
+ git urls and git-ref
+asdf plugin list all List plugins registered on asdf-plugins
+ repository with URLs
+asdf plugin remove <name> Remove plugin and package versions
+asdf plugin update <name> [<git-ref>] Update a plugin to latest commit on
+ default branch or a particular git-ref
+asdf plugin update --all Update all plugins to latest commit on
+ default branch
+
+
+MANAGE PACKAGES
+asdf current Display current version set or being
+ used for all packages
+asdf current <name> Display current version set or being
+ used for package
+asdf global <name> <version> Set the package global version
+asdf global <name> latest[:<version>] Set the package global version to the
+ latest provided version
+asdf help <name> [<version>] Output documentation for plugin and tool
+asdf install Install all the package versions listed
+ in the .tool-versions file
+asdf install <name> Install one tool at the version
+ specified in the .tool-versions file
+asdf install <name> <version> Install a specific version of a package
+asdf install <name> latest[:<version>] Install the latest stable version of a
+ package, or with optional version,
+ install the latest stable version that
+ begins with the given string
+asdf latest <name> [<version>] Show latest stable version of a package
+asdf latest --all Show latest stable version of all the
+ packages and if they are installed
+asdf list <name> [version] List installed versions of a package and
+ optionally filter the versions
+asdf list all <name> [<version>] List all versions of a package and
+ optionally filter the returned versions
+asdf local <name> <version> Set the package local version
+asdf local <name> latest[:<version>] Set the package local version to the
+ latest provided version
+asdf shell <name> <version> Set the package version to
+ \`ASDF_\${LANG}_VERSION\` in the current shell
+asdf uninstall <name> <version> Remove a specific version of a package
+asdf where <name> [<version>] Display install path for an installed
+ or current version
+asdf which <command> Display the path to an executable
+
+
+UTILS
+asdf exec <command> [args...] Executes the command shim for current version
+asdf env <command> [util] Runs util (default: \`env\`) inside the
+ environment used for command shim execution.
+asdf info Print OS, Shell and ASDF debug information.
+asdf version Print the currently installed version of ASDF
+asdf reshim <name> <version> Recreate shims for version of a package
+asdf shim-versions <command> List the plugins and versions that
+ provide a command
+asdf update Update asdf to the latest stable release
+asdf update --head Update asdf to the latest on the master branch
+
+RESOURCES
+GitHub: https://github.com/asdf-vm/asdf
+Docs: https://asdf-vm.com
asdf
配置既包括可共享的 .tool-versions
文件,也包括用户特定的自定义 .asdfrc
和环境变量。
.tool-versions
无论何时 .tool-versions
出现在目录中,它所声明的工具版本将会被用于该目录和任意子目录。
注意
全局默认配置将设置在文件$HOME/.tool-versions
中
一个 .tool-versions
文件示例如下所示:
ruby 2.5.3
+nodejs 10.15.0
你也可以包含注释在里面:
ruby 2.5.3 # 这是一个注释
+# 这是另一个注释
+nodejs 10.15.0
版本号可以有如下格式:
10.15.0
- 实际的版本号。支持下载二进制文件的插件将会下载二进制文件。ref:v1.0.2-a
或者 ref:39cb398vb39
- 指定标签/提交/分支从 github 下载并编译。path:~/src/elixir
- 要使用的工具的自定义编译版本的路径。这种方式供语言开发者等使用。system
- 此关键字会导致 asdf 传递系统上未由 asdf 管理的工具版本。提示
多版本可以通过空格将它们分隔开来。比如,使用 Python 3.7.2
回退到 Python 2.7.15
最后回退到 system
Python,可以将以下行的内容添加到 .tool-versions
文件中。
python 3.7.2 2.7.15 system
为了安装 .tool-versions
文件中定义的所有工具,在包含 .tool-versions
文件的目录中不带其他参数执行 asdf install
命令。
为了安装 .tool-versions
文件中定义的某个工具,在包含 .tool-versions
文件的目录中运行 asdf install <name>
命令。这个工具将会安装 .tool-versions
文件所指定的版本。
可以直接编辑这个文件或者使用 asdf local
(或者 asdf global
)来更新工具版本。
$HOME/.asdfrc
给你的家目录添加一个 .asdfrc
文件然后 asdf 将会使用这个文件所指定的配置。下面的文件展示了所需的格式,其中包含用于演示的默认值:
legacy_version_file = no
+use_release_candidates = no
+always_keep_download = no
+plugin_repository_last_check_duration = 60
+disable_plugin_short_name_repository = no
+concurrency = auto
legacy_version_file
插件 支持 读取其他版本管理器使用的版本文件,比如,Ruby 的 rbenv
的 .ruby-version
文件。
ASDF_CONFIG_FILE
- 如上所述默认为 ~/.asdfrc
文件。可以被设置在任何位置。ASDF_DEFAULT_TOOL_VERSIONS_FILENAME
- 存储工具名称和版本的文件名。默认为 .tool-versions
。可以是任何有效的文件名。通常,除非你知道你希望 asdf 忽略 .tool-versions
文件,否则不应该覆盖默认值。ASDF_DIR
- 默认为 ~/.asdf
- asdf
脚本的位置。如果你把 asdf
安装到了其他目录,请设置该变量到那个目录。比如,如果通过 AUR 进行安装,则应设置该变量为 /opt/asdf-vm
。ASDF_DATA_DIR
- 默认为 ~/.asdf
- asdf
安装插件、垫片和安装器的位置。可以被设置在上一节提到的生效 asdf.sh
或者 asdf.fish
之间的任何位置。对于 Elvish,这可以设置在 use asdf
上面。用户不必担心本节,因为它描述了对包管理器和集成者有用的 asdf
的内部配置。
$ASDF_DIR/asdf_updates_disabled
:当此文件存在时(内容无关),通过 asdf update
命令进行的更新 将会被禁用。像 Pacman 或者 Homebrew 等包管理器使用它来确保个性化安装的正确的更新方法。asdf
配置既包括可共享的 .tool-versions
文件,也包括用户特定的自定义 .asdfrc
和环境变量。
.tool-versions
无论何时 .tool-versions
出现在目录中,它所声明的工具版本将会被用于该目录和任意子目录。
注意
全局默认配置将设置在文件$HOME/.tool-versions
中
一个 .tool-versions
文件示例如下所示:
ruby 2.5.3
+nodejs 10.15.0
你也可以包含注释在里面:
ruby 2.5.3 # 这是一个注释
+# 这是另一个注释
+nodejs 10.15.0
版本号可以有如下格式:
10.15.0
- 实际的版本号。支持下载二进制文件的插件将会下载二进制文件。ref:v1.0.2-a
或者 ref:39cb398vb39
- 指定标签/提交/分支从 github 下载并编译。path:~/src/elixir
- 要使用的工具的自定义编译版本的路径。这种方式供语言开发者等使用。system
- 此关键字会导致 asdf 传递系统上未由 asdf 管理的工具版本。提示
多版本可以通过空格将它们分隔开来。比如,使用 Python 3.7.2
回退到 Python 2.7.15
最后回退到 system
Python,可以将以下行的内容添加到 .tool-versions
文件中。
python 3.7.2 2.7.15 system
为了安装 .tool-versions
文件中定义的所有工具,在包含 .tool-versions
文件的目录中不带其他参数执行 asdf install
命令。
为了安装 .tool-versions
文件中定义的某个工具,在包含 .tool-versions
文件的目录中运行 asdf install <name>
命令。这个工具将会安装 .tool-versions
文件所指定的版本。
可以直接编辑这个文件或者使用 asdf local
(或者 asdf global
)来更新工具版本。
$HOME/.asdfrc
给你的家目录添加一个 .asdfrc
文件然后 asdf 将会使用这个文件所指定的配置。下面的文件展示了所需的格式,其中包含用于演示的默认值:
legacy_version_file = no
+use_release_candidates = no
+always_keep_download = no
+plugin_repository_last_check_duration = 60
+disable_plugin_short_name_repository = no
+concurrency = auto
legacy_version_file
插件 支持 读取其他版本管理器使用的版本文件,比如,Ruby 的 rbenv
的 .ruby-version
文件。
ASDF_CONFIG_FILE
- 如上所述默认为 ~/.asdfrc
文件。可以被设置在任何位置。ASDF_DEFAULT_TOOL_VERSIONS_FILENAME
- 存储工具名称和版本的文件名。默认为 .tool-versions
。可以是任何有效的文件名。通常,除非你知道你希望 asdf 忽略 .tool-versions
文件,否则不应该覆盖默认值。ASDF_DIR
- 默认为 ~/.asdf
- asdf
脚本的位置。如果你把 asdf
安装到了其他目录,请设置该变量到那个目录。比如,如果通过 AUR 进行安装,则应设置该变量为 /opt/asdf-vm
。ASDF_DATA_DIR
- 默认为 ~/.asdf
- asdf
安装插件、垫片和安装器的位置。可以被设置在上一节提到的生效 asdf.sh
或者 asdf.fish
之间的任何位置。对于 Elvish,这可以设置在 use asdf
上面。用户不必担心本节,因为它描述了对包管理器和集成者有用的 asdf
的内部配置。
$ASDF_DIR/asdf_updates_disabled
:当此文件存在时(内容无关),通过 asdf update
命令进行的更新 将会被禁用。像 Pacman 或者 Homebrew 等包管理器使用它来确保个性化安装的正确的更新方法。核心 asdf
命令列表很小,但可以促进很多工作流。
请查看 快速上手 了解更多详情。
asdf exec <command> [args...]
执行当前版本的命令垫片。
asdf env <command> [util]
asdf info
用于打印操作系统、Shell 和 asdf
调试信息的辅助命令。在报告 bug 时需要共享这些信息。
asdf reshim <name> <version>
这将为某个包的当前版本重新创建垫片。默认情况下,垫片是在某个工具安装的过程中由插件创建。一些工具像 npm 命令行 允许全局安装可执行程序,比如使用 npm install -g yarn
命令安装 Yarn。因为这个可执行程序不是通过插件生命周期安装的,所以还没有对应的垫片存在。asdf reshim nodejs <version>
命令将会强制重新计算任何新可执行程序的垫片,类似 nodejs
的 versions
版本下的 yarn
。
asdf shim-versions <command>
列举为命令提供垫片的插件和版本。
例如,Node.js 附带了两个可执行程序,node
和 npm
。当使用 asdf-nodejs
插件安装了这些工具的很多版本时,执行
shim-versions\` 命令会返回:
➜ asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
➜ asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
asdf
有一个依赖于 Git (我们推荐的安装方法)的内置命令用于更新。如果你使用了其他方法安装,则应按照该方法的步骤操作:
方法 | 最新稳定版本 | master 分支上的最新提交 |
---|---|---|
asdf (Git) | asdf update | asdf update --head |
Homebrew | brew upgrade asdf | brew upgrade asdf --fetch-HEAD |
Pacman | 下载一个新的 PKGBUILD 并且重新编译 或者使用你习惯的 AUR helper |
根据以下步骤卸载 asdf
:
~/.bashrc
配置文件中移除生效 asdf.sh
和补全功能的行:. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
$HOME/.asdf
目录:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bash_profile
配置文件中移除生效 asdf.sh
和补全功能的行:. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
$HOME/.asdf
目录:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bashrc
配置文件中移除生效 asdf.sh
和补全功能的行:. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash
补全功能可能已经如 Homebrew 的指南 那样配置了,因此请按照他们的指南找出要删除的内容。
brew uninstall asdf --force
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
如果你正在使用 macOS Catalina 以及更新版本,默认的 shell 已经变成了 ZSH。如果你在 ~/.bash_profile
文件中找不到任何配置,则可能位于 ~/.zshrc
中。在这种情况下,请按照 ZSH 指南进行操作。
~/.bash_profile
配置文件中移除生效 asdf.sh
和补全功能的行:. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash
补全功能可能已经如 Homebrew 的指南 那样配置了,因此请按照他们的指南找出要删除的内容。
brew uninstall asdf --force
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bashrc
配置文件中移除生效 asdf.sh
和补全功能的行:. /opt/asdf-vm/asdf.sh
pacman -Rs asdf-vm
$HOME/.asdf
目录:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
配置文件中移除生效 asdf.fish
的行:source ~/.asdf/asdf.fish
以及使用以下命令移除补全功能:
rm -rf ~/.config/fish/completions/asdf.fish
$HOME/.asdf
目录:rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
配置文件中移除生效 asdf.fish
的行:source "(brew --prefix asdf)"/libexec/asdf.fish
brew uninstall asdf --force
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
配置文件中移除生效 asdf.fish
的行:source /opt/asdf-vm/asdf.fish
pacman -Rs asdf-vm
$HOME/.asdf
目录:rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
配置文件中移除使用 asdf
模块的行:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
以及使用以下命令卸载 asdf
模块:
rm -f ~/.config/elvish/lib/asdf.elv
$HOME/.asdf
目录:if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
配置文件中移除使用 asdf
模块的行:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
以及使用以下命令卸载 asdf
模块:
rm -f ~/.config/elvish/lib/asdf.elv
brew uninstall asdf --force
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
配置文件中移除使用 asdf
模块的行:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
以及使用以下命令卸载 asdf
模块:
rm -f ~/.config/elvish/lib/asdf.elv
pacman -Rs asdf-vm
$HOME/.asdf
目录:if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
配置文件中移除生效 asdf.sh
和补全功能的行:. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit
或者 ZSH 框架插件(如果用了的话)
$HOME/.asdf
目录:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
配置文件中移除生效 asdf.sh
的行:. $(brew --prefix asdf)/libexec/asdf.sh
brew uninstall asdf --force && brew autoremove
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
配置文件中移除生效 asdf.sh
的行:. /opt/asdf-vm/asdf.sh
pacman -Rs asdf-vm
$HOME/.asdf
目录rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
恭喜你完成了 🎉
`,41)]))}const F=i(h,[["render",e]]);export{c as __pageData,F as default}; diff --git a/assets/zh-hans_manage_core.md._3uzcWzu.lean.js b/assets/zh-hans_manage_core.md._3uzcWzu.lean.js new file mode 100644 index 00000000..0c5bdc50 --- /dev/null +++ b/assets/zh-hans_manage_core.md._3uzcWzu.lean.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as l,o as t}from"./chunks/framework.C9NVOr0y.js";const c=JSON.parse('{"title":"核心","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/manage/core.md","filePath":"zh-hans/manage/core.md","lastUpdated":1687069487000}'),h={name:"zh-hans/manage/core.md"};function e(n,s,p,k,d,o){return t(),a("div",null,s[0]||(s[0]=[l(`核心 asdf
命令列表很小,但可以促进很多工作流。
请查看 快速上手 了解更多详情。
asdf exec <command> [args...]
执行当前版本的命令垫片。
asdf env <command> [util]
asdf info
用于打印操作系统、Shell 和 asdf
调试信息的辅助命令。在报告 bug 时需要共享这些信息。
asdf reshim <name> <version>
这将为某个包的当前版本重新创建垫片。默认情况下,垫片是在某个工具安装的过程中由插件创建。一些工具像 npm 命令行 允许全局安装可执行程序,比如使用 npm install -g yarn
命令安装 Yarn。因为这个可执行程序不是通过插件生命周期安装的,所以还没有对应的垫片存在。asdf reshim nodejs <version>
命令将会强制重新计算任何新可执行程序的垫片,类似 nodejs
的 versions
版本下的 yarn
。
asdf shim-versions <command>
列举为命令提供垫片的插件和版本。
例如,Node.js 附带了两个可执行程序,node
和 npm
。当使用 asdf-nodejs
插件安装了这些工具的很多版本时,执行
shim-versions\` 命令会返回:
➜ asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
➜ asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
asdf
有一个依赖于 Git (我们推荐的安装方法)的内置命令用于更新。如果你使用了其他方法安装,则应按照该方法的步骤操作:
方法 | 最新稳定版本 | master 分支上的最新提交 |
---|---|---|
asdf (Git) | asdf update | asdf update --head |
Homebrew | brew upgrade asdf | brew upgrade asdf --fetch-HEAD |
Pacman | 下载一个新的 PKGBUILD 并且重新编译 或者使用你习惯的 AUR helper |
根据以下步骤卸载 asdf
:
~/.bashrc
配置文件中移除生效 asdf.sh
和补全功能的行:. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
$HOME/.asdf
目录:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bash_profile
配置文件中移除生效 asdf.sh
和补全功能的行:. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
$HOME/.asdf
目录:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bashrc
配置文件中移除生效 asdf.sh
和补全功能的行:. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash
补全功能可能已经如 Homebrew 的指南 那样配置了,因此请按照他们的指南找出要删除的内容。
brew uninstall asdf --force
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
如果你正在使用 macOS Catalina 以及更新版本,默认的 shell 已经变成了 ZSH。如果你在 ~/.bash_profile
文件中找不到任何配置,则可能位于 ~/.zshrc
中。在这种情况下,请按照 ZSH 指南进行操作。
~/.bash_profile
配置文件中移除生效 asdf.sh
和补全功能的行:. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash
补全功能可能已经如 Homebrew 的指南 那样配置了,因此请按照他们的指南找出要删除的内容。
brew uninstall asdf --force
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.bashrc
配置文件中移除生效 asdf.sh
和补全功能的行:. /opt/asdf-vm/asdf.sh
pacman -Rs asdf-vm
$HOME/.asdf
目录:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
配置文件中移除生效 asdf.fish
的行:source ~/.asdf/asdf.fish
以及使用以下命令移除补全功能:
rm -rf ~/.config/fish/completions/asdf.fish
$HOME/.asdf
目录:rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
配置文件中移除生效 asdf.fish
的行:source "(brew --prefix asdf)"/libexec/asdf.fish
brew uninstall asdf --force
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/fish/config.fish
配置文件中移除生效 asdf.fish
的行:source /opt/asdf-vm/asdf.fish
pacman -Rs asdf-vm
$HOME/.asdf
目录:rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
配置文件中移除使用 asdf
模块的行:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
以及使用以下命令卸载 asdf
模块:
rm -f ~/.config/elvish/lib/asdf.elv
$HOME/.asdf
目录:if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
配置文件中移除使用 asdf
模块的行:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
以及使用以下命令卸载 asdf
模块:
rm -f ~/.config/elvish/lib/asdf.elv
brew uninstall asdf --force
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.config/elvish/rc.elv
配置文件中移除使用 asdf
模块的行:use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
以及使用以下命令卸载 asdf
模块:
rm -f ~/.config/elvish/lib/asdf.elv
pacman -Rs asdf-vm
$HOME/.asdf
目录:if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
配置文件中移除生效 asdf.sh
和补全功能的行:. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit
或者 ZSH 框架插件(如果用了的话)
$HOME/.asdf
目录:rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
配置文件中移除生效 asdf.sh
的行:. $(brew --prefix asdf)/libexec/asdf.sh
brew uninstall asdf --force && brew autoremove
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
~/.zshrc
配置文件中移除生效 asdf.sh
的行:. /opt/asdf-vm/asdf.sh
pacman -Rs asdf-vm
$HOME/.asdf
目录rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
asdf
所有配置文件:rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
恭喜你完成了 🎉
`,41)]))}const F=i(h,[["render",e]]);export{c as __pageData,F as default}; diff --git a/assets/zh-hans_manage_plugins.md.DY_Xuyjn.js b/assets/zh-hans_manage_plugins.md.DY_Xuyjn.js new file mode 100644 index 00000000..3c1c746d --- /dev/null +++ b/assets/zh-hans_manage_plugins.md.DY_Xuyjn.js @@ -0,0 +1,11 @@ +import{_ as a,c as i,a2 as l,o as e}from"./chunks/framework.C9NVOr0y.js";const o=JSON.parse('{"title":"插件","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/manage/plugins.md","filePath":"zh-hans/manage/plugins.md","lastUpdated":1687069487000}'),t={name:"zh-hans/manage/plugins.md"};function n(h,s,p,d,k,r){return e(),i("div",null,s[0]||(s[0]=[l(`插件告诉 asdf
如何处理不同的工具,如 Node.js、 Ruby、 Elixir 等。
请参考 创建插件 了解用于支持更多工具的插件 API。
通过 Git URL 地址添加插件:
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm
或者通过插件存储库中的缩写添加插件:
asdf plugin add <name>
+# asdf plugin add erlang
建议
推荐独立于缩写存储库的、更长的 git-url
方法。
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
asdf plugin list --urls
+# asdf plugin list
+# java https://github.com/halcyon/asdf-java.git
+# nodejs https://github.com/asdf-vm/asdf-nodejs.git
asdf plugin list all
请参考 插件缩写索引 了解插件的完整缩写列表。
asdf plugin update --all
如果你想要更新特定的包,如下所示。
asdf plugin update <name>
+# asdf plugin update erlang
这种更新方式将会获取插件存储库的 源代码 的 默认分支 的 最新提交。版本化的插件和更新正在开发中 (#916)。
asdf plugin remove <name>
+# asdf plugin remove erlang
移除一个插件将会移除该插件安装的所有工具。这可以当作是清理/修剪工具的许多未使用版本的简单方法。
缩写存储库将同步到你的本地计算机并定期刷新。这个周期由以下方法确定:
asdf plugin add <name>
或者 asdf plugin list all
将会触发同步X
分钟内没有同步,则进行同步X
默认是 60
,但可以通过在 .asdfrc
文件中配置 plugin_repository_last_check_duration
选项来进行配置。请查看 asdf 配置文档 了解更多。插件告诉 asdf
如何处理不同的工具,如 Node.js、 Ruby、 Elixir 等。
请参考 创建插件 了解用于支持更多工具的插件 API。
通过 Git URL 地址添加插件:
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm
或者通过插件存储库中的缩写添加插件:
asdf plugin add <name>
+# asdf plugin add erlang
建议
推荐独立于缩写存储库的、更长的 git-url
方法。
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
asdf plugin list --urls
+# asdf plugin list
+# java https://github.com/halcyon/asdf-java.git
+# nodejs https://github.com/asdf-vm/asdf-nodejs.git
asdf plugin list all
请参考 插件缩写索引 了解插件的完整缩写列表。
asdf plugin update --all
如果你想要更新特定的包,如下所示。
asdf plugin update <name>
+# asdf plugin update erlang
这种更新方式将会获取插件存储库的 源代码 的 默认分支 的 最新提交。版本化的插件和更新正在开发中 (#916)。
asdf plugin remove <name>
+# asdf plugin remove erlang
移除一个插件将会移除该插件安装的所有工具。这可以当作是清理/修剪工具的许多未使用版本的简单方法。
缩写存储库将同步到你的本地计算机并定期刷新。这个周期由以下方法确定:
asdf plugin add <name>
或者 asdf plugin list all
将会触发同步X
分钟内没有同步,则进行同步X
默认是 60
,但可以通过在 .asdfrc
文件中配置 plugin_repository_last_check_duration
选项来进行配置。请查看 asdf 配置文档 了解更多。asdf install <name> <version>
+# asdf install erlang 17.3
如果一个插件支持从源代码下载和编译,你可以指定 ref:foo
,其中 foo
是特定的分支、标签或者提交。卸载该版本时,你也需要使用相同的名称和引用。
asdf install <name> latest
+# asdf install erlang latest
安装给定字符串开头的最新稳定版本。
asdf install <name> latest:<version>
+# asdf install erlang latest:17
asdf list <name>
+# asdf list erlang
筛选出以给定字符串开头的版本。
asdf list <name> <version>
+# asdf list erlang 17
asdf list all <name>
+# asdf list all erlang
筛选出以给定字符串开头的版本。
asdf list all <name> <version>
+# asdf list all erlang 17
asdf latest <name>
+# asdf latest erlang
显示以给定字符串开头的最新稳定版本。
asdf latest <name> <version>
+# asdf latest erlang 17
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest
global
将版本写到 $HOME/.tool-versions
文件中。
shell
仅为当前 shell 会话将版本设置为一个名为 ASDF_\${LANG}_VERSION
的环境变量。
local
将版本写到 $PWD/.tool-versions
文件中,如果有需要也会创建此文件。
请查看 配置部分 的 .tool-versions
文件了解更多详情。
可选
如果你只是想为当前 shell 会话或者在特定工具版本下执行一条命令,你可以设置一个类似 ASDF_\${TOOL}_VERSION
的环境变量。
下面的示例在版本为 1.4.0
的 Elixir 项目上运行测试。 版本格式与 .tool-versions
文件支持的版本格式相同。
ASDF_ELIXIR_VERSION=1.4.0 mix test
要使用工具 <name>
的系统版本而非 asdf 管理版本,你可以将工具的版本设置为 system
。
使用 global
、local
或者 shell
设置系统,如上面的 设置当前版本 部分所述。
asdf local <name> system
+# asdf local python system
asdf current
+# asdf current
+# erlang 17.3 (set by /Users/kim/.tool-versions)
+# nodejs 6.11.5 (set by /Users/kim/cool-node-project/.tool-versions)
+
+asdf current <name>
+# asdf current erlang
+# 17.3 (set by /Users/kim/.tool-versions)
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3
当 asdf 安装一个包时,它会在 $ASDF_DATA_DIR/shims
目录(默认为 ~/.asdf/shims
)中为该包中的每个可执行程序创建垫片。这个位于 $PATH
中(通过 asdf.sh
、 asdf.fish
等等实现)的目录是已安装程序在环境中可用的方式。
垫片本身是非常简单的包装器,它 exec
(执行)一个辅助程序 asdf exec
,向其传递插件的名称和垫片正在包装的已安装包中的可执行程序的路径。
asdf exec
辅助程序确定要使用的软件包版本(比如在 .tool-versions
文件中指定,通过 asdf local ...
或者 asdf global ...
命令选择)、软件包安装目录中的可执行程序的最终路径(这可以在插件中通过 exec-path
回调来操作)以及要在其中执行的环境(也由插件 - exec-env
脚本提供),最后完成执行。
注意
因为此系统使用 exec
调用,所以软件包中的任何脚本如果要由 shell 生效而不是执行的脚本都需要直接访问,而不是通过垫片包装器进行访问。两个 asdf
命令:which
和 where
可以通过返回已安装软件包的路径来帮助解决这个问题。
# 返回当前版本中主要可执行程序的路径
+source $(asdf which \${PLUGIN})/../script.sh
+
+# 返回软件包安装目录的路径
+source $(asdf where \${PLUGIN} $(asdf current \${PLUGIN}))/bin/script.sh
如果由于某种原因,你希望绕过 asdf 垫片,或者希望在进入项目目录时自动设置环境变量,则 asdf-direnv 插件可能会有所帮助。请务必查看其 README 文件了解更多详情。
`,45)]))}const c=i(t,[["render",n]]);export{o as __pageData,c as default}; diff --git a/assets/zh-hans_manage_versions.md.BOLJYZ7r.lean.js b/assets/zh-hans_manage_versions.md.BOLJYZ7r.lean.js new file mode 100644 index 00000000..0bbf0caa --- /dev/null +++ b/assets/zh-hans_manage_versions.md.BOLJYZ7r.lean.js @@ -0,0 +1,30 @@ +import{_ as i,c as a,a2 as l,o as h}from"./chunks/framework.C9NVOr0y.js";const o=JSON.parse('{"title":"版本","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/manage/versions.md","filePath":"zh-hans/manage/versions.md","lastUpdated":1687069487000}'),t={name:"zh-hans/manage/versions.md"};function n(e,s,p,k,d,r){return h(),a("div",null,s[0]||(s[0]=[l(`asdf install <name> <version>
+# asdf install erlang 17.3
如果一个插件支持从源代码下载和编译,你可以指定 ref:foo
,其中 foo
是特定的分支、标签或者提交。卸载该版本时,你也需要使用相同的名称和引用。
asdf install <name> latest
+# asdf install erlang latest
安装给定字符串开头的最新稳定版本。
asdf install <name> latest:<version>
+# asdf install erlang latest:17
asdf list <name>
+# asdf list erlang
筛选出以给定字符串开头的版本。
asdf list <name> <version>
+# asdf list erlang 17
asdf list all <name>
+# asdf list all erlang
筛选出以给定字符串开头的版本。
asdf list all <name> <version>
+# asdf list all erlang 17
asdf latest <name>
+# asdf latest erlang
显示以给定字符串开头的最新稳定版本。
asdf latest <name> <version>
+# asdf latest erlang 17
asdf global <name> <version> [<version>...]
+asdf shell <name> <version> [<version>...]
+asdf local <name> <version> [<version>...]
+# asdf global elixir 1.2.4
+
+asdf global <name> latest[:<version>]
+asdf local <name> latest[:<version>]
+# asdf global elixir latest
global
将版本写到 $HOME/.tool-versions
文件中。
shell
仅为当前 shell 会话将版本设置为一个名为 ASDF_\${LANG}_VERSION
的环境变量。
local
将版本写到 $PWD/.tool-versions
文件中,如果有需要也会创建此文件。
请查看 配置部分 的 .tool-versions
文件了解更多详情。
可选
如果你只是想为当前 shell 会话或者在特定工具版本下执行一条命令,你可以设置一个类似 ASDF_\${TOOL}_VERSION
的环境变量。
下面的示例在版本为 1.4.0
的 Elixir 项目上运行测试。 版本格式与 .tool-versions
文件支持的版本格式相同。
ASDF_ELIXIR_VERSION=1.4.0 mix test
要使用工具 <name>
的系统版本而非 asdf 管理版本,你可以将工具的版本设置为 system
。
使用 global
、local
或者 shell
设置系统,如上面的 设置当前版本 部分所述。
asdf local <name> system
+# asdf local python system
asdf current
+# asdf current
+# erlang 17.3 (set by /Users/kim/.tool-versions)
+# nodejs 6.11.5 (set by /Users/kim/cool-node-project/.tool-versions)
+
+asdf current <name>
+# asdf current erlang
+# 17.3 (set by /Users/kim/.tool-versions)
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3
当 asdf 安装一个包时,它会在 $ASDF_DATA_DIR/shims
目录(默认为 ~/.asdf/shims
)中为该包中的每个可执行程序创建垫片。这个位于 $PATH
中(通过 asdf.sh
、 asdf.fish
等等实现)的目录是已安装程序在环境中可用的方式。
垫片本身是非常简单的包装器,它 exec
(执行)一个辅助程序 asdf exec
,向其传递插件的名称和垫片正在包装的已安装包中的可执行程序的路径。
asdf exec
辅助程序确定要使用的软件包版本(比如在 .tool-versions
文件中指定,通过 asdf local ...
或者 asdf global ...
命令选择)、软件包安装目录中的可执行程序的最终路径(这可以在插件中通过 exec-path
回调来操作)以及要在其中执行的环境(也由插件 - exec-env
脚本提供),最后完成执行。
注意
因为此系统使用 exec
调用,所以软件包中的任何脚本如果要由 shell 生效而不是执行的脚本都需要直接访问,而不是通过垫片包装器进行访问。两个 asdf
命令:which
和 where
可以通过返回已安装软件包的路径来帮助解决这个问题。
# 返回当前版本中主要可执行程序的路径
+source $(asdf which \${PLUGIN})/../script.sh
+
+# 返回软件包安装目录的路径
+source $(asdf where \${PLUGIN} $(asdf current \${PLUGIN}))/bin/script.sh
如果由于某种原因,你希望绕过 asdf 垫片,或者希望在进入项目目录时自动设置环境变量,则 asdf-direnv 插件可能会有所帮助。请务必查看其 README 文件了解更多详情。
`,45)]))}const c=i(t,[["render",n]]);export{o as __pageData,c as default}; diff --git a/assets/zh-hans_more_community-projects.md.yE4Odlba.js b/assets/zh-hans_more_community-projects.md.yE4Odlba.js new file mode 100644 index 00000000..2a171b46 --- /dev/null +++ b/assets/zh-hans_more_community-projects.md.yE4Odlba.js @@ -0,0 +1 @@ +import{_ as t,c as o,a2 as r,o as a}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"Community Projects","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/more/community-projects.md","filePath":"zh-hans/more/community-projects.md","lastUpdated":1687069487000}'),s={name:"zh-hans/more/community-projects.md"};function n(c,e,i,m,d,l){return a(),o("div",null,e[0]||(e[0]=[r('Here are some community projects related to asdf
:
Note
asdf core do not own these projects or their code. asdf core are not responsible for the quality or security as they relate to those listed here.
Here are some community projects related to asdf
:
Note
asdf core do not own these projects or their code. asdf core are not responsible for the quality or security as they relate to those listed here.
以下是 asdf
相关的一些常见问题。
WSL1 (Windows Subsystem for Linux 1) 不受官方支持。asdf
的某些方面可能无法正常工作。我们不打算添加对 WSL1 的官方支持。
WSL2 (Windows Subsystem for Linux 2) 应该作为你选择的 WSL 发行版来使用本设置和依赖说明。
重要的是,只有当前工作目录是 Unix 驱动器而不是绑定的 Windows 驱动器时,WSL2 才能 正常工作。
当 Github Actions 上提供主机运行器支持时,我们打算在 WSL2 上运行测试套件。(Github Actions 目前还未提供 WSL2 支持)
我执行了
npm install -g yarn
命令,但是之后不能运行yarn
命令。这是为什么?
asdf
使用 垫片 来管理可执行程序。插件所安装的那些命令会自动创建垫片,而通过 asdf
管理工具安装过的可执行程序则需要通知 asdf
创建垫片的需要。在这个例子中,为 Yarn 创建一个垫片即可。请查看 asdf reshim
命令文档 了解更多。
如果 asdf reshim
没有解决你的问题,那么很有可能是在 asdf.sh
或者 asdf.fish
的生效不在你的 Shell 配置文件(.bash_profile
、.zshrc
、config.fish
等等)的下方。这需要你在设置你的 $PATH
之后和生效你的框架(oh-my-zsh 等等)(如果有的话)之后再生效。
以下是 asdf
相关的一些常见问题。
WSL1 (Windows Subsystem for Linux 1) 不受官方支持。asdf
的某些方面可能无法正常工作。我们不打算添加对 WSL1 的官方支持。
WSL2 (Windows Subsystem for Linux 2) 应该作为你选择的 WSL 发行版来使用本设置和依赖说明。
重要的是,只有当前工作目录是 Unix 驱动器而不是绑定的 Windows 驱动器时,WSL2 才能 正常工作。
当 Github Actions 上提供主机运行器支持时,我们打算在 WSL2 上运行测试套件。(Github Actions 目前还未提供 WSL2 支持)
我执行了
npm install -g yarn
命令,但是之后不能运行yarn
命令。这是为什么?
asdf
使用 垫片 来管理可执行程序。插件所安装的那些命令会自动创建垫片,而通过 asdf
管理工具安装过的可执行程序则需要通知 asdf
创建垫片的需要。在这个例子中,为 Yarn 创建一个垫片即可。请查看 asdf reshim
命令文档 了解更多。
如果 asdf reshim
没有解决你的问题,那么很有可能是在 asdf.sh
或者 asdf.fish
的生效不在你的 Shell 配置文件(.bash_profile
、.zshrc
、config.fish
等等)的下方。这需要你在设置你的 $PATH
之后和生效你的框架(oh-my-zsh 等等)(如果有的话)之后再生效。
asdf 作者和贡献者的感谢页!
我 (@HashNuke),高烧、感冒、咳嗽。
版权 2014 直到时间尽头 (MIT License)
请查看 Github 上的 贡献者名单 🙏 了解更多。
',9)]))}const p=e(s,[["render",o]]);export{u as __pageData,p as default}; diff --git a/assets/zh-hans_more_thanks.md.Dyz87Q2k.lean.js b/assets/zh-hans_more_thanks.md.Dyz87Q2k.lean.js new file mode 100644 index 00000000..cfd2fadb --- /dev/null +++ b/assets/zh-hans_more_thanks.md.Dyz87Q2k.lean.js @@ -0,0 +1 @@ +import{_ as e,c as r,a2 as t,o as h}from"./chunks/framework.C9NVOr0y.js";const u=JSON.parse('{"title":"致谢","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/more/thanks.md","filePath":"zh-hans/more/thanks.md","lastUpdated":1671778129000}'),s={name:"zh-hans/more/thanks.md"};function o(l,a,n,i,d,c){return h(),r("div",null,a[0]||(a[0]=[t('asdf 作者和贡献者的感谢页!
我 (@HashNuke),高烧、感冒、咳嗽。
版权 2014 直到时间尽头 (MIT License)
请查看 Github 上的 贡献者名单 🙏 了解更多。
',9)]))}const p=e(s,[["render",o]]);export{u as __pageData,p as default}; diff --git a/assets/zh-hans_plugins_create.md.P38AmJ4g.js b/assets/zh-hans_plugins_create.md.P38AmJ4g.js new file mode 100644 index 00000000..6f9d055c --- /dev/null +++ b/assets/zh-hans_plugins_create.md.P38AmJ4g.js @@ -0,0 +1,35 @@ +import{_ as i,c as a,a2 as e,o as l}from"./chunks/framework.C9NVOr0y.js";const r=JSON.parse('{"title":"创建插件","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/plugins/create.md","filePath":"zh-hans/plugins/create.md","lastUpdated":1704804447000}'),n={name:"zh-hans/plugins/create.md"};function t(h,s,p,d,o,k){return l(),a("div",null,s[0]||(s[0]=[e(`插件是一个包含几个可执行脚本的 git 存储库,用于支持对某种语言或工具进行版本控制。这些脚本在执行 list-all
、install
或者 uninstall
命令时被执行。你可以设定或取消设定环境变量,并执行设置工具环境所需的任何操作。
bin/list-all
- 列举所有可安装的版本bin/download
- 下载指定版本的源代码或二进制文件bin/install
- 安装指定版本所有脚本除了 bin/list-all
之外对以下环境变量有权限进行操作:
ASDF_INSTALL_TYPE
- version
或者 ref
ASDF_INSTALL_VERSION
- 如果 ASDF_INSTALL_TYPE
是 version
,那么这将是版本号。否则它将传递为 git 的 ref。可能指向存储库的一个标签/提交/分支。ASDF_INSTALL_PATH
- 已经 安装到的目录(或 bin/install
脚本执行情况下 应该 安装到的目录)这些附加的环境变量将可用于 bin/install
脚本:
ASDF_CONCURRENCY
- 编译源代码时使用的内核数。对于配置 make -j
非常有用。ASDF_DOWNLOAD_PATH
- bin/download
脚本下载源代码或二进制文件的路径。这些附加的环境变量将可用于 bin/download
脚本:
ASDF_DOWNLOAD_PATH
- 源代码或二进制文件应该下载到的路径。必须打印一个带有空格分隔的版本列表的字符串,示例输出如下所示:
1.0.1 1.0.2 1.3.0 1.4
请注意,最新版本应列在最后,以便它看起来更接近用户的提示。这很有帮助,因为 list-all
命令会在自己的行打印每个版本。如果有很多版本,那么早期版本可能会不在屏幕上。
如果从网站上的发布页面拉取版本,建议尽可能不对版本进行排序。通常,版本已经按照正确的顺序排列,或者以相反的顺序排列,在这种情况下,像 tac
这样的东西就足够了。如果必须手动对版本进行排序,则不能依赖 sort -V
,因为 OSX 操作系统不支持。一种可以替代的排序功能是 更好的选择。
此脚本必须下载源代码或者二进制文件到 ASDF_DOWNLOAD_PATH
环境变量包含的路径。如果下载的源代码或者二进制文件是压缩的,则只有未压缩的源代码或二进制文件会放置在 ASDF_DOWNLOAD_PATH
目录中。
下载成功后脚本必须以 0
状态退出。如果下载失败,脚本必须以任何非零退出状态退出。
如果可能,脚本应该仅将文件放在 ASDF_DOWNLOAD_PATH
中。如果下载失败,则不应将任何文件放在目录中。
如果此脚本不存在,asdf 将假设存在 bin/install
脚本,将下载并安装该版本。asdf 仅在没有此脚本的情况下才能支持传统插件。所有插件都必须包含此脚本,最终将删除对传统插件的支持。
本脚本应在 ASDF_INSTALL_PATH
中安装版本。默认情况下,asdf 将为 $ASDF_INSTALL_PATH/bin
(可以通过可选的 bin/list-bin-paths 脚本自定义)目录中的任意文件创建垫片。
安装成功时,安装脚本应以 0
状态退出。如果安装失败,脚本应以任何非零退出状态退出。
如果可能,脚本应仅在安装脚本认为工具的生成和安装成功后,才将文件放在 ASDF_INSTALL_PATH
目录中。asdf 检查 ASDF_INSTALL_PATH
目录的 扩展 以确认是否安装了该工具版本。如果在安装过程开始时填充了 ASDF_INSTALL_PATH
目录,则在安装过程中在其他终端中运行的其他 asdf 命令可能会认为该工具版本已经安装,即使它还未完全安装。
如果你希望你的插件使用 asdf 0.7._ 及更早版本和 0.8._ 及更高版本,请检查是否存在 ASDF_DOWNLOAD_PATH
环境变量。如果未设置,请在 bin/install
脚本回调时下载源代码。如果设置,则假设 bin/downlaod
脚本已经下载源代码。
这不是一个回调脚本,而是一组回调脚本,每个脚本将打印不同的文档到 STDOUT。下面列出了可能的回调脚本。请注意,bin/help.overview
是一种特殊情况,因为必须存在才能为脚本显示任何帮助输出。
bin/help.overview
- 此脚本应该输出有关插件和所管理工具的一般描述。不应该打印任何标题,因为 asdf 将打印标题。输出可以是自由格式的文本,但理想情况下只有一个短段落。如果你希望 asdf 为你的插件提供帮助信息,则必须存在此脚本。所有其他的帮助回调脚本都是可选的。bin/help.deps
- 此脚本应该输出为操作系统量身定制的依赖项列表。每行一个依赖项。bin/help.config
- 此脚本应该打印对插件和工具可能有用的任何必需或可选配置。安装或编译该工具所需的任何环境变量或其他标志(尽可能针对用户的操作系统)。输出可以是自由格式的文本。bin/help.links
- 这应该是与插件和工具相关的链接列表(同样,尽可能针对当前操作系统量身定制)。每行一个链接。行的格式可以是 <title>: <link>
或只是 <link>
。这些脚本的每一个都应根据当前操作系统调整其输出。例如,在 Ubuntu 上,依赖脚本可以将依赖项输出为必须安装的 apt-get 包。设置变量时,脚本还应该根据设置变量 ASDF_INSTALL_VERSION
和 ASDF_INSTALL_TYPE
的值。它们是可选的,并不总是被设置。
帮助回调脚本不得输出核心 asdf-vm 文档中已涵盖的任何信息。不得出现一般的 asdf 使用信息。
如果实现了此回调,asdf 将使用它来确定工具的最新稳定版本,而不是尝试自行判断。asdf latest
通过查看由 list-all
回调打印的最新版本,在从输出中排除了几种类型的版本(如发布候选版本)之后推断出最新版本。当你的插件的 list-all
回调打印同一工具的不同变体并且最新版本不是你希望默认使用的变体的最新稳定版本时,这种默认行为是不可取的。例如,对于 Ruby,最新的稳定版本应该是 Ruby(MRI)的常规实现,但最后 list-all
回调打印的是 truffleruby 版本。
此回调使用单个 “过滤器” 字符串调用,因为它是唯一的参数。这应该用于过滤所有最新稳定版本。例如对于 Ruby,用户可以选择传入 jruby
以选择 jruby
的最新稳定版本。
列举指定工具版本的可执行程序。必须打印一个带有空格分隔的包含可执行文件的目录路径列表的字符串。路径必须相对于传递的安装路径。示例输出如下所示:
bin tools veggies
这将指示 asdf 为 <install-path>/bin
、<install-path>/tools
和 <install-path>/veggies
中的文件创建垫片。
如果未指定此脚本,asdf 将在安装中查找 bin
目录并为这些脚本创建垫片。
设置环境变量以运行包中的二进制文件。
获取工具的指定版本的可执行程序路径。必须打印具有相对可执行程序路径的字符串。这允许插件有条件地覆盖垫片指定的可执行程序路径,否则返回垫片指定的默认路径。
用法:
+ plugin/bin/exec-path <install-path> <command> <executable-path>
+
+例子调用:
+ ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"
+
+输出:
+ bin/foox
卸载某个工具的指定版本。
为此插件注册其他设置器文件。必须打印一个带有空格分隔的文件名列表的字符串。
.ruby-version .rvmrc
注意:这仅适用于在 ~/.asdfrc
配置文件中启用了 legacy_version_file
选项的用户。
这可用于进一步解析 asdf 找到的传统文件。如果 parse-legacy-file
未实现,asdf 将会简单读取文件来确定版本。脚本将传递文件路径作为其第一个参数。
这可用于在插件添加到 asdf 后运行任何安装后操作。
该脚本可以访问插件的安装路径(\${ASDF_PLUGIN_PATH}
)和源 URL(\${ASDF_PLUGIN_SOURCE_URL}
),如果有的话。
其他请参考相关钩子:
pre_asdf_plugin_add
pre_asdf_plugin_add_\${plugin_name}
post_asdf_plugin_add
post_asdf_plugin_add_\${plugin_name}
这可用于在 asdf 下载更新的插件后运行任何插件更新后操作。
该脚本可以访问插件的安装路径(\${ASDF_PLUGIN_PATH}
)、更新前的 git-ref(\${ASDF_PLUGIN_PREV_REF}
)和更新后的 git-ref(\${ASDF_PLUGIN_POST_REF}
)。
其他请参考相关钩子:
pre_asdf_plugin_update
pre_asdf_plugin_update_\${plugin_name}
post_asdf_plugin_update
post_asdf_plugin_update_\${plugin_name}
这可用于在从 asdf 中删除插件之前运行任何预删除操作。
该脚本可以访问安装插件的路径(\${ASDF_PLUGIN_PATH}
)。
其他请参考相关钩子:
pre_asdf_plugin_remove
pre_asdf_plugin_remove_\${plugin_name}
post_asdf_plugin_remove
post_asdf_plugin_remove_\${plugin_name}
插件可以通过提供 lib/commands/command*.bash
脚本或者可执行程序来定义新的 asdf 命令,这些脚本或可执行程序将使用插件名称作为 asdf 命令的子命令进行调用。
例如,假设一个 foo
插件有以下文件:
foo/
+ lib/commands/
+ command.bash
+ command-bat.bash
+ command-bat-man.bash
+ command-help.bash
用户现在可以执行:
$ asdf foo # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash\`
+$ asdf foo bar # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar\`
+$ asdf foo help # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash\`
+$ asdf foo bat man # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash\`
+$ asdf foo bat baz # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz\`
插件作者可以使用此功能来提供与其工具相关的实用命令,或者可以创建 asdf 本身的新命令扩展的插件。
调用时,如果扩展命令未设置其可执行位,则它们将作为 bash 脚本获取,且具有来自 $ASDF_DIR/lib/utils.bash
的所有可用功能。 此外,$ASDF_CMD_FILE
解析所获取文件的完整路径。 如果设置了可执行位,则只是执行它们并替换 asdf 执行。
这个功能的一个很好的例子是像 haxe
这样的插件。 它提供了 asdf haxe neko-dylibs-link
来修复 haxe 可执行文件期望找到相对于可执行目录的动态链接库的问题。
如果你的插件提供了 asdf 扩展命令,请务必在插件的 README 文件中提及。
请仅在真的需要时才使用此功能
asdf 允许自定义垫片模板。对于名为 foo
的可执行程序,如果有一个 shims/foo
的文件在插件中,那么 asdf 将复制这个文件替代使用标准垫片模板。
必须明智地使用这一点。对于目前的 AFAIK,它仅仅被使用在了 Elixir 插件中,因为一个可执行程序除了是可执行程序文件之外,还被读作为 Elixir 文件,这使得无法使用标准的 bash 垫片。
asdf
包含 plugin-test
命令用于测试插件。你可以像下面这样使用它:
asdf plugin test <plugin-name> <plugin-url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git-ref>] [test-command*]
只有前两个参数是必须的。 如果指定了 _version,则该工具将随指定版本一起安装。默认返回为 asdf latest <plugin-name>
。 如果指定了 git-ref,则插件将检查提交/分支/标签。这对于在该插件的 CI 上测试拉取请求非常有用。默认值是插件仓库的默认分支。
剩下的参数被视为要执行的命令,以确保安装的工具正常工作。通常情况下,它需要带 --version
或者 --help
。例如,要测试 NodeJS 插件,我们可以运行:
asdf plugin test nodejs https://github.com/asdf-vm/asdf-nodejs.git node --version
我们强烈建议你在 CI 环境中测试你的插件,并确保它可以在 Linux 和 OSX 上运行。
asdf-vm/actions 存储库为托管在 github 的项目提供了使用 Github Action 来测试插件的可能。
steps:
+ - name: asdf_plugin_test
+ uses: asdf-vm/actions/plugin-test@v1
+ with:
+ command: "my_tool --version"
+ env:
+ GITHUB_API_TOKEN: \${{ secrets.GITHUB_TOKEN }} # 自动提供
这是一个 .travis.yml
示例文件,请根据你的需要进行自定义:
language: c
+script: asdf plugin test nodejs $TRAVIS_BUILD_DIR 'node --version'
+before_script:
+ - git clone https://github.com/asdf-vm/asdf.git asdf
+ - . asdf/asdf.sh
+os:
+ - linux
+ - osx
注意: 当使用其他 CI 时,你将需要确认哪些变量映射到存储库路径。
你还可以选择将相对路径传递给 plugin-test
。
例如,如果在存储库目录中运行测试脚本:asdf plugin test nodejs . 'node --version'
。
如果你的插件的 list-all
依赖于访问 GitHub API,请确保在访问时提供授权令牌,否则你的测试可能会因频率限制而失败。
为此,创建一个仅具有 public_repo
权限的 新个人令牌。
然后,在 travis.ci 构建设置中添加一个名为 GITHUB_API_TOKEN
的 安全 环境变量。并且 绝对不要 在你的代码中公布你的 token。
最后,添加如下内容到 bin/list-all
:
cmd="curl -s"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"
asdf
可以通过指定插件存储库 url 轻松安装插件,比如 plugin add my-plugin https://github.com/user/asdf-my-plugin.git
。
为了使你的用户更轻松,你可以将插件添加到官方插件存储库中,以列出你的插件并使用较短的命令轻松安装,比如 asdf plugin add my-plugin
。
请查看插件存储库 asdf-vm/asdf-plugins 中的说明了解更多。
`,109)]))}const g=i(n,[["render",t]]);export{r as __pageData,g as default}; diff --git a/assets/zh-hans_plugins_create.md.P38AmJ4g.lean.js b/assets/zh-hans_plugins_create.md.P38AmJ4g.lean.js new file mode 100644 index 00000000..6f9d055c --- /dev/null +++ b/assets/zh-hans_plugins_create.md.P38AmJ4g.lean.js @@ -0,0 +1,35 @@ +import{_ as i,c as a,a2 as e,o as l}from"./chunks/framework.C9NVOr0y.js";const r=JSON.parse('{"title":"创建插件","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/plugins/create.md","filePath":"zh-hans/plugins/create.md","lastUpdated":1704804447000}'),n={name:"zh-hans/plugins/create.md"};function t(h,s,p,d,o,k){return l(),a("div",null,s[0]||(s[0]=[e(`插件是一个包含几个可执行脚本的 git 存储库,用于支持对某种语言或工具进行版本控制。这些脚本在执行 list-all
、install
或者 uninstall
命令时被执行。你可以设定或取消设定环境变量,并执行设置工具环境所需的任何操作。
bin/list-all
- 列举所有可安装的版本bin/download
- 下载指定版本的源代码或二进制文件bin/install
- 安装指定版本所有脚本除了 bin/list-all
之外对以下环境变量有权限进行操作:
ASDF_INSTALL_TYPE
- version
或者 ref
ASDF_INSTALL_VERSION
- 如果 ASDF_INSTALL_TYPE
是 version
,那么这将是版本号。否则它将传递为 git 的 ref。可能指向存储库的一个标签/提交/分支。ASDF_INSTALL_PATH
- 已经 安装到的目录(或 bin/install
脚本执行情况下 应该 安装到的目录)这些附加的环境变量将可用于 bin/install
脚本:
ASDF_CONCURRENCY
- 编译源代码时使用的内核数。对于配置 make -j
非常有用。ASDF_DOWNLOAD_PATH
- bin/download
脚本下载源代码或二进制文件的路径。这些附加的环境变量将可用于 bin/download
脚本:
ASDF_DOWNLOAD_PATH
- 源代码或二进制文件应该下载到的路径。必须打印一个带有空格分隔的版本列表的字符串,示例输出如下所示:
1.0.1 1.0.2 1.3.0 1.4
请注意,最新版本应列在最后,以便它看起来更接近用户的提示。这很有帮助,因为 list-all
命令会在自己的行打印每个版本。如果有很多版本,那么早期版本可能会不在屏幕上。
如果从网站上的发布页面拉取版本,建议尽可能不对版本进行排序。通常,版本已经按照正确的顺序排列,或者以相反的顺序排列,在这种情况下,像 tac
这样的东西就足够了。如果必须手动对版本进行排序,则不能依赖 sort -V
,因为 OSX 操作系统不支持。一种可以替代的排序功能是 更好的选择。
此脚本必须下载源代码或者二进制文件到 ASDF_DOWNLOAD_PATH
环境变量包含的路径。如果下载的源代码或者二进制文件是压缩的,则只有未压缩的源代码或二进制文件会放置在 ASDF_DOWNLOAD_PATH
目录中。
下载成功后脚本必须以 0
状态退出。如果下载失败,脚本必须以任何非零退出状态退出。
如果可能,脚本应该仅将文件放在 ASDF_DOWNLOAD_PATH
中。如果下载失败,则不应将任何文件放在目录中。
如果此脚本不存在,asdf 将假设存在 bin/install
脚本,将下载并安装该版本。asdf 仅在没有此脚本的情况下才能支持传统插件。所有插件都必须包含此脚本,最终将删除对传统插件的支持。
本脚本应在 ASDF_INSTALL_PATH
中安装版本。默认情况下,asdf 将为 $ASDF_INSTALL_PATH/bin
(可以通过可选的 bin/list-bin-paths 脚本自定义)目录中的任意文件创建垫片。
安装成功时,安装脚本应以 0
状态退出。如果安装失败,脚本应以任何非零退出状态退出。
如果可能,脚本应仅在安装脚本认为工具的生成和安装成功后,才将文件放在 ASDF_INSTALL_PATH
目录中。asdf 检查 ASDF_INSTALL_PATH
目录的 扩展 以确认是否安装了该工具版本。如果在安装过程开始时填充了 ASDF_INSTALL_PATH
目录,则在安装过程中在其他终端中运行的其他 asdf 命令可能会认为该工具版本已经安装,即使它还未完全安装。
如果你希望你的插件使用 asdf 0.7._ 及更早版本和 0.8._ 及更高版本,请检查是否存在 ASDF_DOWNLOAD_PATH
环境变量。如果未设置,请在 bin/install
脚本回调时下载源代码。如果设置,则假设 bin/downlaod
脚本已经下载源代码。
这不是一个回调脚本,而是一组回调脚本,每个脚本将打印不同的文档到 STDOUT。下面列出了可能的回调脚本。请注意,bin/help.overview
是一种特殊情况,因为必须存在才能为脚本显示任何帮助输出。
bin/help.overview
- 此脚本应该输出有关插件和所管理工具的一般描述。不应该打印任何标题,因为 asdf 将打印标题。输出可以是自由格式的文本,但理想情况下只有一个短段落。如果你希望 asdf 为你的插件提供帮助信息,则必须存在此脚本。所有其他的帮助回调脚本都是可选的。bin/help.deps
- 此脚本应该输出为操作系统量身定制的依赖项列表。每行一个依赖项。bin/help.config
- 此脚本应该打印对插件和工具可能有用的任何必需或可选配置。安装或编译该工具所需的任何环境变量或其他标志(尽可能针对用户的操作系统)。输出可以是自由格式的文本。bin/help.links
- 这应该是与插件和工具相关的链接列表(同样,尽可能针对当前操作系统量身定制)。每行一个链接。行的格式可以是 <title>: <link>
或只是 <link>
。这些脚本的每一个都应根据当前操作系统调整其输出。例如,在 Ubuntu 上,依赖脚本可以将依赖项输出为必须安装的 apt-get 包。设置变量时,脚本还应该根据设置变量 ASDF_INSTALL_VERSION
和 ASDF_INSTALL_TYPE
的值。它们是可选的,并不总是被设置。
帮助回调脚本不得输出核心 asdf-vm 文档中已涵盖的任何信息。不得出现一般的 asdf 使用信息。
如果实现了此回调,asdf 将使用它来确定工具的最新稳定版本,而不是尝试自行判断。asdf latest
通过查看由 list-all
回调打印的最新版本,在从输出中排除了几种类型的版本(如发布候选版本)之后推断出最新版本。当你的插件的 list-all
回调打印同一工具的不同变体并且最新版本不是你希望默认使用的变体的最新稳定版本时,这种默认行为是不可取的。例如,对于 Ruby,最新的稳定版本应该是 Ruby(MRI)的常规实现,但最后 list-all
回调打印的是 truffleruby 版本。
此回调使用单个 “过滤器” 字符串调用,因为它是唯一的参数。这应该用于过滤所有最新稳定版本。例如对于 Ruby,用户可以选择传入 jruby
以选择 jruby
的最新稳定版本。
列举指定工具版本的可执行程序。必须打印一个带有空格分隔的包含可执行文件的目录路径列表的字符串。路径必须相对于传递的安装路径。示例输出如下所示:
bin tools veggies
这将指示 asdf 为 <install-path>/bin
、<install-path>/tools
和 <install-path>/veggies
中的文件创建垫片。
如果未指定此脚本,asdf 将在安装中查找 bin
目录并为这些脚本创建垫片。
设置环境变量以运行包中的二进制文件。
获取工具的指定版本的可执行程序路径。必须打印具有相对可执行程序路径的字符串。这允许插件有条件地覆盖垫片指定的可执行程序路径,否则返回垫片指定的默认路径。
用法:
+ plugin/bin/exec-path <install-path> <command> <executable-path>
+
+例子调用:
+ ~/.asdf/plugins/foo/bin/exec-path "~/.asdf/installs/foo/1.0" "foo" "bin/foo"
+
+输出:
+ bin/foox
卸载某个工具的指定版本。
为此插件注册其他设置器文件。必须打印一个带有空格分隔的文件名列表的字符串。
.ruby-version .rvmrc
注意:这仅适用于在 ~/.asdfrc
配置文件中启用了 legacy_version_file
选项的用户。
这可用于进一步解析 asdf 找到的传统文件。如果 parse-legacy-file
未实现,asdf 将会简单读取文件来确定版本。脚本将传递文件路径作为其第一个参数。
这可用于在插件添加到 asdf 后运行任何安装后操作。
该脚本可以访问插件的安装路径(\${ASDF_PLUGIN_PATH}
)和源 URL(\${ASDF_PLUGIN_SOURCE_URL}
),如果有的话。
其他请参考相关钩子:
pre_asdf_plugin_add
pre_asdf_plugin_add_\${plugin_name}
post_asdf_plugin_add
post_asdf_plugin_add_\${plugin_name}
这可用于在 asdf 下载更新的插件后运行任何插件更新后操作。
该脚本可以访问插件的安装路径(\${ASDF_PLUGIN_PATH}
)、更新前的 git-ref(\${ASDF_PLUGIN_PREV_REF}
)和更新后的 git-ref(\${ASDF_PLUGIN_POST_REF}
)。
其他请参考相关钩子:
pre_asdf_plugin_update
pre_asdf_plugin_update_\${plugin_name}
post_asdf_plugin_update
post_asdf_plugin_update_\${plugin_name}
这可用于在从 asdf 中删除插件之前运行任何预删除操作。
该脚本可以访问安装插件的路径(\${ASDF_PLUGIN_PATH}
)。
其他请参考相关钩子:
pre_asdf_plugin_remove
pre_asdf_plugin_remove_\${plugin_name}
post_asdf_plugin_remove
post_asdf_plugin_remove_\${plugin_name}
插件可以通过提供 lib/commands/command*.bash
脚本或者可执行程序来定义新的 asdf 命令,这些脚本或可执行程序将使用插件名称作为 asdf 命令的子命令进行调用。
例如,假设一个 foo
插件有以下文件:
foo/
+ lib/commands/
+ command.bash
+ command-bat.bash
+ command-bat-man.bash
+ command-help.bash
用户现在可以执行:
$ asdf foo # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash\`
+$ asdf foo bar # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command.bash bar\`
+$ asdf foo help # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-help.bash\`
+$ asdf foo bat man # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man.bash\`
+$ asdf foo bat baz # 等同于运行 \`$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat.bash baz\`
插件作者可以使用此功能来提供与其工具相关的实用命令,或者可以创建 asdf 本身的新命令扩展的插件。
调用时,如果扩展命令未设置其可执行位,则它们将作为 bash 脚本获取,且具有来自 $ASDF_DIR/lib/utils.bash
的所有可用功能。 此外,$ASDF_CMD_FILE
解析所获取文件的完整路径。 如果设置了可执行位,则只是执行它们并替换 asdf 执行。
这个功能的一个很好的例子是像 haxe
这样的插件。 它提供了 asdf haxe neko-dylibs-link
来修复 haxe 可执行文件期望找到相对于可执行目录的动态链接库的问题。
如果你的插件提供了 asdf 扩展命令,请务必在插件的 README 文件中提及。
请仅在真的需要时才使用此功能
asdf 允许自定义垫片模板。对于名为 foo
的可执行程序,如果有一个 shims/foo
的文件在插件中,那么 asdf 将复制这个文件替代使用标准垫片模板。
必须明智地使用这一点。对于目前的 AFAIK,它仅仅被使用在了 Elixir 插件中,因为一个可执行程序除了是可执行程序文件之外,还被读作为 Elixir 文件,这使得无法使用标准的 bash 垫片。
asdf
包含 plugin-test
命令用于测试插件。你可以像下面这样使用它:
asdf plugin test <plugin-name> <plugin-url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git-ref>] [test-command*]
只有前两个参数是必须的。 如果指定了 _version,则该工具将随指定版本一起安装。默认返回为 asdf latest <plugin-name>
。 如果指定了 git-ref,则插件将检查提交/分支/标签。这对于在该插件的 CI 上测试拉取请求非常有用。默认值是插件仓库的默认分支。
剩下的参数被视为要执行的命令,以确保安装的工具正常工作。通常情况下,它需要带 --version
或者 --help
。例如,要测试 NodeJS 插件,我们可以运行:
asdf plugin test nodejs https://github.com/asdf-vm/asdf-nodejs.git node --version
我们强烈建议你在 CI 环境中测试你的插件,并确保它可以在 Linux 和 OSX 上运行。
asdf-vm/actions 存储库为托管在 github 的项目提供了使用 Github Action 来测试插件的可能。
steps:
+ - name: asdf_plugin_test
+ uses: asdf-vm/actions/plugin-test@v1
+ with:
+ command: "my_tool --version"
+ env:
+ GITHUB_API_TOKEN: \${{ secrets.GITHUB_TOKEN }} # 自动提供
这是一个 .travis.yml
示例文件,请根据你的需要进行自定义:
language: c
+script: asdf plugin test nodejs $TRAVIS_BUILD_DIR 'node --version'
+before_script:
+ - git clone https://github.com/asdf-vm/asdf.git asdf
+ - . asdf/asdf.sh
+os:
+ - linux
+ - osx
注意: 当使用其他 CI 时,你将需要确认哪些变量映射到存储库路径。
你还可以选择将相对路径传递给 plugin-test
。
例如,如果在存储库目录中运行测试脚本:asdf plugin test nodejs . 'node --version'
。
如果你的插件的 list-all
依赖于访问 GitHub API,请确保在访问时提供授权令牌,否则你的测试可能会因频率限制而失败。
为此,创建一个仅具有 public_repo
权限的 新个人令牌。
然后,在 travis.ci 构建设置中添加一个名为 GITHUB_API_TOKEN
的 安全 环境变量。并且 绝对不要 在你的代码中公布你的 token。
最后,添加如下内容到 bin/list-all
:
cmd="curl -s"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"
asdf
可以通过指定插件存储库 url 轻松安装插件,比如 plugin add my-plugin https://github.com/user/asdf-my-plugin.git
。
为了使你的用户更轻松,你可以将插件添加到官方插件存储库中,以列出你的插件并使用较短的命令轻松安装,比如 asdf plugin add my-plugin
。
请查看插件存储库 asdf-vm/asdf-plugins 中的说明了解更多。
`,109)]))}const g=i(n,[["render",t]]);export{r as __pageData,g as default}; diff --git a/contribute/core.html b/contribute/core.html new file mode 100644 index 00000000..13e8feda --- /dev/null +++ b/contribute/core.html @@ -0,0 +1,61 @@ + + + + + +The Multiple Runtime Version Manager
Manage all your runtime versions with one tool!
O Gerenciador de Múltiplas Versões de Tempo de Execução
Gerencie todas as suas versões de tempo de execução com uma ferramenta!