feat: Elvish Shell support (#1066)

This commit is contained in:
Elijah 2021-11-18 04:05:27 -06:00 committed by GitHub
parent 4b93bc81aa
commit cc7778a040
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 704 additions and 40 deletions

1
.gitattributes vendored
View File

@ -22,6 +22,7 @@
*.sh text *.sh text
*.bash text *.bash text
*.fish text *.fish text
*.elv text
#### asdf/bin/* explicitly define as text #### asdf/bin/* explicitly define as text
*asdf text *asdf text
*asdf-exec text *asdf-exec text

View File

@ -28,15 +28,22 @@ jobs:
- name: Install test dependencies - name: Install test dependencies
if: runner.os == 'macos' if: runner.os == 'macos'
run: brew install coreutils fish run: brew install coreutils fish elvish
- name: Install test dependencies - name: Install test dependencies
if: runner.os == 'linux' if: runner.os == 'linux'
run: | run: |
PPA="ppa:fish-shell/nightly-master" sudo add-apt-repository -y ppa:fish-shell/nightly-master
sudo add-apt-repository -y "$PPA"
sudo apt-get update sudo apt-get update
sudo apt-get -y install fish sudo apt-get -y install fish curl
# Download elvish binary and add to path
curl https://dl.elv.sh/linux-amd64/elvish-v0.16.3.tar.gz -o elvish-v0.16.3.tar.gz
tar xzf elvish-v0.16.3.tar.gz
rm elvish-v0.16.3.tar.gz
mkdir -p "$HOME/bin"
mv elvish-v0.16.3 "$HOME/bin/elvish"
echo "$HOME/bin" >>"$GITHUB_PATH"
- name: Install bats - name: Install bats
run: | run: |

5
.gitignore vendored
View File

@ -1,6 +1,7 @@
installs /installs
/downloads
/plugins /plugins
shims /shims
repository repository
.vagrant .vagrant
keyrings keyrings

View File

@ -13,7 +13,7 @@ asdf is a CLI tool that can manage multiple language runtime versions on a per-p
- support for existing config files `.node-version`, `.nvmrc`, `.ruby-version` for easy migration - support for existing config files `.node-version`, `.nvmrc`, `.ruby-version` for easy migration
- automatically switches runtime versions as you traverse your directories - automatically switches runtime versions as you traverse your directories
- simple plugin system to add support for your language of choice - simple plugin system to add support for your language of choice
- shell completion available for common shells (Bash, Zsh, Fish) - shell completion available for common shells (Bash, Zsh, Fish, Elvish)
## Documentation ## Documentation

244
asdf.elv Normal file
View File

@ -0,0 +1,244 @@
use re
use str
use path
var asdf_dir = $E:HOME'/.asdf'
if (and (has-env ASDF_DIR) (!=s $E:ASDF_DIR '')) {
asdf_dir = $E:ASDF_DIR
} else {
set-env ASDF_DIR $asdf_dir
}
var asdf_data_dir = $asdf_dir
if (and (has-env ASDF_DATA_DIR) (!=s $E:ASDF_DATA_DIR '')) {
asdf_data_dir = $E:ASDF_DATA_DIR
}
# Add function wrapper so we can export variables
fn asdf [command @args]{
if (==s $command 'shell') {
# set environment variables
parts = [($asdf_dir'/bin/asdf' export-shell-version elvish $@args)]
if (==s $parts[0] 'set-env') {
set-env $parts[1] $parts[2]
} elif (==s $parts[0] 'unset-env') {
unset-env $parts[1]
}
} else {
# forward other commands to asdf script
$asdf_dir'/bin/asdf' $command $@args
}
}
fn match [argz @pats]{
var matched = $true;
if (!= (count $argz) (count $pats)) {
matched = $false
} else {
for i [(range (count $pats))] {
pat = '^'$pats[$i]'$'
arg = $argz[$i]
if (not (re:match $pat $arg)) {
matched = $false
break
}
}
}
put $matched
}
fn ls-shims []{
ls $asdf_data_dir'/shims'
}
fn ls-executables []{
# Print all executable files and links in path
try {
find $@paths '(' -type f -o -type l ')' -print 2>/dev/null | each [p]{
try {
if (test -x $p) {
path:base $p
}
} except {
# don't fail if permission denied
}
}
} except {
# silence default non-zero exit status
}
}
fn ls-installed-versions [plugin_name]{
asdf list $plugin_name | each [version]{
put (re:replace '\s*(.*)\s*' '${1}' $version)
}
}
fn ls-all-versions [plugin_name]{
asdf list-all $plugin_name | each [version]{
put (re:replace '\s*(.*)\s*' '${1}' $version)
}
}
# Append ~/.asdf/bin and ~/.asdf/shims to PATH
for path [
$asdf_dir'/bin'
$asdf_data_dir'/shims'
] {
if (not (has-value $paths $path)) {
paths = [
$@paths
$path
]
}
}
# Setup argument completions
fn arg-completer [@argz]{
argz = $argz[1:-1] # strip 'asdf' and trailing empty string
var num = (count $argz)
if (== $num 0) {
# list all subcommands
find $asdf_dir'/lib/commands' -name 'command-*' | each [cmd]{
put (re:replace '.*/command-(.*)\.bash' '${1}' $cmd)
}
put 'plugin'
} else {
if (match $argz 'current') {
# asdf current <name>
asdf plugin-list
} elif (match $argz 'env') {
# asdf env <command>
ls-shims
} elif (match $argz 'env' '.*') {
# asdf env <command> [util]
ls-executables
} elif (match $argz 'exec') {
# asdf exec <command>
ls-shims
} elif (match $argz 'global') {
# asdf global <name>
asdf plugin-list
} elif (match $argz 'global' '.*') {
# asdf global <name> <version>
ls-installed-versions $argz[-1]
} elif (match $argz 'install') {
# asdf install <name>
asdf plugin-list
} elif (match $argz 'install' '.*') {
# asdf install <name> <version>
ls-all-versions $argz[-1]
} elif (match $argz 'install' '.*' '.*') {
# asdf install <name> <version> [--keep-download]
put '--keep-download'
} elif (match $argz 'latest') {
# asdf latest <name>
asdf plugin-list
} elif (match $argz 'latest' '.*') {
# asdf latest <name> [<version>]
ls-all-versions $argz[-1]
} elif (match $argz 'list-all') {
# asdf list all <name>
asdf plugin-list
} elif (match $argz 'list-all' '.*') {
# asdf list all <name> [<version>]
ls-all-versions $argz[-1]
} elif (match $argz 'list') {
# asdf list <name>
asdf plugin-list
} elif (match $argz 'list' '.*') {
# asdf list <name> [<version>]
ls-installed-versions $argz[-1]
} elif (match $argz 'local') {
# asdf local <name> [-p|--parent]
asdf plugin-list
put '-p'
put '--parent'
} elif (match $argz 'local' '(-p|(--parent))') {
# asdf local <name> [-p|--parent] <version>
asdf plugin-list
} elif (match $argz 'local' '.*') {
# asdf local <name> [-p|--parent]
# asdf local <name> <version>
ls-installed-versions $argz[-1]
put '-p'
put '--parent'
} elif (match $argz 'local' '(-p|(--parent))' '.*') {
# asdf local [-p|--parent] <name> <version>
ls-installed-versions $argz[-1]
} elif (match $argz 'local' '.*' '(-p|(--parent))') {
# asdf local <name> [-p|--parent] <version>
ls-installed-versions $argz[-2]
} elif (match $argz 'local' '.*' '.*') {
# asdf local <name> <version> [-p|--parent]
put '-p'
put '--parent'
} elif (or (match $argz 'plugin-add') (match $argz 'plugin' 'add')) {
# asdf plugin add <name>
asdf plugin-list-all | each [line]{
put (re:replace '([^\s]+)\s+.*' '${1}' $line)
}
} elif (or (match $argz 'plugin-list') (match $argz 'plugin' 'list')) {
# asdf plugin list
put '--urls'
put '--refs'
put 'all'
} elif (or (match $argz 'plugin-push') (match $argz 'plugin' 'push')) {
# asdf plugin push <name>
asdf plugin-list
} elif (or (match $argz 'plugin-remove') (match $argz 'plugin' 'remove')) {
# asdf plugin remove <name>
asdf plugin-list
} elif (and (>= (count $argz) 3) (match $argz[:3] 'plugin-test' '.*' '.*')) {
# asdf plugin-test <plugin-name> <plugin-url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git-ref>] [test-command*]
put '--asdf-plugin-gitref'
put '--asdf-tool-version'
ls-executables
ls-shims
} elif (and (>= (count $argz) 4) (match $argz[:4] 'plugin' 'test' '.*' '.*')) {
# asdf plugin test <plugin-name> <plugin-url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git-ref>] [test-command*]
put '--asdf-plugin-gitref'
put '--asdf-tool-version'
ls-executables
ls-shims
} elif (or (match $argz 'plugin-update') (match $argz 'plugin' 'update')) {
# asdf plugin update <name>
asdf plugin-list
put '--all'
} elif (match $argz 'plugin') {
# list plugin-* subcommands
find $asdf_dir'/lib/commands' -name 'command-plugin-*' | each [cmd]{
put (re:replace '.*/command-plugin-(.*)\.bash' '${1}' $cmd)
}
} elif (match $argz 'reshim') {
# asdf reshim <name>
asdf plugin-list
} elif (match $argz 'reshim' '.*') {
# asdf reshim <name> <version>
ls-installed-versions $argz[-1]
} elif (match $argz 'shim-versions') {
# asdf shim-versions <command>
ls-shims
} elif (match $argz 'uninstall') {
# asdf uninstall <name>
asdf plugin-list
} elif (match $argz 'uninstall' '.*') {
# asdf uninstall <name> <version>
ls-installed-versions $argz[-1]
} elif (match $argz 'update') {
if (== $num 1) {
# asdf update
put '--head'
}
} elif (match $argz 'where') {
# asdf where <name>
asdf plugin-list
} elif (match $argz 'where' '.*') {
# asdf where <name> [<version>]
ls-installed-versions $argz[-1]
} elif (match $argz 'which') {
ls-shims
}
}
}

View File

@ -2,9 +2,9 @@ set -x ASDF_DIR (dirname (status -f))
set -l asdf_user_shims ( set -l asdf_user_shims (
if test -n "$ASDF_DATA_DIR" if test -n "$ASDF_DATA_DIR"
echo $ASDF_DATA_DIR/shims printf "%s\n" "$ASDF_DATA_DIR/shims"
else else
echo $HOME/.asdf/shims printf "%s\n" "$HOME/.asdf/shims"
end end
) )

View File

@ -16,7 +16,7 @@ if [ -z "$ASDF_DIR" ]; then
fi fi
export ASDF_DIR export ASDF_DIR
# shellcheck disable=SC2016 # shellcheck disable=SC2016
[ -d "$ASDF_DIR" ] || echo '$ASDF_DIR is not a directory' [ -d "$ASDF_DIR" ] || printf '$ASDF_DIR is not a directory'
# Add asdf to PATH # Add asdf to PATH
# #

View File

@ -142,6 +142,46 @@ source /opt/asdf-vm/asdf.fish
Completions are automatically configured on installation by the AUR package. Completions are automatically configured on installation by the AUR package.
::: :::
::: details Elvish & Git
Add `asdf.elv` to your `~/.elvish/rc.elv` with:
```shell:no-line-numbers
mkdir -p ~/.elvish/lib; ln -s ~/.asdf/asdf.elv ~/.elvish/lib/asdf.elv
echo "\n"'use asdf _asdf; fn asdf [@args]{_asdf:asdf $@args}' >> ~/.elvish/rc.elv
echo "\n"'edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.elvish/rc.elv
```
Completions are automatically configured.
:::
::: details Elvish & Homebrew
Add `asdf.elv` to your `~/.elvish/rc.elv` with:
```shell:no-line-numbers
mkdir -p ~/.elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.elvish/lib/asdf.elv
echo "\n"'use asdf _asdf; fn asdf [@args]{_asdf:asdf $@args}' >> ~/.elvish/rc.elv
echo "\n"'edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.elvish/rc.elv
```
Completions are automatically configured.
:::
::: details Elvish & Pacman
Add `asdf.elv` to your `~/.elvish/rc.elv` with:
```shell:no-line-numbers
mkdir -p ~/.elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.elvish/lib/asdf.elv
echo "\n"'use asdf _asdf; fn asdf [@args]{_asdf:asdf $@args}' >> ~/.elvish/rc.elv
echo "\n"'edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.elvish/rc.elv
```
Completions are automatically configured.
:::
::: details ZSH & Git ::: details ZSH & Git
Add the following to `~/.zshrc`: Add the following to `~/.zshrc`:

View File

@ -19,7 +19,7 @@ features:
- title: "One Config File" - title: "One Config File"
details: ".tool-versions to manage all your tools, runtimes and their versions in a single, sharable place." details: ".tool-versions to manage all your tools, runtimes and their versions in a single, sharable place."
- title: "Shells" - title: "Shells"
details: "Supports Bash, ZSH & Fish with completions available." details: "Supports Bash, ZSH, Fish & Elvish with completions available."
- title: "GitHub Actions" - title: "GitHub Actions"
details: "Provides a GitHub Action to install and utilize your .tool-versions in your CI/CD workflows." details: "Provides a GitHub Action to install and utilize your .tool-versions in your CI/CD workflows."
# footer: MIT Licensed # footer: MIT Licensed

View File

@ -101,7 +101,7 @@ Configure the duration since the last asdf plugin repository sync to the next. C
- `ASDF_CONFIG_FILE` - Defaults to `~/.asdfrc` as described above. Can be set to any location. - `ASDF_CONFIG_FILE` - Defaults to `~/.asdfrc` as described above. Can be set to any location.
- `ASDF_DEFAULT_TOOL_VERSIONS_FILENAME` - The filename of the file storing the tool names and versions. Defaults to `.tool-versions`. Can be any valid filename. Typically you should not override the default value unless you know you want asdf to ignore `.tool-versions` files. - `ASDF_DEFAULT_TOOL_VERSIONS_FILENAME` - The filename of the file storing the tool names and versions. Defaults to `.tool-versions`. Can be any valid filename. Typically you should not override the default value unless you know you want asdf to ignore `.tool-versions` files.
- `ASDF_DIR` - Defaults to `~/.asdf` - Location of the `asdf` scripts. If you install `asdf` to some other directory, set this to that directory. For example, if you are installing via the AUR, you should set this to `/opt/asdf-vm`. - `ASDF_DIR` - Defaults to `~/.asdf` - Location of the `asdf` scripts. If you install `asdf` to some other directory, set this to that directory. For example, if you are installing via the AUR, you should set this to `/opt/asdf-vm`.
- `ASDF_DATA_DIR` - Defaults to `~/.asdf` - Location where `asdf` install plugins, shims and installs. Can be set to any location before sourcing `asdf.sh` or `asdf.fish` mentioned in the section above. - `ASDF_DATA_DIR` - Defaults to `~/.asdf` - Location where `asdf` install plugins, shims and installs. Can be set to any location before sourcing `asdf.sh` or `asdf.fish` mentioned in the section above. For Elvish, this can be set above `use asdf`.
## Internal Configuration ## Internal Configuration

View File

@ -257,6 +257,99 @@ rm -rf $HOME/.tool-versions $HOME/.asdfrc
::: :::
::: details Elvish & Git
1. In your `~/.elvish/rc.elv` remove the lines that use the `asdf` module:
```shell
use asdf _asdf; fn asdf [@args]{_asdf:asdf $@args}
edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
```
and uninstall the `asdf` module with this command:
```shell:no-line-numbers
rm -f ~/.elvish/lib/asdf.elv
```
2. Remove the `$HOME/.asdf` dir:
```shell:no-line-numbers
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
```
3. Run this command to remove all `asdf` config files:
```shell:no-line-numbers
rm -rf $HOME/.tool-versions $HOME/.asdfrc
```
:::
::: details Elvish & Homebrew
1. In your `~/.elvish/rc.elv` remove the lines that use the `asdf` module:
```shell
use asdf _asdf; fn asdf [@args]{_asdf:asdf $@args}
edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
```
and uninstall the `asdf` module with this command:
```shell:no-line-numbers
rm -f ~/.elvish/lib/asdf.elv
```
2. Uninstall with your package manager:
```shell:no-line-numbers
brew uninstall asdf --force
```
3. Run this command to remove all `asdf` config files:
```shell:no-line-numbers
rm -rf $HOME/.tool-versions $HOME/.asdfrc
```
:::
::: details Elvish & Pacman
1. In your `~/.elvish/rc.elv` remove the lines that use the `asdf` module:
```shell
use asdf _asdf; fn asdf [@args]{_asdf:asdf $@args}
edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
```
and uninstall the `asdf` module with this command:
```shell:no-line-numbers
rm -f ~/.elvish/lib/asdf.elv
```
2. Uninstall with your package manager:
```shell:no-line-numbers
pacman -Rs asdf-vm
```
3. Remove the `$HOME/.asdf` dir:
```shell:no-line-numbers
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
```
4. Run this command to remove all `asdf` config files:
```shell:no-line-numbers
rm -rf $HOME/.tool-versions $HOME/.asdfrc
```
:::
::: details ZSH & Git ::: details ZSH & Git
1. In your `~/.zshrc` remove the lines that source `asdf.sh` and completions: 1. In your `~/.zshrc` remove the lines that source `asdf.sh` and completions:

View File

@ -132,7 +132,7 @@ asdf uninstall <name> <version>
## Shims ## Shims
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` or `asdf.fish`) is how the installed programs are made available in the environment. 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 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.

View File

@ -146,6 +146,46 @@ source /opt/asdf-vm/asdf.fish
O auto completar é configurado automaticamente durante a instalação do pacote AUR. O auto completar é configurado automaticamente durante a instalação do pacote AUR.
::: :::
::: details Elvish & Git
Add `asdf.elv` to your `~/.elvish/rc.elv` with:
```shell:no-line-numbers
mkdir -p ~/.elvish/lib; ln -s ~/.asdf/asdf.elv ~/.elvish/lib/asdf.elv
echo "\n"'use asdf _asdf; fn asdf [@args]{_asdf:asdf $@args}' >> ~/.elvish/rc.elv
echo "\n"'edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.elvish/rc.elv
```
Completions are automatically configured.
:::
::: details Elvish & Homebrew
Add `asdf.elv` to your `~/.elvish/rc.elv` with:
```shell:no-line-numbers
mkdir -p ~/.elvish/lib; ln -s (brew --prefix asdf)/libexec/asdf.elv ~/.elvish/lib/asdf.elv
echo "\n"'use asdf _asdf; fn asdf [@args]{_asdf:asdf $@args}' >> ~/.elvish/rc.elv
echo "\n"'edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.elvish/rc.elv
```
Completions are automatically configured.
:::
::: details Elvish & Pacman
Add `asdf.elv` to your `~/.elvish/rc.elv` with:
```shell:no-line-numbers
mkdir -p ~/.elvish/lib; ln -s /opt/asdf-vm/asdf.elv ~/.elvish/lib/asdf.elv
echo "\n"'use asdf _asdf; fn asdf [@args]{_asdf:asdf $@args}' >> ~/.elvish/rc.elv
echo "\n"'edit:completion:arg-completer[asdf] = $_asdf:arg-completer~' >> ~/.elvish/rc.elv
```
Completions are automatically configured.
:::
::: details ZSH & Git ::: details ZSH & Git
Adicione a seguinte linha ao seu `~/.zshrc`: Adicione a seguinte linha ao seu `~/.zshrc`:

View File

@ -19,7 +19,7 @@ features:
- title: "Só um arquivo de configuração" - title: "Só um arquivo de configuração"
details: ".tool-versions para gerenciar todas as suas ferramentas, runtimes e suas versões em um único arquivo" details: ".tool-versions para gerenciar todas as suas ferramentas, runtimes e suas versões em um único arquivo"
- title: "Shells" - title: "Shells"
details: "Suporta Bash, ZSH & Fish com autocomplete." details: "Suporta Bash, ZSH, Fish & Elvish com autocomplete."
- title: "GitHub Actions" - title: "GitHub Actions"
details: "Fornece um GitHub Action para instalar e utilizar seu .tool-verions em seu fluxo de trabalho CICD." details: "Fornece um GitHub Action para instalar e utilizar seu .tool-verions em seu fluxo de trabalho CICD."
# footer: MIT Licensed # footer: MIT Licensed

View File

@ -1,27 +1,25 @@
# Perguntas frequentes # Perguntas frequentes
> 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. Aqui estão algumas perguntas comuns sobre `asdf`.
Here are some common questions regarding `asdf`. ## Suporte WSL1?
## WSL1 support? WSL1 ([Windows Subsystem for Linux](https://en.wikipedia.org/wiki/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.
WSL1 ([Windows Subsystem for Linux](https://en.wikipedia.org/wiki/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. ## Suporte WSL2?
## WSL2 support? WSL2 ([Subsistema Windows para Linux](https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux#WSL_2) 2) deve funcionar usando as instruções de configuração e dependência para a distribuição WSL escolhida.
WSL2 ([Windows Subsystem for Linux](https://en.wikipedia.org/wiki/Windows_Subsystem_for_Linux#WSL_2) 2) should work using the setup & dependency instructions for you chosen WSL distro. É 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.
Importantly, WSL2 is _only_ expected to work properly when the current working directory is a Unix drive and not a bound Windows drive. 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.
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. ## Exectable recém-instalado não está funcionando?
## Newly installed exectable not running? > Acabei de instalar o `npm -g yarn`, mas não consigo executar o `yarn`. O que da?
> I just `npm install -g yarn`, but cannot execute `yarn`. What gives? `asdf` usa [shims](<https://en.wikipedia.org/wiki/Shim_(computing)>) 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 o` asdf` sobre a necessidade de criar shims. Neste caso, para criar um shim para [Yarn](https://yarnpkg.com/). Veja a documentação do comando [`asdf reshim`](/ manage / core.md # reshim).
`asdf` uses [shims](<https://en.wikipedia.org/wiki/Shim_(computing)>) 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](https://yarnpkg.com/). See the [`asdf reshim` command docs](/manage/core.md#reshim). ## Shell não detecta shims recém-instalados?
## Shell not detecting newly installed shims? Se `asdf reshim` não está resolvendo seu problema, então é mais provável devido ao sourcing de` asdf.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.
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.

View File

@ -59,4 +59,4 @@ legacy_version_file = yes
- `ASDF_CONFIG_FILE` - O padrão é `~ / .asdfrc` conforme descrito acima. Pode ser definido para qualquer local. - `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_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_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. - `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`.

View File

@ -259,6 +259,99 @@ rm -rf $HOME/.tool-versions $HOME/.asdfrc
::: :::
::: details Elvish & Git
1. Em seu `~/.elvish/rc.elv` remova as linhas que importa o módulo `asdf`:
```shell
use asdf _asdf; fn asdf [@args]{_asdf:asdf $@args}
edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
```
e desinstale o módulo `asdf` com este comando:
```shell:no-line-numbers
rm -f ~/.elvish/lib/asdf.elv
```
2. Remova o diretório `$HOME/.asdf`:
```shell:no-line-numbers
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
```
3. Execute este comando para remover todos os arquivos de configuração `asdf`:
```shell:no-line-numbers
rm -rf $HOME/.tool-versions $HOME/.asdfrc
```
:::
::: details Elvish & Homebrew
1. Em seu `~/.elvish/rc.elv` remova as linhas que importa o módulo `asdf`:
```shell
use asdf _asdf; fn asdf [@args]{_asdf:asdf $@args}
edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
```
e desinstale o módulo `asdf` com este comando:
```shell:no-line-numbers
rm -f ~/.elvish/lib/asdf.elv
```
2. Desinstale com seu gerenciador de pacotes:
```shell:no-line-numbers
brew uninstall asdf --force
```
3. Execute este comando para remover todos os arquivos de configuração `asdf`:
```shell:no-line-numbers
rm -rf $HOME/.tool-versions $HOME/.asdfrc
```
:::
::: details Elvish & Pacman
1. Em seu `~/.elvish/rc.elv` remova as linhas que importa o módulo `asdf`:
```shell
use asdf _asdf; fn asdf [@args]{_asdf:asdf $@args}
edit:completion:arg-completer[asdf] = $_asdf:arg-completer~
```
e desinstale o módulo `asdf` com este comando:
```shell:no-line-numbers
rm -f ~/.elvish/lib/asdf.elv
```
2. Desinstale com seu gerenciador de pacotes:
```shell:no-line-numbers
pacman -Rs asdf-vm
```
3. Remova o diretório `$ HOME/.asdf`:
```shell:no-line-numbers
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
```
4. Execute este comando para remover todos os arquivos de configuração `asdf`:
```shell:no-line-numbers
rm -rf $HOME/.tool-versions $HOME/.asdfrc
```
:::
::: details ZSH & Git ::: details ZSH & Git
1. Em seu `~/.zshrc` remova as linhas do `asdf.sh` e seus complementos: 1. Em seu `~/.zshrc` remova as linhas do `asdf.sh` e seus complementos:

View File

@ -133,7 +133,7 @@ asdf uninstall <name> <version>
## Shims ## Shims
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` ou `asdf.fish`) é como o programa instalado é disponibilizado no ambiente do sistema. 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. 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.

View File

@ -23,6 +23,12 @@ shell_command() {
fish) fish)
printf "set -e %s\\n" "$version_env_var" printf "set -e %s\\n" "$version_env_var"
;; ;;
elvish)
# Elvish doesn't have a `source` command, and eval is banned, so the
# var name and value are printed on separate lines for asdf.elv to parse
# and pass to unset-env.
printf "unset-env\n%s" "$version_env_var"
;;
*) *)
printf "unset %s\\n" "$version_env_var" printf "unset %s\\n" "$version_env_var"
;; ;;
@ -42,6 +48,12 @@ shell_command() {
fish) fish)
printf "set -gx %s \"%s\"\\n" "$version_env_var" "$version" printf "set -gx %s \"%s\"\\n" "$version_env_var" "$version"
;; ;;
elvish)
# Elvish doesn't have a `source` command, and eval is banned, so the
# var name and value are printed on separate lines for asdf.elv to parse
# and pass to set-env.
printf "set-env\n%s\n%s" "$version_env_var" "$version"
;;
*) *)
printf "export %s=\"%s\"\\n" "$version_env_var" "$version" printf "export %s=\"%s\"\\n" "$version_env_var" "$version"
;; ;;

98
test/asdf_elvish.bats Normal file
View File

@ -0,0 +1,98 @@
#!/usr/bin/env bats
load test_helpers
setup() {
cd $(dirname "$BATS_TEST_DIRNAME")
mkdir -p $HOME/.elvish/lib
cp ./asdf.elv $HOME/.elvish/lib/asdftest.elv
}
teardown() {
rm $HOME/.elvish/lib/asdftest.elv
}
cleaned_path() {
echo $PATH | tr ':' '\n' | grep -v "asdf" | tr '\n' ' '
}
@test "exports ASDF_DIR" {
output=$(elvish -norc -c "
unset-env ASDF_DIR
paths = [$(cleaned_path)]
use asdftest _asdf; fn asdf [@args]{_asdf:asdf \$@args}
echo \$E:ASDF_DIR
")
[ "$?" -eq 0 ]
[ "$output" = "$HOME/.asdf" ]
}
@test "retains ASDF_DIR" {
output=$(elvish -norc -c "
set-env ASDF_DIR "/path/to/asdf"
paths = [$(cleaned_path)]
use asdftest _asdf; fn asdf [@args]{_asdf:asdf \$@args}
echo \$E:ASDF_DIR
")
[ "$?" -eq 0 ]
[ "$output" = "/path/to/asdf" ]
}
@test "retains ASDF_DATA_DIR" {
output=$(elvish -norc -c "
set-env ASDF_DATA_DIR "/path/to/asdf-data"
paths = [$(cleaned_path)]
use asdftest _asdf; fn asdf [@args]{_asdf:asdf \$@args}
echo \$E:ASDF_DATA_DIR
")
[ "$?" -eq 0 ]
[ "$output" = "/path/to/asdf-data" ]
}
@test "adds asdf dirs to PATH" {
result=$(elvish -norc -c "
unset-env ASDF_DIR
paths = [$(cleaned_path)]
use asdftest _asdf; fn asdf [@args]{_asdf:asdf \$@args}
echo \$E:PATH
")
[ "$?" -eq 0 ]
echo "$result"
output=$(echo "$result" | grep "asdf")
[ "$output" != "" ]
}
@test "defines the _asdf namespace" {
output=$(elvish -norc -c "
unset-env ASDF_DIR
paths = [$(cleaned_path)]
use asdftest _asdf; fn asdf [@args]{_asdf:asdf \$@args}
pprint \$_asdf:
")
[ "$?" -eq 0 ]
[[ "$output" =~ "<ns " ]]
}
@test "defines the asdf function" {
output=$(elvish -norc -c "
unset-env ASDF_DIR
paths = [$(cleaned_path)]
use asdftest _asdf; fn asdf [@args]{_asdf:asdf \$@args}
pprint \$asdf~
")
[ "$?" -eq 0 ]
echo "$output"
[[ "$output" =~ "<closure " ]]
}
@test "function calls asdf command" {
result=$(elvish -norc -c "
set-env ASDF_DIR $(pwd)
paths = [$(cleaned_path)]
use asdftest _asdf; fn asdf [@args]{_asdf:asdf \$@args}
asdf info
")
[ "$?" -eq 0 ]
output=$(echo "$result" | grep "ASDF INSTALLED PLUGINS:")
[ "$output" != "" ]
}

View File

@ -11,7 +11,7 @@ cleaned_path() {
} }
@test "exports ASDF_DIR" { @test "exports ASDF_DIR" {
result=$(fish -c " output=$(fish -c "
set -e asdf set -e asdf
set -e ASDF_DIR set -e ASDF_DIR
set -e ASDF_DATA_DIR set -e ASDF_DATA_DIR
@ -20,9 +20,8 @@ cleaned_path() {
. asdf.fish . asdf.fish
echo \$ASDF_DIR echo \$ASDF_DIR
") ")
[ "$?" -eq 0 ] [ "$?" -eq 0 ]
[ "$result" != "" ] [ "$output" != "" ]
} }
@test "adds asdf dirs to PATH" { @test "adds asdf dirs to PATH" {
@ -35,9 +34,8 @@ cleaned_path() {
. (pwd)/asdf.fish # if the full path is not passed, status -f will return the relative path . (pwd)/asdf.fish # if the full path is not passed, status -f will return the relative path
echo \$PATH echo \$PATH
") ")
output=$(echo "$result" | grep "asdf")
[ "$?" -eq 0 ] [ "$?" -eq 0 ]
output=$(echo "$result" | grep "asdf")
[ "$output" != "" ] [ "$output" != "" ]
} }
@ -52,9 +50,8 @@ cleaned_path() {
. asdf.fish . asdf.fish
echo \$PATH echo \$PATH
") ")
output=$(echo $PATH | tr ':' '\n' | grep "asdf" | sort | uniq -d)
[ "$?" -eq 0 ] [ "$?" -eq 0 ]
output=$(echo $PATH | tr ':' '\n' | grep "asdf" | sort | uniq -d)
[ "$output" = "" ] [ "$output" = "" ]
} }
@ -67,7 +64,21 @@ cleaned_path() {
. asdf.fish . asdf.fish
type asdf type asdf
") ")
[ "$?" -eq 0 ]
echo $output
[[ "$output" =~ "is a function" ]] [[ "$output" =~ "is a function" ]]
} }
@test "function calls asdf command" {
result=$(fish -c "
set -e asdf
set -x ASDF_DIR $(pwd)
set PATH $(cleaned_path)
. asdf.fish
asdf info
")
[ "$?" -eq 0 ]
output=$(echo "$result" | grep "ASDF INSTALLED PLUGINS:")
[ "$output" != "" ]
}

View File

@ -69,3 +69,17 @@ cleaned_path() {
[[ "$output" =~ "is a function" ]] [[ "$output" =~ "is a function" ]]
} }
@test "function calls asdf command" {
result=$(
unset -f asdf
ASDF_DIR=$(pwd)
PATH=$(cleaned_path)
source_asdf_sh
asdf info
)
[ "$?" -eq 0 ]
output=$(echo "$result" | grep "ASDF INSTALLED PLUGINS:")
[ "$output" != "" ]
}

View File

@ -45,7 +45,7 @@ teardown() {
# Also ignore matches that are contained in comments or a string or # Also ignore matches that are contained in comments or a string or
# followed by an underscore (indicating it's a variable and not a # followed by an underscore (indicating it's a variable and not a
# command). # command).
run bash -c "grep -nHR '$cmd' lib bin\ run bash -c "grep -nHR '$cmd' asdf.* lib bin\
| grep -v '#.*$cmd'\ | grep -v '#.*$cmd'\
| grep -v '\".*$cmd.*\"' \ | grep -v '\".*$cmd.*\"' \
| grep -v '${cmd}_'\ | grep -v '${cmd}_'\

View File

@ -374,6 +374,12 @@ false"
[ "$output" = "set -gx ASDF_DUMMY_VERSION \"1.1.0\"" ] [ "$output" = "set -gx ASDF_DUMMY_VERSION \"1.1.0\"" ]
} }
@test "export-shell-version should use set-env when shell is elvish" {
run asdf export-shell-version elvish "dummy" "1.1.0"
[ "$status" -eq 0 ]
[ "$output" = $'set-env\nASDF_DUMMY_VERSION\n1.1.0' ]
}
@test "export-shell-version should unset when --unset flag is passed" { @test "export-shell-version should unset when --unset flag is passed" {
run asdf export-shell-version sh "dummy" "--unset" run asdf export-shell-version sh "dummy" "--unset"
[ "$status" -eq 0 ] [ "$status" -eq 0 ]
@ -386,6 +392,12 @@ false"
[ "$output" = "set -e ASDF_DUMMY_VERSION" ] [ "$output" = "set -e ASDF_DUMMY_VERSION" ]
} }
@test "export-shell-version should use unset-env when --unset flag is passed and shell is elvish" {
run asdf export-shell-version elvish "dummy" "--unset"
[ "$status" -eq 0 ]
[ "$output" = $'unset-env\nASDF_DUMMY_VERSION' ]
}
@test "[shell - dummy_plugin] wrapper function should support latest" { @test "[shell - dummy_plugin] wrapper function should support latest" {
. $(dirname "$BATS_TEST_DIRNAME")/asdf.sh . $(dirname "$BATS_TEST_DIRNAME")/asdf.sh
asdf shell "dummy" "latest" asdf shell "dummy" "latest"