commit fef8bdafae34225a90c709478f584311640c2570 Author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed Dec 18 20:10:43 2024 +0000 Deploy to GitHub pages diff --git a/404.html b/404.html new file mode 100644 index 00000000..5681025e --- /dev/null +++ b/404.html @@ -0,0 +1,22 @@ + + + + + + 404 | asdf + + + + + + + + + + + +
+ + + + \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..b850b998 --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +asdf-vm.com \ No newline at end of file diff --git a/assets/app.BjlyxdH5.js b/assets/app.BjlyxdH5.js new file mode 100644 index 00000000..ceb6b864 --- /dev/null +++ b/assets/app.BjlyxdH5.js @@ -0,0 +1 @@ +import{t as i}from"./chunks/theme.Cb3KoOiM.js";import{R as o,a3 as u,a4 as c,a5 as l,a6 as f,a7 as d,a8 as m,a9 as h,aa as g,ab as A,ac as v,d as P,u as y,v as C,s as b,ad as w,ae as R,af as E,ag as S}from"./chunks/framework.BQmytedh.js";function p(e){if(e.extends){const a=p(e.extends);return{...a,...e,async enhanceApp(t){a.enhanceApp&&await a.enhanceApp(t),e.enhanceApp&&await e.enhanceApp(t)}}}return e}const s=p(i),T=P({name:"VitePressApp",setup(){const{site:e,lang:a,dir:t}=y();return C(()=>{b(()=>{document.documentElement.lang=a.value,document.documentElement.dir=t.value})}),e.value.router.prefetchLinks&&w(),R(),E(),s.setup&&s.setup(),()=>S(s.Layout)}});async function D(){globalThis.__VITEPRESS__=!0;const e=j(),a=_();a.provide(c,e);const t=l(e.route);return a.provide(f,t),a.component("Content",d),a.component("ClientOnly",m),Object.defineProperties(a.config.globalProperties,{$frontmatter:{get(){return t.frontmatter.value}},$params:{get(){return t.page.value.params}}}),s.enhanceApp&&await s.enhanceApp({app:a,router:e,siteData:h}),{app:a,router:e,data:t}}function _(){return g(T)}function j(){let e=o,a;return A(t=>{let n=v(t),r=null;return n&&(e&&(a=n),(e||a===n)&&(n=n.replace(/\.js$/,".lean.js")),r=import(n)),o&&(e=!1),r},s.NotFound)}o&&D().then(({app:e,router:a,data:t})=>{a.go().then(()=>{u(a.route,t.site),e.mount("#app")})});export{D as createApp}; diff --git a/assets/chunks/@localSearchIndexja-jp.3a-2EviV.js b/assets/chunks/@localSearchIndexja-jp.3a-2EviV.js new file mode 100644 index 00000000..b11e16a5 --- /dev/null +++ b/assets/chunks/@localSearchIndexja-jp.3a-2EviV.js @@ -0,0 +1 @@ +const t='{"documentCount":131,"nextId":131,"documentIds":{"0":"/ja-jp/contribute/core.html#asdf","1":"/ja-jp/contribute/core.html#初期セットアップ","2":"/ja-jp/contribute/core.html#開発","3":"/ja-jp/contribute/core.html#gitignore","4":"/ja-jp/contribute/core.html#git-blame-ignore-revs","5":"/ja-jp/contribute/core.html#batsテスト","6":"/ja-jp/contribute/core.html#batsのヒント","7":"/ja-jp/contribute/core.html#プルリクエスト、リリース、conventional-commits","8":"/ja-jp/contribute/core.html#dockerイメージ","9":"/ja-jp/contribute/documentation.html#ドキュメント-サイト","10":"/ja-jp/contribute/documentation.html#初期セットアップ","11":"/ja-jp/contribute/documentation.html#開発","12":"/ja-jp/contribute/documentation.html#プルリクエスト、リリース、conventional-commits","13":"/ja-jp/contribute/documentation.html#vitepress","14":"/ja-jp/contribute/documentation.html#i18n","15":"/ja-jp/contribute/first-party-plugins.html#公式プラグイン","16":"/ja-jp/contribute/github-actions.html#github-actions","17":"/ja-jp/guide/getting-started.html#はじめよう","18":"/ja-jp/guide/getting-started.html#_1-依存関係のインストール","19":"/ja-jp/guide/getting-started.html#_2-asdfのダウンロード","20":"/ja-jp/guide/getting-started.html#公式ダウンロード","21":"/ja-jp/guide/getting-started.html#コミュニティがサポートするダウンロード方法","22":"/ja-jp/guide/getting-started.html#_3-asdfのインストール","23":"/ja-jp/guide/getting-started.html#コアのインストールが完了","24":"/ja-jp/guide/getting-started.html#_4-プラグインのインストール","25":"/ja-jp/guide/getting-started.html#プラグインの依存関係","26":"/ja-jp/guide/getting-started.html#プラグインのインストール","27":"/ja-jp/guide/getting-started.html#_5-特定のバージョンのインストール","28":"/ja-jp/guide/getting-started.html#_6-バージョンをセット","29":"/ja-jp/guide/getting-started.html#グローバル","30":"/ja-jp/guide/getting-started.html#ローカル","31":"/ja-jp/guide/getting-started.html#ツールごとに用意された既存バージョンファイルの利用","32":"/ja-jp/guide/getting-started.html#入門完了","33":"/ja-jp/guide/introduction.html#イントロダクション","34":"/ja-jp/guide/introduction.html#どうやって動いているの","35":"/ja-jp/guide/introduction.html#関連プロジェクト","36":"/ja-jp/guide/introduction.html#nvm-n-rbenv-etc","37":"/ja-jp/guide/introduction.html#direnv","38":"/ja-jp/guide/introduction.html#homebrew","39":"/ja-jp/guide/introduction.html#nixos","40":"/ja-jp/guide/introduction.html#なぜasdfを使うの","41":"/ja-jp/manage/commands.html#すべてのコマンド","42":"/ja-jp/manage/configuration.html#構成設定","43":"/ja-jp/manage/configuration.html#tool-versions","44":"/ja-jp/manage/configuration.html#asdfrc","45":"/ja-jp/manage/configuration.html#legacy-version-file","46":"/ja-jp/manage/configuration.html#use-release-candidates","47":"/ja-jp/manage/configuration.html#always-keep-download","48":"/ja-jp/manage/configuration.html#plugin-repository-last-check-duration","49":"/ja-jp/manage/configuration.html#disable-plugin-short-name-repository","50":"/ja-jp/manage/configuration.html#concurrency","51":"/ja-jp/manage/configuration.html#プラグインフック","52":"/ja-jp/manage/configuration.html#環境変数","53":"/ja-jp/manage/configuration.html#asdf-config-file","54":"/ja-jp/manage/configuration.html#asdf-default-tool-versions-filename","55":"/ja-jp/manage/configuration.html#asdf-dir","56":"/ja-jp/manage/configuration.html#asdf-data-dir","57":"/ja-jp/manage/configuration.html#asdf-concurrency","58":"/ja-jp/manage/configuration.html#asdf-force-prepend","59":"/ja-jp/manage/configuration.html#完全な構成の例","60":"/ja-jp/manage/configuration.html#内部構成","61":"/ja-jp/manage/core.html#コア","62":"/ja-jp/manage/core.html#インストール-セットアップ","63":"/ja-jp/manage/core.html#実行","64":"/ja-jp/manage/core.html#環境変数","65":"/ja-jp/manage/core.html#情報","66":"/ja-jp/manage/core.html#shimの再作成","67":"/ja-jp/manage/core.html#shimのバージョン","68":"/ja-jp/manage/core.html#更新","69":"/ja-jp/manage/core.html#アンインストール","70":"/ja-jp/manage/plugins.html#プラグイン","71":"/ja-jp/manage/plugins.html#追加","72":"/ja-jp/manage/plugins.html#インストール済みプラグイン一覧","73":"/ja-jp/manage/plugins.html#全プラグインのショートネーム一覧","74":"/ja-jp/manage/plugins.html#更新","75":"/ja-jp/manage/plugins.html#削除","76":"/ja-jp/manage/plugins.html#ショートネームリポジトリの同期","77":"/ja-jp/manage/versions.html#バージョン","78":"/ja-jp/manage/versions.html#バージョンのインストール","79":"/ja-jp/manage/versions.html#最新安定バージョンのインストール","80":"/ja-jp/manage/versions.html#インストール済みバージョン一覧","81":"/ja-jp/manage/versions.html#インストール可能な全バージョン一覧","82":"/ja-jp/manage/versions.html#最新安定バージョンの表示","83":"/ja-jp/manage/versions.html#カレントバージョンのセット","84":"/ja-jp/manage/versions.html#システムバージョンへの委任","85":"/ja-jp/manage/versions.html#カレントバージョンの表示","86":"/ja-jp/manage/versions.html#バージョンのアンインストール","87":"/ja-jp/manage/versions.html#shims","88":"/ja-jp/manage/versions.html#asdfのshimのバイパス","89":"/ja-jp/more/community-projects.html#コミュニティプロジェクト","90":"/ja-jp/more/faq.html#faq","91":"/ja-jp/more/faq.html#wsl1をサポートしていますか","92":"/ja-jp/more/faq.html#wsl2をサポートしていますか","93":"/ja-jp/more/faq.html#新しくインストールした実行ファイルが実行できないのですが","94":"/ja-jp/more/faq.html#シェルが、新しくインストールされたshimを検知してくれないのですが","95":"/ja-jp/more/thanks.html#謝辞","96":"/ja-jp/more/thanks.html#クレジット","97":"/ja-jp/more/thanks.html#メンテナー","98":"/ja-jp/more/thanks.html#コントリビューター","99":"/ja-jp/plugins/create.html#プラグインの作成","100":"/ja-jp/plugins/create.html#クイックスタート","101":"/ja-jp/plugins/create.html#プラグインスクリプトの鉄則","102":"/ja-jp/plugins/create.html#スクリプトの概要","103":"/ja-jp/plugins/create.html#環境変数の概要","104":"/ja-jp/plugins/create.html#必須スクリプト","105":"/ja-jp/plugins/create.html#bin-list-all","106":"/ja-jp/plugins/create.html#bin-download","107":"/ja-jp/plugins/create.html#bin-install","108":"/ja-jp/plugins/create.html#オプションスクリプト","109":"/ja-jp/plugins/create.html#bin-latest-stable","110":"/ja-jp/plugins/create.html#bin-help-overview","111":"/ja-jp/plugins/create.html#bin-help-deps","112":"/ja-jp/plugins/create.html#bin-help-config","113":"/ja-jp/plugins/create.html#bin-help-links","114":"/ja-jp/plugins/create.html#bin-list-bin-paths","115":"/ja-jp/plugins/create.html#bin-exec-env","116":"/ja-jp/plugins/create.html#bin-exec-path","117":"/ja-jp/plugins/create.html#bin-uninstall","118":"/ja-jp/plugins/create.html#bin-list-legacy-filenames","119":"/ja-jp/plugins/create.html#bin-parse-legacy-file","120":"/ja-jp/plugins/create.html#bin-post-plugin-add","121":"/ja-jp/plugins/create.html#bin-post-plugin-update","122":"/ja-jp/plugins/create.html#bin-pre-plugin-remove","123":"/ja-jp/plugins/create.html#asdf-cliの拡張コマンド","124":"/ja-jp/plugins/create.html#カスタムshimテンプレート","125":"/ja-jp/plugins/create.html#テスト","126":"/ja-jp/plugins/create.html#github-action","127":"/ja-jp/plugins/create.html#travisci-構成設定","128":"/ja-jp/plugins/create.html#apiレート制限","129":"/ja-jp/plugins/create.html#github-api-token","130":"/ja-jp/plugins/create.html#プラグインショートネームインデックス"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,3],"1":[1,1,47],"2":[1,1,40],"3":[1,2,14],"4":[5,2,37],"5":[1,1,13],"6":[1,2,32],"7":[4,1,66],"8":[1,1,8],"9":[3,1,3],"10":[1,3,38],"11":[1,3,27],"12":[4,3,16],"13":[1,3,27],"14":[1,3,57],"15":[1,1,23],"16":[2,1,8],"17":[1,1,12],"18":[2,1,34],"19":[2,1,1],"20":[1,3,14],"21":[1,3,22],"22":[2,1,199],"23":[2,1,9],"24":[2,1,6],"25":[1,3,26],"26":[1,3,11],"27":[2,1,20],"28":[2,1,16],"29":[1,3,24],"30":[1,3,20],"31":[1,3,25],"32":[2,1,15],"33":[1,1,22],"34":[1,1,10],"35":[1,1,1],"36":[4,2,14],"37":[1,2,8],"38":[1,2,11],"39":[1,2,16],"40":[2,1,13],"41":[1,1,144],"42":[1,1,6],"43":[3,1,75],"44":[2,1,34],"45":[3,2,18],"46":[3,2,11],"47":[3,2,12],"48":[5,2,40],"49":[5,2,43],"50":[1,2,18],"51":[1,2,42],"52":[1,1,18],"53":[3,2,18],"54":[5,2,17],"55":[2,2,16],"56":[3,2,20],"57":[2,2,10],"58":[3,2,24],"59":[1,1,65],"60":[1,1,15],"61":[1,1,3],"62":[3,1,2],"63":[1,1,7],"64":[1,1,6],"65":[1,1,7],"66":[1,1,30],"67":[1,1,28],"68":[1,1,21],"69":[1,1,102],"70":[1,1,7],"71":[1,1,22],"72":[1,1,14],"73":[1,1,7],"74":[1,1,22],"75":[1,1,13],"76":[1,1,29],"77":[1,1,1],"78":[1,1,21],"79":[1,1,12],"80":[1,1,11],"81":[1,1,12],"82":[1,1,11],"83":[1,1,47],"84":[1,1,17],"85":[1,1,20],"86":[1,1,10],"87":[1,1,65],"88":[1,2,6],"89":[1,1,18],"90":[1,1,3],"91":[2,1,10],"92":[2,1,20],"93":[2,1,17],"94":[3,1,19],"95":[1,1,3],"96":[1,1,10],"97":[1,1,6],"98":[1,1,2],"99":[1,1,16],"100":[1,1,22],"101":[1,2,9],"102":[1,1,53],"103":[1,1,44],"104":[1,1,1],"105":[3,2,55],"106":[2,2,81],"107":[2,2,91],"108":[1,1,1],"109":[3,2,89],"110":[3,2,57],"111":[3,2,55],"112":[3,2,55],"113":[3,2,67],"114":[3,2,60],"115":[3,2,45],"116":[3,2,72],"117":[2,2,34],"118":[4,2,46],"119":[4,2,43],"120":[4,2,35],"121":[4,2,39],"122":[4,2,31],"123":[2,1,57],"124":[1,1,18],"125":[1,1,57],"126":[2,2,40],"127":[2,2,37],"128":[1,1,28],"129":[3,2,11],"130":[1,1,25]},"averageFieldLength":[1.7786259541984732,1.5038167938931297,28.16030534351145],"storedFields":{"0":{"title":"asdf","titles":[]},"1":{"title":"初期セットアップ","titles":["asdf"]},"2":{"title":"開発","titles":["asdf"]},"3":{"title":"Gitignore","titles":["asdf","開発"]},"4":{"title":".git-blame-ignore-revs","titles":["asdf","開発"]},"5":{"title":"Batsテスト","titles":["asdf"]},"6":{"title":"Batsのヒント","titles":["asdf","Batsテスト"]},"7":{"title":"プルリクエスト、リリース、Conventional Commits","titles":["asdf"]},"8":{"title":"Dockerイメージ","titles":["asdf"]},"9":{"title":"ドキュメント & サイト","titles":[]},"10":{"title":"初期セットアップ","titles":["ドキュメント & サイト"]},"11":{"title":"開発","titles":["ドキュメント & サイト"]},"12":{"title":"プルリクエスト、リリース、Conventional Commits","titles":["ドキュメント & サイト"]},"13":{"title":"Vitepress","titles":["ドキュメント & サイト"]},"14":{"title":"I18n","titles":["ドキュメント & サイト"]},"15":{"title":"公式プラグイン","titles":[]},"16":{"title":"GitHub Actions","titles":[]},"17":{"title":"はじめよう","titles":[]},"18":{"title":"1. 依存関係のインストール","titles":["はじめよう"]},"19":{"title":"2. asdfのダウンロード","titles":["はじめよう"]},"20":{"title":"公式ダウンロード","titles":["はじめよう","2. asdfのダウンロード"]},"21":{"title":"コミュニティがサポートするダウンロード方法","titles":["はじめよう","2. asdfのダウンロード"]},"22":{"title":"3. asdfのインストール","titles":["はじめよう"]},"23":{"title":"コアのインストールが完了!","titles":["はじめよう"]},"24":{"title":"4. プラグインのインストール","titles":["はじめよう"]},"25":{"title":"プラグインの依存関係","titles":["はじめよう","4. プラグインのインストール"]},"26":{"title":"プラグインのインストール","titles":["はじめよう","4. プラグインのインストール"]},"27":{"title":"5. 特定のバージョンのインストール","titles":["はじめよう"]},"28":{"title":"6. バージョンをセット","titles":["はじめよう"]},"29":{"title":"グローバル","titles":["はじめよう","6. バージョンをセット"]},"30":{"title":"ローカル","titles":["はじめよう","6. バージョンをセット"]},"31":{"title":"ツールごとに用意された既存バージョンファイルの利用","titles":["はじめよう","6. バージョンをセット"]},"32":{"title":"入門完了!","titles":["はじめよう"]},"33":{"title":"イントロダクション","titles":[]},"34":{"title":"どうやって動いているの","titles":["イントロダクション"]},"35":{"title":"関連プロジェクト","titles":["イントロダクション"]},"36":{"title":"nvm / n / rbenv etc","titles":["イントロダクション","関連プロジェクト"]},"37":{"title":"direnv","titles":["イントロダクション","関連プロジェクト"]},"38":{"title":"Homebrew","titles":["イントロダクション","関連プロジェクト"]},"39":{"title":"NixOS","titles":["イントロダクション","関連プロジェクト"]},"40":{"title":"なぜasdfを使うの?","titles":["イントロダクション"]},"41":{"title":"すべてのコマンド","titles":[]},"42":{"title":"構成設定","titles":[]},"43":{"title":".tool-versions","titles":["構成設定"]},"44":{"title":".asdfrc","titles":["構成設定"]},"45":{"title":"legacy_version_file","titles":["構成設定",".asdfrc"]},"46":{"title":"use_release_candidates","titles":["構成設定",".asdfrc"]},"47":{"title":"always_keep_download","titles":["構成設定",".asdfrc"]},"48":{"title":"plugin_repository_last_check_duration","titles":["構成設定",".asdfrc"]},"49":{"title":"disable_plugin_short_name_repository","titles":["構成設定",".asdfrc"]},"50":{"title":"concurrency","titles":["構成設定",".asdfrc"]},"51":{"title":"プラグインフック","titles":["構成設定",".asdfrc"]},"52":{"title":"環境変数","titles":["構成設定"]},"53":{"title":"ASDF_CONFIG_FILE","titles":["構成設定","環境変数"]},"54":{"title":"ASDF_DEFAULT_TOOL_VERSIONS_FILENAME","titles":["構成設定","環境変数"]},"55":{"title":"ASDF_DIR","titles":["構成設定","環境変数"]},"56":{"title":"ASDF_DATA_DIR","titles":["構成設定","環境変数"]},"57":{"title":"ASDF_CONCURRENCY","titles":["構成設定","環境変数"]},"58":{"title":"ASDF_FORCE_PREPEND","titles":["構成設定","環境変数"]},"59":{"title":"完全な構成の例","titles":["構成設定"]},"60":{"title":"内部構成","titles":["構成設定"]},"61":{"title":"コア","titles":[]},"62":{"title":"インストール & セットアップ","titles":["コア"]},"63":{"title":"実行","titles":["コア"]},"64":{"title":"環境変数","titles":["コア"]},"65":{"title":"情報","titles":["コア"]},"66":{"title":"Shimの再作成","titles":["コア"]},"67":{"title":"Shimのバージョン","titles":["コア"]},"68":{"title":"更新","titles":["コア"]},"69":{"title":"アンインストール","titles":["コア"]},"70":{"title":"プラグイン","titles":[]},"71":{"title":"追加","titles":["プラグイン"]},"72":{"title":"インストール済みプラグイン一覧","titles":["プラグイン"]},"73":{"title":"全プラグインのショートネーム一覧","titles":["プラグイン"]},"74":{"title":"更新","titles":["プラグイン"]},"75":{"title":"削除","titles":["プラグイン"]},"76":{"title":"ショートネームリポジトリの同期","titles":["プラグイン"]},"77":{"title":"バージョン","titles":[]},"78":{"title":"バージョンのインストール","titles":["バージョン"]},"79":{"title":"最新安定バージョンのインストール","titles":["バージョン"]},"80":{"title":"インストール済みバージョン一覧","titles":["バージョン"]},"81":{"title":"インストール可能な全バージョン一覧","titles":["バージョン"]},"82":{"title":"最新安定バージョンの表示","titles":["バージョン"]},"83":{"title":"カレントバージョンのセット","titles":["バージョン"]},"84":{"title":"システムバージョンへの委任","titles":["バージョン"]},"85":{"title":"カレントバージョンの表示","titles":["バージョン"]},"86":{"title":"バージョンのアンインストール","titles":["バージョン"]},"87":{"title":"Shims","titles":["バージョン"]},"88":{"title":"asdfのShimのバイパス","titles":["バージョン","Shims"]},"89":{"title":"コミュニティプロジェクト","titles":[]},"90":{"title":"FAQ","titles":[]},"91":{"title":"WSL1をサポートしていますか?","titles":["FAQ"]},"92":{"title":"WSL2をサポートしていますか?","titles":["FAQ"]},"93":{"title":"新しくインストールした実行ファイルが実行できないのですが?","titles":["FAQ"]},"94":{"title":"シェルが、新しくインストールされたShimを検知してくれないのですが?","titles":["FAQ"]},"95":{"title":"謝辞","titles":[]},"96":{"title":"クレジット","titles":["謝辞"]},"97":{"title":"メンテナー","titles":["謝辞"]},"98":{"title":"コントリビューター","titles":["謝辞"]},"99":{"title":"プラグインの作成","titles":[]},"100":{"title":"クイックスタート","titles":["プラグインの作成"]},"101":{"title":"プラグインスクリプトの鉄則","titles":["プラグインの作成","クイックスタート"]},"102":{"title":"スクリプトの概要","titles":["プラグインの作成"]},"103":{"title":"環境変数の概要","titles":["プラグインの作成"]},"104":{"title":"必須スクリプト","titles":["プラグインの作成"]},"105":{"title":"bin/list-all","titles":["プラグインの作成","必須スクリプト"]},"106":{"title":"bin/download","titles":["プラグインの作成","必須スクリプト"]},"107":{"title":"bin/install","titles":["プラグインの作成","必須スクリプト"]},"108":{"title":"オプションスクリプト","titles":["プラグインの作成"]},"109":{"title":"bin/latest-stable","titles":["プラグインの作成","オプションスクリプト"]},"110":{"title":"bin/help.overview","titles":["プラグインの作成","オプションスクリプト"]},"111":{"title":"bin/help.deps","titles":["プラグインの作成","オプションスクリプト"]},"112":{"title":"bin/help.config","titles":["プラグインの作成","オプションスクリプト"]},"113":{"title":"bin/help.links","titles":["プラグインの作成","オプションスクリプト"]},"114":{"title":"bin/list-bin-paths","titles":["プラグインの作成","オプションスクリプト"]},"115":{"title":"bin/exec-env","titles":["プラグインの作成","オプションスクリプト"]},"116":{"title":"bin/exec-path","titles":["プラグインの作成","オプションスクリプト"]},"117":{"title":"bin/uninstall","titles":["プラグインの作成","オプションスクリプト"]},"118":{"title":"bin/list-legacy-filenames","titles":["プラグインの作成","オプションスクリプト"]},"119":{"title":"bin/parse-legacy-file","titles":["プラグインの作成","オプションスクリプト"]},"120":{"title":"bin/post-plugin-add","titles":["プラグインの作成","オプションスクリプト"]},"121":{"title":"bin/post-plugin-update","titles":["プラグインの作成","オプションスクリプト"]},"122":{"title":"bin/pre-plugin-remove","titles":["プラグインの作成","オプションスクリプト"]},"123":{"title":"asdf CLIの拡張コマンド","titles":["プラグインの作成"]},"124":{"title":"カスタムShimテンプレート","titles":["プラグインの作成"]},"125":{"title":"テスト","titles":["プラグインの作成"]},"126":{"title":"GitHub Action","titles":["プラグインの作成","テスト"]},"127":{"title":"TravisCI 構成設定","titles":["プラグインの作成","テスト"]},"128":{"title":"APIレート制限","titles":["プラグインの作成"]},"129":{"title":"GITHUB_API_TOKEN","titles":["プラグインの作成","APIレート制限"]},"130":{"title":"プラグインショートネームインデックス","titles":["プラグインの作成"]}},"dirtCount":0,"index":[["認証トークンをコードリポジトリで公開してはいけません",{"2":{"129":1}}],["次に",{"2":{"129":1}}],["次のような出力となります",{"2":{"114":1}}],["次のように実行します",{"2":{"11":2,"125":1}}],["次のいずれかの方法を使用することを推奨します",{"2":{"105":1}}],["次の2つの方法があります",{"2":{"100":1}}],["次のとおりです",{"2":{"76":1}}],["次のコマンドで",{"2":{"69":4}}],["次のコマンドを実行します",{"2":{"27":1,"29":1}}],["次の両方のファイルを参照してください",{"2":{"13":1}}],["次のスクリプト",{"2":{"2":1}}],["ブランチ",{"2":{"125":1}}],["ブランチをgithubからダウンロードし",{"2":{"43":1}}],["標準的なbashのshimを使用できないのです",{"2":{"124":1}}],["前に",{"2":{"122":1}}],["前回のリリースからのコミット履歴を読み込むことで生成されます",{"2":{"7":1}}],["呼び出されます",{"2":{"120":1,"121":1,"122":1}}],["マシンに何がインストールされているか",{"2":{"119":1}}],["マネージャごとの異なるコマンド",{"2":{"36":1}}],["常に正確で同じバージョンを返す必要があります",{"2":{"119":1}}],["決定論的で",{"2":{"119":1}}],["後に",{"2":{"120":1,"121":1}}],["後続のコア実行によってこれらの出力が読み取られることはありません",{"2":{"117":1}}],["後の手順で自動的にインストールされます",{"2":{"18":1}}],["パラメータは",{"2":{"125":1}}],["パスはasdf",{"2":{"114":1}}],["パッケージのインストールディレクトリにある実行ファイルの完全パス",{"2":{"87":1}}],["パッケージ管理とシステム構成に独自のアプローチを取り入れたツールです",{"2":{"39":1}}],["パッケージとその上位の依存関係を管理します",{"2":{"38":1}}],["パッケージマネージャやインテグレータ向けのasdfの内部構成について記述しているため",{"2":{"60":1}}],["パッケージマネージャでアンインストールします",{"2":{"69":9}}],["パッケージマネージャでもありません",{"2":{"38":1,"39":1}}],["パッケージマネージャで実行するコマンドの",{"2":{"18":1}}],["パッケージマネージャ",{"2":{"18":1}}],["形式は以下のいずれかである必要があります",{"2":{"113":1}}],["\\thttps",{"2":{"113":2}}],["短い1段落程度の説明が理想です",{"2":{"110":1}}],["自動テスト中にレート制限が発生することがあります",{"2":{"128":1}}],["自動的にshimが作成されますが",{"2":{"93":1}}],["自動的にpath",{"2":{"22":1}}],["自由な形式のテキストで出力できます",{"2":{"112":1}}],["自由な形式のテキストで出力して構いませんが",{"2":{"110":1}}],["ヘッダはasdfコア側で表示するため",{"2":{"110":1}}],["非安定版やリリース候補版は除外されるべきです",{"2":{"109":1}}],["今後作成するすべてのプラグインでこのスクリプトを含めるようにしてください",{"2":{"106":1}}],["終了コードは非ゼロとしてください",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1}}],["終了コードは0としてください",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1}}],["成功した場合",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1}}],["失敗した場合",{"2":{"106":2,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1}}],["解凍されたソースコードまたはバイナリのみを",{"2":{"106":1}}],["引数はありません",{"2":{"105":1,"106":1,"107":1,"117":1,"118":1,"120":1,"121":1,"122":1}}],["引き続き",{"2":{"23":1}}],["逆順にしたければ",{"2":{"105":1}}],["提供されている順序は正しいリリース順となっていることが多いため",{"2":{"105":1}}],["ウェブサイト上のリリースページからバージョンを取得する場合",{"2":{"105":1}}],["並べ替え",{"2":{"105":1}}],["出力フォーマット",{"2":{"105":1,"117":1}}],["ソースとなるファイルのフルパスに解決されます",{"2":{"103":1,"123":1}}],["ソースコードまたはバイナリのダウンロード先のパスです",{"2":{"106":1,"107":1}}],["ソースコードまたはバイナリをダウンロードする必要があります",{"2":{"106":1}}],["ソースコードからのダウンロード",{"2":{"78":1}}],["ソースコードのコンパイル時に使用するコア数です",{"2":{"50":1,"57":1,"103":1,"107":1}}],["ソースコードやバイナリを保持します",{"2":{"47":1}}],["ソースコードやバイナリを削除します",{"2":{"47":1}}],["される",{"2":{"122":1}}],["されるべき",{"2":{"103":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["されたプラグインがダウンロードされた",{"2":{"121":1}}],["された",{"2":{"120":1}}],["されている",{"2":{"103":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["場所へのパスです",{"2":{"103":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["場所",{"2":{"103":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["レガシーファイルのパスという1つの引数を受け取ります",{"2":{"119":1}}],["レガシーファイルの内容を読み込むために",{"2":{"119":1}}],["レガシーバージョンが有効で完全かどうかは関係ありません",{"2":{"119":1}}],["レガシーバージョンファイルのカスタムパーサーです",{"2":{"102":1}}],["レガシー",{"2":{"106":1}}],["レガシープラグインのサポートは最終的に削除される予定のため",{"2":{"106":1}}],["レガシープラグイン",{"2":{"106":1,"107":1}}],["レガシー構成ファイルのリストを出力します",{"2":{"102":1}}],["指定されたバージョンをダウンロード",{"2":{"107":1}}],["指定されたバージョンをasdf",{"2":{"107":1}}],["指定された場所にダウンロードします",{"2":{"106":1}}],["指定されたツールの最新安定バージョンをリストします",{"2":{"102":1}}],["指定されたタグ",{"2":{"43":1}}],["移植性のないツールやコマンドフラグの使用は避けてください",{"2":{"101":1}}],["スペース区切りのファイル名リストを出力してください",{"2":{"118":1}}],["スペース区切りのバージョンリストの文字列を出力する必要があります",{"2":{"105":1}}],["スペースで区切れば",{"2":{"43":1}}],["スクリプト内では表示しないでください",{"2":{"110":1}}],["スクリプト内で他のasdfコマンドを呼び出してはいけません",{"2":{"101":1}}],["スクリプトの第1引数で提供されます",{"2":{"109":1}}],["スクリプトの概要",{"0":{"102":1}}],["スクリプトは",{"2":{"106":1,"107":1,"109":1}}],["スクリプトで使用できる環境変数",{"2":{"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["スクリプト",{"2":{"102":1}}],["テンプレートを対話的に更新していきます",{"2":{"100":1}}],["テスト",{"0":{"125":1},"1":{"126":1,"127":1}}],["テストを実行させています",{"2":{"83":1}}],["テストを作成する前に",{"2":{"5":1}}],["テストを作ってください",{"2":{"2":1}}],["テスト実行中に特殊なファイルディスクリプタ",{"2":{"6":1}}],["生成できたら",{"2":{"100":1}}],["生成",{"2":{"100":1}}],["名前はasdf",{"2":{"100":1}}],["やasdf",{"2":{"99":1}}],["言語",{"2":{"99":1}}],["言語開発者などが使用します",{"2":{"43":1}}],["メンテナー",{"0":{"97":1}}],["咳",{"2":{"96":1}}],["風邪",{"2":{"96":1}}],["高熱",{"2":{"96":1}}],["私",{"2":{"96":1}}],["クイックスタート",{"0":{"100":1},"1":{"101":1}}],["クレジット",{"0":{"96":1}}],["クローンしたリポジトリのパスを設定し",{"2":{"2":1}}],["謝辞",{"0":{"95":1},"1":{"96":1,"97":1,"98":1}}],["上記の例では",{"2":{"93":1}}],["限られる",{"2":{"92":1}}],["重要なのは",{"2":{"92":1}}],["動作するはずです",{"2":{"92":1}}],["詳細はreadmeをご確認ください",{"2":{"88":1}}],["詳しくはasdfの構成設定のリファレンスをご覧ください",{"2":{"76":2}}],["詳しくはnixosのドキュメントをご覧ください",{"2":{"39":1}}],["詳しくはhomebrewのドキュメントをご覧ください",{"2":{"38":1}}],["詳しくはdirenvのドキュメントをご覧ください",{"2":{"37":1}}],["詳しくは",{"2":{"4":1,"6":1,"12":1,"15":1,"29":1,"93":1}}],["詳しくはこちらをご覧ください",{"2":{"3":1}}],["何らかの理由でasdfのshimをバイパスしたい場合や",{"2":{"88":1}}],["何らかのトリガーイベントが発生した際に",{"2":{"48":1}}],["本システムはexec呼び出しを使用するため",{"2":{"87":1}}],["本番用アプリケーションの実行用途として使用することができます",{"2":{"8":1}}],["kim",{"2":{"85":3}}],["keep",{"0":{"47":1},"2":{"44":1,"59":1}}],["代替手段",{"2":{"83":1}}],["代わりにshimが実行され",{"2":{"34":1}}],["存在しない場合は作成されます",{"2":{"83":1}}],["存在しない場合はasdf",{"2":{"56":1}}],["タグでプラグイン自体をチェックアウトします",{"2":{"125":1}}],["タグ",{"2":{"78":1}}],["ターミナルのタブを新たに開けばokです",{"2":{"22":1}}],["過去x分の間に同期が行われていない場合",{"2":{"76":1}}],["定期的に更新されます",{"2":{"76":1}}],["削除",{"0":{"75":1},"2":{"122":1}}],["916",{"2":{"74":1}}],["全プラグインのショートネーム一覧については",{"2":{"73":1}}],["全プラグインのショートネーム一覧",{"0":{"73":1}}],["推奨されるプラグインのインストール方法は",{"2":{"130":1}}],["推奨されるインストール方法を使用した場合",{"2":{"68":1}}],["推奨",{"2":{"71":1}}],["追加",{"0":{"71":1},"2":{"120":1}}],["様々なツールをサポートするために使用されるプラグインapiについては",{"2":{"70":1}}],["🎉",{"2":{"69":1}}],["もし",{"2":{"69":1,"76":1}}],["アンインストールするときも",{"2":{"78":1}}],["アンインストール",{"0":{"69":1}}],["アンロードできる機能を付け加えます",{"2":{"37":1}}],["別の方法でインストールした場合",{"2":{"68":1}}],["別ファイルに切り出されており",{"2":{"13":1}}],["更新後のプラグインのgit",{"2":{"103":1,"121":1}}],["更新",{"0":{"68":1,"74":1},"2":{"121":1}}],["更新および削除をする際の前後",{"2":{"51":1}}],["8",{"2":{"67":2,"107":1,"109":1}}],["8837でご覧いただくと分かるとおり",{"2":{"22":2}}],["が付与されていない場合",{"2":{"123":1}}],["が付与されている場合",{"2":{"123":1}}],["が",{"2":{"66":1}}],["がある場合",{"2":{"45":1}}],["情報",{"0":{"65":1}}],["現時点ではそうではないようです",{"2":{"92":1}}],["現時点での最新バージョンを指定できるasdfのヘルパーです",{"2":{"27":1}}],["現在のバージョンでshimコマンドを実行します",{"2":{"115":1,"116":1}}],["現在のバージョンのshimでコマンドを実行します",{"2":{"63":1}}],["現在のシェルセッションでのみバージョンを設定したい場合",{"2":{"83":1}}],["現在のシェルセッションでのみ有効となります",{"2":{"83":1}}],["現在開発中です",{"2":{"74":1}}],["実装内容",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"116":1,"118":1,"119":1}}],["実行可能ビット",{"2":{"123":2}}],["実行ファイルであると同時に",{"2":{"124":1}}],["実行ファイルは",{"2":{"124":1}}],["実行ファイルへの相対パスを文字列で出力する必要があります",{"2":{"116":2}}],["実行ファイルのパスを表示します",{"2":{"115":1,"116":1}}],["実行ファイルが含まれるディレクトリのパスをスペース区切りで出力してください",{"2":{"114":1}}],["実行ファイルが含まれるディレクトリの一覧を出力します",{"2":{"114":1}}],["実行ファイルをグローバルインストールができます",{"2":{"66":1}}],["実行します",{"2":{"87":1}}],["実行",{"0":{"63":1}}],["実バージョンの表記です",{"2":{"43":1}}],["セットアップと依存関係の解決を済ませれば",{"2":{"92":1}}],["セットアップ",{"0":{"62":1}}],["セマンティックバージョンやプロバイダをフィルタするために",{"2":{"109":1}}],["セマンティックバージョンのmajorを新しく作成します",{"2":{"7":1}}],["セマンティックバージョンのminorを新しく作成します",{"2":{"7":1}}],["セマンティックバージョンのpatchを新しく作成します",{"2":{"7":1}}],["セマンティックバージョンを自動的に引き上げ",{"2":{"7":1}}],["多くのワークフローを円滑に進めることができます",{"2":{"61":1}}],["値がセットされる過程",{"2":{"59":1}}],["値",{"2":{"59":1}}],["値をneverにしても",{"2":{"48":1}}],["結果として以下のような構成となります",{"2":{"59":1}}],["完全な構成の例",{"0":{"59":1}}],["quot",{"2":{"58":2,"106":2,"114":8,"118":2}}],["します",{"2":{"100":1}}],["しません",{"2":{"58":1}}],["しかし",{"2":{"23":1}}],["に作成されます",{"2":{"87":1}}],["における",{"2":{"74":1}}],["に対して",{"2":{"66":1}}],["に追加するかどうかを設定します",{"2":{"58":1}}],["によって異なります",{"2":{"52":1}}],["通常は",{"2":{"125":1}}],["通常",{"2":{"54":1}}],["有効なファイル名であれば何でも設定できます",{"2":{"54":1}}],["未設定の場合",{"2":{"53":1,"54":1,"55":1,"56":1,"57":1,"58":1}}],["必要に応じてカスタマイズしてください",{"2":{"127":1}}],["必要に応じて",{"2":{"110":1,"111":1,"112":1,"113":1}}],["必要なものは次のとおりです",{"2":{"25":1}}],["必須",{"2":{"106":1}}],["必須スクリプト",{"0":{"104":1},"1":{"105":1,"106":1,"107":1}}],["必ず絶対パスで設定してください",{"2":{"53":1,"55":1,"56":1}}],["任意の場所に設定できます",{"2":{"53":1,"55":1,"56":1}}],["環境変数経由で認証トークンを提供するコードパスがあることを確認してください",{"2":{"128":1}}],["環境変数が設定されることはありません",{"2":{"119":1}}],["環境変数の概要",{"0":{"103":1}}],["環境変数の設定値は",{"2":{"52":1}}],["環境変数は何も設定していない",{"2":{"59":1}}],["環境変数は通常",{"2":{"52":1}}],["環境変数",{"0":{"52":1,"64":1},"1":{"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"103":1}}],["環境変数など",{"2":{"33":1}}],["カスタムshimテンプレートを使用することができます",{"2":{"124":1}}],["カスタムshimテンプレート",{"0":{"124":1}}],["カスタムソートメソッドを自分で書く",{"2":{"105":1}}],["カスタムコードを実行することができます",{"2":{"51":1}}],["カレントワークディレクトリがwindowsドライブではなくunixドライブである場合に",{"2":{"92":1}}],["カレントバージョンの表示",{"0":{"85":1}}],["カレントバージョンのセットと同様の方法で",{"2":{"84":1}}],["カレントバージョンのセット",{"0":{"83":1}}],["カレントディレクトリ内",{"2":{"30":1}}],["カレントディレクトリにおいてツールのバージョンを解決可能か確認できるため",{"2":{"28":1}}],["カレントディレクトリから上位の$homeディレクトリまでに存在するすべての",{"2":{"28":1}}],["整数値",{"2":{"50":1}}],["同じバージョンを返すようにしてください",{"2":{"119":1}}],["同じレガシーファイルを解析したら",{"2":{"119":1}}],["同じ名前とバージョンを指定する必要があります",{"2":{"78":1}}],["同期が開始されます",{"2":{"76":1}}],["同期のタイミングの条件は",{"2":{"76":1}}],["同期イベントは",{"2":{"76":1}}],["同期イベントはすぐに終了します",{"2":{"49":1}}],["同期イベントが発生した際に",{"2":{"49":1}}],["同期は中止されます",{"2":{"76":1}}],["同期は",{"2":{"48":1,"49":1}}],["同期しません",{"2":{"48":1}}],["同様の手順を実施してください",{"2":{"32":1}}],["トリガーイベントのたびに同期します",{"2":{"48":1}}],["トリガーイベントで同期します",{"2":{"48":1}}],["設定されていない場合は",{"2":{"107":1}}],["設定されている場合は",{"2":{"107":1}}],["設定された間隔以上の時間が経過していた倍は",{"2":{"48":1}}],["設定してみましょう",{"2":{"24":1}}],["分",{"2":{"48":2}}],["保持しておくか削除するかを制御します",{"2":{"47":1}}],["利用可能なレガシーバージョンファイル",{"2":{"45":1}}],["説明",{"2":{"45":1,"46":1,"47":1,"48":1,"49":1,"102":1,"103":1,"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["オペレーティングシステムと",{"2":{"110":1,"111":1,"112":1,"113":1}}],["オペレーティングシステムに合わせた依存関係のリストを出力します",{"2":{"102":1,"111":1}}],["オリジナルのプラグインを作成するには",{"2":{"100":1}}],["オプションで",{"2":{"125":2}}],["オプションの",{"2":{"125":1}}],["オプションのフィルタに基づいて",{"2":{"109":1}}],["オプションのbin",{"2":{"107":1}}],["オプションスクリプト",{"0":{"108":1},"1":{"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["オプション",{"2":{"45":1,"46":1,"47":1,"48":1,"49":1,"106":1}}],["オートコンプリートを使用するようにzshを設定する必要があります",{"2":{"22":1}}],["対応しているプラグインの場合",{"2":{"45":1}}],["対象となるディレクトリで",{"2":{"30":1}}],["ユーザは下記コマンドが実行できるようになります",{"2":{"123":1}}],["ユーザへの出力は",{"2":{"117":1}}],["ユーザが提供したフィルタは",{"2":{"109":1}}],["ユーザが気にする必要はありません",{"2":{"60":1}}],["ユーザがjavascriptを使用できない",{"2":{"11":1}}],["ユーザのマシン固有の構成を設定します",{"2":{"44":1}}],["直接編集するか",{"2":{"43":1}}],["7",{"2":{"43":4,"107":1,"109":1}}],["複数のバージョンのツールがインストールされている場合",{"2":{"67":1}}],["複数のバージョンを指定できます",{"2":{"43":1}}],["複数のcliのバージョンマネージャを用意する必要があり",{"2":{"33":1}}],["当該スクリプトが実行されます",{"2":{"123":1}}],["当該ツールの最新安定バージョンにセットします",{"2":{"109":2}}],["当該プラグインでインストールされたすべてのツールが削除されます",{"2":{"75":1}}],["当該ディレクトリおよびサブディレクトリで",{"2":{"43":1}}],["当該バージョンが実行されます",{"2":{"34":1}}],["他人と共有可能な",{"2":{"42":1}}],["他のciを使用する場合",{"2":{"127":1}}],["他のバージョンマネージャで使用されているバージョンファイルを読み込むことができます",{"2":{"45":1}}],["他のバージョンマネージャ向けに作られた既存のバージョンファイル",{"2":{"31":1}}],["他のツールと差別化することで",{"2":{"36":1}}],["`",{"2":{"126":1}}],["`$asdf",{"2":{"123":5}}],["`env`",{"2":{"41":1}}],["`asdf",{"2":{"41":1}}],["チームが確実に同じバージョンのツールを使用することを保証できます",{"2":{"40":1}}],["チーム全員に同じーバージョンのツールを使ってもらえるようになります",{"2":{"33":1}}],["親しみやすさによって",{"2":{"40":1}}],["親切ですね",{"2":{"22":1}}],["なぜasdfを使うの",{"0":{"40":1}}],["などの機能をサポートするコマンドを使って",{"2":{"99":1}}],["など",{"2":{"22":1}}],["繰り返しになりますが",{"2":{"39":1}}],["たったこれだけです",{"2":{"69":1}}],["たくさんのcliツール",{"2":{"39":1}}],["たいていの場合は",{"2":{"30":1}}],["たいていの場合",{"2":{"22":1}}],["独自のプログラミング言語",{"2":{"39":1}}],["真に再現可能な環境を構築することを目指しています",{"2":{"39":1}}],["関連するコマンドフックについても参照してください",{"2":{"120":1,"121":1,"122":1}}],["関連するasdfプラグインの更新が必要となることがあります",{"2":{"22":2}}],["関連プロジェクト",{"0":{"35":1},"1":{"36":1,"37":1,"38":1,"39":1}}],["どうしても必要な場合にのみ使用してください",{"2":{"124":1}}],["どうしても並べ替えが避けられない場合",{"2":{"105":1}}],["どうなっているの",{"2":{"93":1}}],["どうやって動いているの",{"0":{"34":1}}],["どのコマンドがどのスクリプトを呼び出すかについては",{"2":{"102":1}}],["どのようなコマンドの前後にどのようなコマンドフックを実行すべきかについての詳細は",{"2":{"51":1}}],["どのようなツールでもasdfで管理できるようになりますが",{"2":{"40":1}}],["どのツールが実行に失敗するか検証することができます",{"2":{"28":1}}],["従来は",{"2":{"33":1}}],["すでに同期されたリポジトリは削除されません",{"2":{"49":1}}],["すべてのスクリプトですべての環境変数が使用できるわけではありません",{"2":{"103":1}}],["すべてのスクリプトで使用される環境変数の全リストです",{"2":{"103":1}}],["すべてのコマンド",{"0":{"41":1}}],["すべてのコマンドの説明を見ることができます",{"2":{"32":1}}],["すべてのツール",{"2":{"33":1}}],["すべてのツールのバージョンは単一のファイル",{"2":{"33":1}}],["すると",{"2":{"29":1,"30":1,"59":1}}],["以降のasdfコアの互換性を保つために",{"2":{"107":1}}],["以降に記載されている必要なスクリプトを実装します",{"2":{"100":1}}],["以前と0",{"2":{"107":1}}],["以前にこのソースからインストールされたプラグインは削除されません",{"2":{"49":1}}],["以下に例を示します",{"2":{"128":1}}],["以下は",{"2":{"102":1,"103":1,"127":1}}],["以下では",{"2":{"52":1}}],["以下の各スクリプトのドキュメントで",{"2":{"103":1}}],["以下のパターンがサポートされています",{"2":{"51":1}}],["以下のようなフックを使うことで",{"2":{"51":1}}],["以下のコマンドが実行されたときに発生します",{"2":{"48":1,"49":1}}],["以下の表は",{"2":{"18":1}}],["以下のとおりです",{"2":{"13":1}}],["以上の場合",{"2":{"114":1}}],["以上経過していた場合",{"2":{"48":1}}],["以上で",{"2":{"32":1}}],["入門完了",{"0":{"32":1}}],["構成",{"2":{"59":1}}],["構成に必要な項目とそのデフォルト値を示しています",{"2":{"44":1}}],["構成ファイル",{"2":{"33":1}}],["構成設定のdisable",{"2":{"76":1}}],["構成設定のリファレンスをご覧ください",{"2":{"31":1,"83":1}}],["構成設定",{"0":{"42":1,"127":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1}}],["構成設定でのその他のオプションについて詳しくは",{"2":{"31":1}}],["構成を示すために使用されるjsオブジェクト含んだ",{"2":{"13":1}}],["かasdf",{"2":{"87":1}}],["からの移行をサポートしています",{"2":{"31":1}}],["かつ",{"2":{"13":1,"22":1,"106":1,"107":1}}],["例",{"2":{"31":1,"66":1}}],["例えばasdf",{"2":{"66":1}}],["例えば次のとおりです",{"2":{"6":1,"105":1}}],["例えば",{"2":{"4":1,"43":1,"45":1,"51":1,"67":1,"101":1,"109":1,"112":1,"114":1,"123":1,"125":1}}],["では",{"2":{"92":1}}],["で指定されたもの",{"2":{"87":1}}],["で指定されたツールのシステムバージョンを使用するには",{"2":{"84":1}}],["でバージョンを指定できます",{"2":{"78":1}}],["で定義されます",{"2":{"30":1}}],["です",{"2":{"11":1,"18":1,"89":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1,"125":1}}],["エラーが発生します",{"2":{"28":1}}],["ジャストインタイムで行われます",{"2":{"28":1}}],["照会は",{"2":{"28":1}}],["60",{"2":{"44":1,"59":1}}],["6",{"0":{"28":1},"1":{"29":1,"30":1,"31":1},"2":{"85":1}}],["特定のツールバージョンでコマンドを実行するだけのためにバージョンを設定したい場合は",{"2":{"83":1}}],["特定のツールを管理するためのプラグインをインストールすることができるようになります",{"2":{"34":1}}],["特定のプレフィックスでの最新安定バージョンで表示することもできます",{"2":{"82":1}}],["特定のプレフィックスでの最新安定バージョンをインストールすることもできます",{"2":{"79":1}}],["特定のプレフィックスでのバージョンでフィルタすることもできます",{"2":{"80":1,"81":1}}],["特定のプラグインパッケージを更新したい場合は",{"2":{"74":1}}],["特定のパッケージ",{"2":{"66":1}}],["特定のインストールに対して正しい更新方法を適用するようにします",{"2":{"60":1}}],["特定のメジャーバージョンのサブセットはasdf",{"2":{"27":1}}],["特定のバージョンのインストール",{"0":{"27":1}}],["特定の順序を必要とするツールの動作に",{"2":{"22":1}}],["5",{"0":{"27":1},"2":{"29":1,"30":1,"43":2,"67":2,"85":1}}],["あくまで",{"2":{"40":1}}],["あらかじめインストールしておきましょう",{"2":{"25":1}}],["あなたが作成したプラグインを",{"2":{"130":1}}],["あなたが選択したwslディストリビューションに基づいて",{"2":{"92":1}}],["あなたが使用しているシェル",{"2":{"22":1}}],["あなたが使用している",{"2":{"18":1}}],["あなたが開発した変更内容を試したいときは",{"2":{"2":1}}],["ymlファイルの例です",{"2":{"127":1}}],["yamllanguage",{"2":{"127":1}}],["yamlname",{"2":{"126":1}}],["yamlのactionsワークフローの例は以下のとおりです",{"2":{"126":1}}],["yarnのshimを作成しなければいけません",{"2":{"93":1}}],["yarnのような新しい実行ファイルのshimを強制的に再作成させることができます",{"2":{"66":1}}],["yarnが実行できません",{"2":{"93":1}}],["yarnを実行したにも関わらず",{"2":{"93":1}}],["yarnコマンドでyarnをインストール",{"2":{"66":1}}],["yes以外の文字列を設定した場合",{"2":{"58":1}}],["yesの場合",{"2":{"58":1}}],["yes",{"2":{"31":1,"45":1,"46":1,"47":1,"49":1}}],["yum",{"2":{"25":1}}],["your",{"2":{"1":1,"10":1}}],["依存関係を1行ごとに出力します",{"2":{"111":1}}],["依存関係インストールコマンド",{"2":{"25":1}}],["依存関係のインストール",{"0":{"18":1},"2":{"17":1}}],["各スクリプトの詳細なドキュメントを参照してください",{"2":{"102":1}}],["各ツールの未使用バージョンを手っ取り早くクリーンアップ",{"2":{"75":1}}],["各ツールの依存関係ツリー全体でパッケージのバージョンを正確に管理することで",{"2":{"39":1}}],["各プラグインには依存関係があるため",{"2":{"25":1}}],["各ロケールのmarkdownコンテンツは",{"2":{"14":1}}],["4",{"0":{"24":1},"1":{"25":1,"26":1},"2":{"83":3,"105":1}}],["ガイドを進めていきましょう",{"2":{"23":1}}],["バージョニングされたプラグインの更新機能については",{"2":{"74":1}}],["バージョン番号を1行で出力してください",{"2":{"119":1}}],["バージョン番号を抽出するのに役立ちます",{"2":{"119":1}}],["バージョン番号やツールプロバイダによる出力をフィルタするために使用されるべきです",{"2":{"109":1}}],["バージョンとしてsystemを指定します",{"2":{"84":1}}],["バージョン1",{"2":{"83":1}}],["バージョンは$pwd",{"2":{"83":1}}],["バージョンは$home",{"2":{"83":1}}],["バージョンはasdf",{"2":{"83":1}}],["バージョン",{"0":{"77":1},"1":{"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1}}],["バージョンのフルナンバーです",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["バージョンのダウンロード",{"2":{"106":1}}],["バージョンのアンインストール",{"0":{"86":1}}],["バージョンの表記形式は",{"2":{"83":1}}],["バージョンの表記は下記の形式があります",{"2":{"43":1}}],["バージョンのインストール",{"0":{"78":1}}],["バージョンのshimを再作成します",{"2":{"66":1}}],["バージョンの読み込みには",{"2":{"45":1}}],["バージョンのリファレンスをご覧ください",{"2":{"29":1}}],["バージョン管理をシステムに委任するように指示する必要があります",{"2":{"29":1}}],["バージョンをセット",{"0":{"28":1},"1":{"29":1,"30":1,"31":1}}],["バージョンを管理するようになってからです",{"2":{"23":1}}],["バグレポート作成時に共有してください",{"2":{"65":1}}],["バグ修正のレビューをスピードアップさせることができます",{"2":{"2":1}}],["バイナリへのshimを再作成します",{"2":{"114":1}}],["バイナリへのshimを初期作成します",{"2":{"114":1}}],["バイナリがダウンロードされます",{"2":{"43":1}}],["バイナリのダウンロードに対応しているプラグインの場合",{"2":{"43":1}}],["ようにしてください",{"2":{"22":1}}],["より詳細な説明が記述されています",{"2":{"14":1}}],["優先度を一番高くする",{"2":{"22":1}}],["強制的にpathエントリの先頭に追加する",{"2":{"22":1}}],["一番最初にカスタムコードを実行することができます",{"2":{"51":1}}],["一貫性が無くなってしまいます",{"2":{"22":1}}],["一部のレガシーファイルのフォーマットは適切でないときもあります",{"2":{"119":1}}],["一部のosでは",{"2":{"29":1}}],["一部のプラグインではインストール後の事後処理でこれらの依存関係が必要となるため",{"2":{"25":1}}],["一部のasdfツールのdocker化されたイメージを提供する取り組みを継続的に行っています",{"2":{"8":1}}],["一部例",{"2":{"18":1}}],["内部構成",{"0":{"60":1}}],["内で定義されるため",{"2":{"33":1}}],["内の項目の順番を並び替えることができるため",{"2":{"22":1}}],["内にすでに作成されているテスト",{"2":{"5":1}}],["使用するパッケージのバージョン",{"2":{"87":1}}],["使用するツールをカスタムコンパイルしたバージョンへのパスです",{"2":{"43":1}}],["使用方法",{"2":{"53":1,"54":1,"55":1,"56":1,"57":1}}],["使用中のフレームワーク",{"2":{"22":1}}],["使用しているos",{"2":{"3":1}}],["使用しているツールを列挙します",{"2":{"1":1}}],["+",{"2":{"22":2}}],["|",{"2":{"22":11}}],["まず",{"2":{"129":1}}],["また",{"2":{"49":1,"119":1}}],["またはインストール",{"2":{"103":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["またはshellのいずれかにsystemをセットしてください",{"2":{"84":1}}],["またはコミット",{"2":{"78":1}}],["または下記のコマンドで",{"2":{"71":1}}],["または1",{"2":{"50":1}}],["またはasdf",{"2":{"43":1,"87":1}}],["またはlinux",{"2":{"38":1}}],["または",{"2":{"22":1,"69":1,"83":1,"113":1}}],["または好みのaurヘルパーを使用",{"2":{"21":1,"68":1}}],["または有効にしていない場合に",{"2":{"11":1}}],["まだ更新されていません",{"2":{"22":2}}],["警告",{"2":{"22":2,"28":1,"124":1,"129":1}}],["フィルタクエリという1つの引数を受け取ります",{"2":{"109":1}}],["フィルタクエリは",{"2":{"109":1}}],["フルバージョン",{"2":{"51":1}}],["ファイル内容は関係ありません",{"2":{"60":1}}],["ファイル内で宣言しているツールのバージョンが使用されます",{"2":{"43":1}}],["ファイルの場所は",{"2":{"44":1}}],["ファイルは",{"2":{"43":1}}],["フレームワークソース以下にcompinitがくるようにしてください",{"2":{"22":1}}],["フォーマッタ",{"2":{"1":1}}],["=s",{"2":{"69":2}}],["=",{"2":{"22":9,"31":1,"44":6,"51":1,"69":6}}],["$releases",{"2":{"128":1}}],["$relative",{"2":{"116":1}}],["$github",{"2":{"128":2}}],["$travis",{"2":{"127":1}}],["$file",{"2":{"119":1}}],["$fpath",{"2":{"22":1,"69":1}}],["$cmd",{"2":{"116":1,"128":2}}],["$install",{"2":{"116":1}}],["$query",{"2":{"109":1}}],["$e",{"2":{"69":4}}],["$env",{"2":{"22":2}}],["$1",{"2":{"51":2}}],["$pathを設定した後",{"2":{"94":1}}],["$pathを設定したあと",{"2":{"22":1}}],["$pathに設定されることで",{"2":{"87":1}}],["$pathの操作",{"2":{"33":1}}],["$pwd",{"2":{"30":2}}],["$nu",{"2":{"22":3}}],["$",{"2":{"22":16,"41":1,"51":1,"69":17,"83":2,"87":4,"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":5,"115":1,"116":1,"117":1,"118":2,"119":1,"120":3,"121":3,"122":3,"123":4,"126":1}}],["$homeが存在するので",{"2":{"59":1}}],["$home",{"2":{"22":8,"29":2,"43":1,"53":1,"56":1,"59":5,"69":49}}],["$asdf",{"2":{"2":1,"49":1,"60":1,"69":2,"107":1,"123":1}}],["最高優先度",{"2":{"58":1}}],["最後に同期した時刻から指定時間",{"2":{"48":1}}],["最後に同期した時刻からの経過時間をチェックします",{"2":{"48":1}}],["最新バージョンが末尾にくる必要があります",{"2":{"105":1}}],["最新安定バージョンの表示",{"0":{"82":1}}],["最新安定バージョンのインストール",{"0":{"79":1}}],["最新コミット",{"2":{"74":1}}],["最新の安定リリース",{"2":{"68":1}}],["最新リリースを使用します",{"2":{"46":1}}],["最新リリースではなく",{"2":{"46":1}}],["最新版をインストールするには",{"2":{"27":1}}],["最終的にsystemのpythonにフォールバックさせるには",{"2":{"43":1}}],["最も適したものを選択してください",{"2":{"22":1}}],["最小限の構成でmarkdownファイルを書くことに重点を置いています",{"2":{"11":1}}],["方法",{"2":{"21":1,"68":1}}],["理由がない限り",{"2":{"21":1}}],["0をアンインストールし",{"2":{"117":1}}],["0をインストールします",{"2":{"107":1}}],["0のソースコードまたはバイナリをダウンロードし",{"2":{"106":1}}],["0のelixirプロジェクトに対して",{"2":{"83":1}}],["0以上が必要です",{"2":{"105":1}}],["000を超えるパッケージコレクションによって",{"2":{"39":1}}],["0",{"2":{"20":1,"29":1,"30":1,"43":4,"48":1,"67":4,"83":1,"105":3,"106":3,"107":4,"116":1,"117":1}}],["~",{"2":{"20":1,"22":50,"43":1,"69":23,"116":2}}],["22",{"2":{"109":1}}],["2014年から今まで",{"2":{"96":1}}],["2を使用し",{"2":{"43":1}}],["2",{"0":{"19":1},"1":{"20":1,"21":1},"2":{"43":6,"83":1,"92":1,"105":1,"109":4,"119":1}}],["接頭にsudoが必要となる場合もあります",{"2":{"18":1}}],["お使いのシステムやシェルによって異なります",{"2":{"52":1}}],["お使いのシステムの構成によっては",{"2":{"18":1}}],["およびawkが必要です",{"2":{"105":1}}],["およびasdfのデバッグ情報を表示するヘルパーコマンドです",{"2":{"65":1}}],["および実行環境",{"2":{"87":1}}],["および実装",{"2":{"33":1}}],["およびrbenvのようなツールはすべて",{"2":{"36":1}}],["およびmanpath",{"2":{"22":1}}],["およびインストール方法によって",{"2":{"22":1}}],["およびgitlens",{"2":{"4":1}}],["およびワークフロー固有のファイルは",{"2":{"3":1}}],["およびテストすることを推奨します",{"2":{"2":1}}],["備考",{"2":{"18":1,"27":1,"43":1,"48":1,"49":1,"50":1,"87":1,"89":1,"103":1,"125":1,"127":1}}],["zdotdir",{"2":{"22":1}}],["zshなど",{"2":{"94":1}}],["zshに適した場所に配置されますが",{"2":{"22":1}}],["zshrcで",{"2":{"69":3}}],["zshrc",{"2":{"22":1,"94":1}}],["zshrcにある可能性があります",{"2":{"69":1}}],["zshrcにasdf",{"2":{"22":1}}],["zshrcに下記の行を追記することで設定できます",{"2":{"22":1}}],["zshrcに下記の行を追記します",{"2":{"22":2}}],["zshフレームワークプラグインを使用します",{"2":{"69":1}}],["zshフレームワークasdfによって設定されるか",{"2":{"22":1}}],["zshフレームワークを使用している場合",{"2":{"22":2}}],["zshフレームワークでcompinitのセットアップをカスタマイズしている場合は",{"2":{"22":1}}],["zshフレームワークのasdfプラグインで設定するか",{"2":{"22":1}}],["zshの手順をご覧ください",{"2":{"69":1}}],["zshの手順を参照してください",{"2":{"22":2}}],["zshのようなzshフレームワークプラグインを使用して",{"2":{"22":1}}],["zsh",{"2":{"22":9,"69":3}}],["zypper",{"2":{"18":2}}],["zh",{"2":{"14":4}}],["1行ずつリストします",{"2":{"105":2}}],["18で始まるバージョンのみフィルタし",{"2":{"105":1}}],["18",{"2":{"105":2,"106":1,"107":1,"117":1}}],["11",{"2":{"85":1}}],["17",{"2":{"67":2,"78":1,"79":1,"80":1,"81":1,"82":1,"85":2,"86":1}}],["1から999999999までの整数値",{"2":{"48":1}}],["15にフォールバックし",{"2":{"43":1}}],["15",{"2":{"43":4,"117":2}}],["10",{"2":{"43":3}}],["16",{"2":{"29":1,"30":1,"67":2}}],["14コマンドで確認できます",{"2":{"27":1}}],["14",{"2":{"20":1,"67":4}}],["1",{"0":{"18":1},"2":{"83":1,"91":1,"105":4,"109":1,"116":1}}],["グローバルのデフォルト値は",{"2":{"43":1}}],["グローバルのデフォルト設定は",{"2":{"29":1}}],["グローバルのバージョンをセットするには",{"2":{"29":1}}],["グローバル",{"0":{"29":1}}],["グローバルまたはプロジェクトのバージョンをセット",{"2":{"17":1}}],["グローバルな",{"2":{"3":1}}],["ランタイムごとのマネージャ",{"2":{"36":1}}],["ランタイムごとにプラグインをインストール",{"2":{"17":1}}],["ランタイムのバージョン管理という分野では競合しています",{"2":{"36":1}}],["ランタイムの特定バージョンをインストール",{"2":{"17":1}}],["ランタイムに拡張することができます",{"2":{"33":1}}],["管理したいツール",{"2":{"17":1}}],["議論",{"2":{"16":1}}],["既存のイシュー",{"2":{"16":1}}],["ご興味を持っていただきありがとうございます",{"2":{"16":1}}],["システムバージョンへの委任",{"0":{"84":1}}],["システム上のツールバージョンへパススルーします",{"2":{"43":1}}],["ショートネームインデックスに追加することができます",{"2":{"130":1}}],["ショートネームインデックスリポジトリを使用します",{"2":{"130":1}}],["ショートネームリポジトリはローカルマシンに同期され",{"2":{"76":1}}],["ショートネームリポジトリの同期",{"0":{"76":1}}],["ショートネームリポジトリが無効となっている場合",{"2":{"49":1}}],["ショートネームのリストです",{"2":{"15":1}}],["シンプルなプラグインインターフェースを使って",{"2":{"33":1}}],["シェルのツール",{"2":{"101":1}}],["シェルの構成ファイル",{"2":{"94":1}}],["シェルが",{"0":{"94":1}}],["シェル",{"2":{"65":1}}],["シェル構成にたった1行のシェルスクリプトを記述するだけで使えるというシンプルさ",{"2":{"40":1}}],["シェルによってsourceされるパッケージ内のスクリプトは",{"2":{"87":1}}],["シェルに",{"2":{"37":1}}],["シェル上でasdfコアがセットアップすると",{"2":{"34":1}}],["シェルを再起動してください",{"2":{"22":1}}],["シェルスクリプトの静的解析ツールです",{"2":{"1":1}}],["ポピュラーなasdfプラグインを検索するためにasdfコアが使用する",{"2":{"15":1}}],["そうでなければ",{"2":{"116":2}}],["そちらのガイドに従って削除する行を見つけてください",{"2":{"69":2}}],["そしてbin",{"2":{"106":1}}],["そしてフレームワーク",{"2":{"94":1}}],["そして",{"2":{"69":4}}],["そして60",{"2":{"39":1}}],["そしてリポジトリ内の様々な",{"2":{"36":1}}],["それらがインストールされているかどうかを出力します",{"2":{"109":1}}],["それらの機能を支えています",{"2":{"39":1}}],["それらの管理はユーザが負担することとなりますが",{"2":{"38":1}}],["それがそのツールにとって最善の方法であるとは限りませんのでご注意ください",{"2":{"40":1}}],["それぞれが異なるapi",{"2":{"33":1}}],["それぞれのリポジトリを参照してください",{"2":{"15":1}}],["それを使用する場合",{"2":{"29":1}}],["そのコミット",{"2":{"125":1}}],["そのバージョンのツールがインストールされます",{"2":{"125":1}}],["そのバイナリ向けのshimを作成します",{"2":{"114":1}}],["そのため",{"2":{"124":1}}],["そのファイルをコピーします",{"2":{"124":1}}],["そのままの順序を使用することを推奨します",{"2":{"105":1}}],["そのスクリプトで利用可能な環境変数を確認してください",{"2":{"103":1}}],["そのリポジトリをクローンしてsetup",{"2":{"100":1}}],["そのパッケージに含まれるすべての実行プログラムのshimが$asdf",{"2":{"87":1}}],["その場合は",{"2":{"69":1}}],["その方法の手順に従ってください",{"2":{"68":1}}],["そのような時に",{"2":{"66":1}}],["その他のシステムでのデフォルト値はnoです",{"2":{"58":1}}],["そのプラグインでインストールされたすべてのツールバージョンが削除されます",{"2":{"49":1}}],["その際は",{"2":{"2":1}}],["そのディレクトリのbinとshimsディレクトリを一時的にパスの先頭へ追加します",{"2":{"2":1}}],["いくつかのバージョンは画面外にはみ出る場合があります",{"2":{"105":1}}],["いくつかのツールは",{"2":{"18":1}}],["いくつかのtypescriptファイルに記述されています",{"2":{"13":1}}],["いつでも歓迎しています",{"2":{"15":1}}],["日々のワークライフに関連するプラグインをいくつか作成しています",{"2":{"15":1}}],["公式ダウンロード",{"0":{"20":1}}],["公式プラグイン",{"0":{"15":1}}],["公式のvitepress",{"2":{"14":1}}],["└─",{"2":{"14":4}}],["│",{"2":{"14":1}}],["modのようなファイルから",{"2":{"119":1}}],["mit",{"2":{"96":1}}],["mix",{"2":{"83":1}}],["my",{"2":{"22":5,"94":1,"126":1,"127":2}}],["matrix",{"2":{"126":2}}],["man",{"2":{"123":3}}],["manage",{"2":{"41":1}}],["make",{"2":{"103":1,"107":1}}],["makepkg",{"2":{"21":1}}],["main",{"2":{"87":1,"126":1}}],["masterブランチの最新コミット",{"2":{"68":1}}],["master",{"2":{"41":1}}],["masosユーザの方は",{"2":{"22":1}}],["macosでのデフォルト値はyes",{"2":{"58":1}}],["macosでasdfを利用するときは",{"2":{"22":1}}],["macosでは",{"2":{"22":1}}],["macos",{"2":{"18":2,"22":4,"25":1,"38":1,"69":3,"126":1}}],["md",{"2":{"14":6}}],["messageのフォーマットを使用してください",{"2":{"7":1}}],["messagesでは",{"2":{"7":1}}],["├─",{"2":{"14":5}}],["配下に同じmarkdownファイルのセットを配置する必要があります",{"2":{"14":1}}],["を指定すると",{"2":{"125":2}}],["を実行します",{"2":{"115":1,"116":1}}],["を実行すると",{"2":{"66":1}}],["を",{"2":{"100":1}}],["を決定し",{"2":{"87":1}}],["を取得します",{"2":{"74":1}}],["を制御します",{"2":{"48":1}}],["を使用しているのれあればそれをsourceした後に",{"2":{"94":1}}],["を使用して更新してください",{"2":{"43":1}}],["を使う場合は",{"2":{"4":1}}],["を呼び出したあとに記述する必要があります",{"2":{"22":1}}],["を有効にするには",{"2":{"14":1}}],["简体中文",{"2":{"14":1}}],["h",{"2":{"128":1}}],["haxeの実行ファイルが実行ディレクトリから相対的に動的ライブラリを見つけようとしてしまう問題を修正します",{"2":{"123":1}}],["haxe",{"2":{"123":1}}],["haxeは",{"2":{"123":1}}],["hashnuke",{"2":{"96":1,"97":1}}],["halcyon",{"2":{"72":1}}],["hans",{"2":{"14":4}}],["hw",{"2":{"50":1}}],["head",{"2":{"41":1,"68":2}}],["helpとなります",{"2":{"125":1}}],["help",{"0":{"110":1,"111":1,"112":1,"113":1},"2":{"41":1,"102":4,"110":2,"111":3,"112":3,"113":3,"123":3}}],["helpコマンドで表示されるテキストです",{"2":{"41":1}}],["helpコマンドまたは単にasdfコマンドを実行すれば",{"2":{"32":1}}],["helperはpath",{"2":{"22":1}}],["helperというユーティリティが呼び出されます",{"2":{"22":1}}],["helperに関する警告を必ず参照してください",{"2":{"22":1}}],["home",{"2":{"22":2,"44":1,"53":1,"55":1,"56":1,"118":1}}],["homebrewで説明されている方法で設定されている可能性があるため",{"2":{"69":2}}],["homebrewは",{"2":{"38":1}}],["homebrewの説明に従って設定必要があります",{"2":{"22":1}}],["homebrewのガイドに従って設定を完了させるか",{"2":{"22":2}}],["homebrew",{"0":{"38":1},"2":{"18":1,"21":1,"22":8,"52":1,"68":1,"69":5}}],["htmlのみのフォールバックをサポートしたいからでした",{"2":{"11":1}}],["https",{"2":{"1":5,"10":3,"20":1,"21":1,"26":1,"41":2,"71":1,"72":2,"125":1,"127":1,"130":1}}],["edit",{"2":{"22":3,"69":3}}],["echo",{"2":{"22":7,"51":1}}],["elm",{"2":{"71":2}}],["else",{"2":{"69":2}}],["elvで",{"2":{"69":3}}],["elv",{"2":{"22":12,"69":3}}],["elvを追加します",{"2":{"22":3}}],["elvにasdf",{"2":{"22":3}}],["elvishの場合は",{"2":{"52":1}}],["elvish",{"2":{"22":18,"69":9}}],["elixirファイルとしても読み込まれます",{"2":{"124":1}}],["elixirなどの様々なツールを取り扱えるようにするためのものです",{"2":{"70":1}}],["elixir",{"2":{"15":1,"43":1,"83":3}}],["etc",{"0":{"36":1},"2":{"22":2,"69":2}}],["e",{"2":{"22":9}}],["erlang",{"2":{"15":1,"71":1,"74":1,"75":1,"78":1,"79":2,"80":2,"81":2,"82":2,"85":3,"86":1}}],["envスクリプトで提供",{"2":{"87":1}}],["environment",{"2":{"41":1}}],["env",{"0":{"115":1},"2":{"41":1,"64":1,"102":1,"115":3,"116":2}}],["en",{"2":{"14":3}}],["english",{"2":{"14":1}}],["example",{"2":{"116":1}}],["examples",{"2":{"7":1}}],["execヘルパーは",{"2":{"87":1}}],["execします",{"2":{"87":1}}],["execというヘルパープログラムに",{"2":{"87":1}}],["executing",{"2":{"51":1}}],["execution",{"2":{"41":1}}],["executes",{"2":{"41":1}}],["executable",{"2":{"41":1,"87":1,"116":1,"123":2}}],["exec",{"0":{"115":1,"116":1},"2":{"41":1,"63":1,"102":2,"115":2,"116":4}}],["export",{"2":{"14":1,"53":1,"54":1,"55":1,"56":1,"57":1}}],["ルート構成が下記の場合",{"2":{"14":1}}],["ルート構成ファイル内のlocales内のキーと同じ名前のディレクトリ配下に配置する必要があります",{"2":{"14":1}}],["ルート構成ファイルであるdocs",{"2":{"14":1}}],["ルート構成ファイルを簡素化するために",{"2":{"13":1}}],["個別にエクスポートされます",{"2":{"14":1}}],["ドロップメニューのタイトル",{"2":{"14":1}}],["ドキュメントの変更に関するプルリクエストを作成する場合",{"2":{"12":1}}],["ドキュメントサイト開発用のツールは",{"2":{"10":1}}],["ドキュメントおよびサイトのコントリビューションガイドです",{"2":{"9":1}}],["ドキュメント",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1}}],["サポートされているロケールとそのurl",{"2":{"14":1}}],["サイドバーの構成設定は前述の構成ファイルにキャプチャされ",{"2":{"14":1}}],["サイドバーの構成への参照を定義しています",{"2":{"14":1}}],["サイドバー",{"2":{"13":1}}],["サイトのルート構成ファイルです",{"2":{"13":1}}],["サイトの構成設定は",{"2":{"13":1}}],["サイト",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1}}],["国際化対応に関して最高のサポートを備えています",{"2":{"14":1}}],["ロケールごとに分類され",{"2":{"14":1}}],["ロケールごとに分類されています",{"2":{"13":1}}],["ローカルディレクトリパスを指定することもできます",{"2":{"120":1}}],["ローカルのバージョン設定は",{"2":{"30":1}}],["ローカルの開発サーバを起動するには",{"2":{"11":1}}],["ローカル",{"0":{"30":1}}],["ローカルでテストを実行するには",{"2":{"5":1}}],["ローカルマシンで開発する際は",{"2":{"1":1}}],["のみ",{"2":{"113":1}}],["の問題を避けるために",{"2":{"107":1}}],["の一番下にないことが原因である可能性があります",{"2":{"94":1}}],["の",{"2":{"74":1}}],["のshimを提供するプラグインおよびバージョンを一覧で表示します",{"2":{"67":1}}],["の優先順でコア数を計算します",{"2":{"50":1}}],["のためのパッケージマネージャー",{"2":{"38":1}}],["の構成を示す大きなjsオブジェクトについては",{"2":{"13":1}}],["の種類は次のとおりです",{"2":{"7":1}}],["とされていますが",{"2":{"106":1}}],["という名前のリポジトリを自分で立ち上げ",{"2":{"100":1}}],["ということです",{"2":{"92":1}}],["というフォーマットで作成するようにしてください",{"2":{"12":1}}],["となっていました",{"2":{"33":1,"106":1}}],["と",{"2":{"13":1,"125":1}}],["仕様については",{"2":{"13":1}}],["rvmrc",{"2":{"118":1}}],["rs",{"2":{"69":4}}],["rf",{"2":{"69":26}}],["rm",{"2":{"49":1,"69":4}}],["rbenv",{"0":{"36":1}}],["rbenvの場合は",{"2":{"31":1}}],["rocky",{"2":{"25":1}}],["root",{"2":{"14":1}}],["rc",{"2":{"22":9,"69":3}}],["rubyの出力は",{"2":{"109":1}}],["rubyのrbenvであれば",{"2":{"45":1}}],["rubyプラグインでのasdf",{"2":{"109":1}}],["ruby",{"2":{"15":1,"31":1,"43":2,"45":2,"102":1,"109":3,"118":1}}],["running",{"2":{"123":5}}],["runs",{"2":{"41":1,"126":1}}],["run",{"2":{"11":2}}],["request",{"2":{"126":1}}],["requestで強制されます",{"2":{"7":1}}],["returns",{"2":{"87":2}}],["returned",{"2":{"41":1}}],["recursive",{"2":{"49":1}}],["recreate",{"2":{"41":1}}],["resources",{"2":{"41":1}}],["reshimコマンドを実行しても問題が解決しない場合",{"2":{"94":1}}],["reshimコマンドのドキュメントをご覧ください",{"2":{"93":1}}],["reshim",{"2":{"41":1,"51":2,"66":2,"114":1}}],["remove",{"0":{"122":1},"2":{"41":3,"49":1,"51":2,"75":2,"102":1,"122":6}}],["registered",{"2":{"41":1}}],["repoアクセスのみをもつ新しいパーソナルトークンを作成してください",{"2":{"129":1}}],["repositoryオプションがyesの場合",{"2":{"76":1}}],["repositoryコマンドを実行してください",{"2":{"49":1}}],["repositoryの節をご覧ください",{"2":{"48":1}}],["repository",{"0":{"48":1,"49":1},"2":{"41":1,"44":2,"59":2,"76":1,"113":1}}],["repo",{"2":{"41":3}}],["readme",{"2":{"14":4}}],["refです",{"2":{"103":2,"121":2}}],["refの値が入ります",{"2":{"103":1}}],["ref>",{"2":{"41":1,"125":1}}],["ref",{"2":{"41":2,"43":2,"78":1,"103":2,"121":3,"125":1}}],["refs",{"2":{"41":1}}],["referenceをご覧ください",{"2":{"13":1}}],["refactor",{"2":{"7":1}}],["revert",{"2":{"7":1}}],["revsを使用して",{"2":{"4":1}}],["revs",{"0":{"4":1},"2":{"4":5}}],["release",{"0":{"46":1},"2":{"7":1,"41":1,"44":1,"59":1}}],["類似ツールであるdocsify",{"2":{"11":1}}],["は必須です",{"2":{"125":1}}],["は公式にはサポートしていません",{"2":{"91":1}}],["は60",{"2":{"48":1}}],["はじめようのガイドで説明されています",{"2":{"62":1}}],["はじめよう",{"0":{"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1}}],["は",{"2":{"11":1}}],["jrubyやrbx",{"2":{"109":1}}],["jのようなフラグを設定する際に便利です",{"2":{"103":1,"107":1}}],["jthegedus",{"2":{"97":1}}],["javascriptのpackage",{"2":{"119":1}}],["javascriptエンジンをベースに構築されたjavascriptランタイムです",{"2":{"10":1}}],["java",{"2":{"72":3}}],["jobs",{"2":{"126":1}}],["john",{"2":{"53":1,"55":1,"56":1}}],["join",{"2":{"22":4,"69":2}}],["jsのバージョン18",{"2":{"106":1,"107":1}}],["jsの依存関係をインストールしてください",{"2":{"10":1}}],["jsやruby",{"2":{"70":1}}],["jsやvuepressに代わってvitepressが採用されたのは",{"2":{"11":1}}],["jsにはnodeとnpmという2つの実行ファイルが提供されています",{"2":{"67":1}}],["js用のプラグインをインストールしたので",{"2":{"27":1}}],["jsをインストール",{"2":{"24":1}}],["jsでは",{"2":{"14":1}}],["js",{"2":{"10":1,"13":3,"14":2,"15":1}}],["jsonや",{"2":{"119":1}}],["jsonのコード",{"2":{"11":1}}],["jsonには",{"2":{"11":1}}],["jsonに下記のように記述します",{"2":{"4":1}}],["jsonをもとに",{"2":{"10":1}}],["json",{"2":{"4":1}}],["破壊的変更を示します",{"2":{"7":1}}],["workflows",{"2":{"126":1}}],["wsl2でテストスイートを実行する予定ですが",{"2":{"92":1}}],["wsl2が正常に動作するのは",{"2":{"92":1}}],["wsl2",{"2":{"92":1}}],["wsl2をサポートしていますか",{"0":{"92":1}}],["wsl1を公式にサポートする予定はありません",{"2":{"91":1}}],["wsl1をサポートしていますか",{"0":{"91":1}}],["wsl1",{"2":{"91":1}}],["where",{"2":{"41":1,"87":1}}],["which",{"2":{"22":1,"41":1,"87":1,"115":1,"116":1}}],["windows",{"2":{"91":1,"92":1}}],["with",{"2":{"7":1,"22":1,"41":3,"51":1,"126":1}}],["will",{"2":{"6":2,"22":1}}],["website",{"2":{"7":2}}],["ubuntu",{"2":{"126":1}}],["ubuntuプロジェクトは",{"2":{"8":1}}],["upgrade",{"2":{"68":2}}],["updated",{"2":{"121":4}}],["updateコマンドによる更新は無効になります",{"2":{"60":1}}],["updateコマンドでasdfを更新する際に",{"2":{"46":1}}],["updates",{"2":{"60":1}}],["update",{"0":{"121":1},"2":{"7":1,"41":8,"51":2,"68":2,"74":3,"102":1,"121":2}}],["util",{"2":{"41":2,"64":1,"115":2,"116":2}}],["utils",{"2":{"41":1}}],["uninstall",{"0":{"117":1},"2":{"41":1,"51":1,"69":5,"86":2,"102":1,"117":2}}],["urlが指定されなかった場合",{"2":{"130":1}}],["urlを決定するために",{"2":{"130":1}}],["urlをもとに直接インストールする方法です",{"2":{"130":1}}],["urlを使用することを推奨します",{"2":{"71":1}}],["urls",{"2":{"41":3,"72":1}}],["url",{"2":{"41":1,"48":1,"49":1,"103":1,"120":1,"125":1}}],["url>",{"2":{"41":1,"71":1,"125":2,"130":1}}],["uz",{"2":{"22":1,"69":1}}],["usage",{"2":{"58":1}}],["uses",{"2":{"126":1}}],["users",{"2":{"85":3}}],["user>",{"2":{"1":1,"10":1}}],["used",{"2":{"41":3}}],["use",{"0":{"46":1},"2":{"22":4,"44":1,"52":1,"59":1,"107":1}}],["us",{"2":{"14":1}}],["overviewを用意する必要があります",{"2":{"111":1,"112":1,"113":1}}],["overview",{"0":{"110":1},"2":{"102":1,"110":1}}],["of",{"2":{"41":9,"107":2}}],["output",{"2":{"41":1,"116":1}}],["one",{"2":{"41":1}}],["on",{"2":{"41":4,"126":2}}],["ohmyzsh",{"2":{"22":4}}],["oh",{"2":{"22":5,"94":1}}],["options",{"2":{"50":1}}],["optionally",{"2":{"41":3}}],["optional",{"2":{"7":2,"41":1}}],["opt",{"2":{"22":9,"69":3}}],["osx",{"2":{"127":1}}],["os",{"2":{"18":1,"22":1,"25":1,"41":1,"65":1,"126":2,"127":1}}],["origin",{"2":{"74":1}}],["org",{"2":{"21":1}}],["or",{"2":{"1":1,"10":1,"22":1,"41":6,"43":1}}],["リンクを1行ごとに出力してください",{"2":{"113":1}}],["リンクを1行ごとに出力します",{"2":{"113":1}}],["リポジトリのショートネームに依存しないために",{"2":{"71":1}}],["リポジトリをご覧ください",{"2":{"16":1}}],["リリース候補版を使用します",{"2":{"46":1}}],["リリース候補版へ更新するか制御します",{"2":{"46":1}}],["リリース",{"0":{"7":1,"12":1}}],["リモートにコミットまたはプッシュする前に",{"2":{"2":1}}],["39cb398vb39",{"2":{"43":1}}],["3",{"0":{"22":1},"2":{"6":1,"43":4,"67":2,"78":1,"85":2,"86":1,"105":1,"109":2,"119":1}}],["3を使用して出力を表示できるため",{"2":{"6":1}}],[">>",{"2":{"22":15}}],[">",{"2":{"6":1,"7":1,"109":3}}],["dylibs",{"2":{"123":1}}],["danhper",{"2":{"97":1}}],["data",{"0":{"56":1},"2":{"49":1,"56":1,"59":2,"69":11,"87":1,"123":5}}],["durationオプションで変更することができます",{"2":{"76":1}}],["duration",{"0":{"48":1},"2":{"44":1,"59":1}}],["during",{"2":{"6":2}}],["doe",{"2":{"53":1,"55":1,"56":1}}],["downloadスクリプトがすでにバージョンをダウンロードしていると想定し",{"2":{"107":1}}],["downloadスクリプトが存在しない場合",{"2":{"107":1}}],["downloadによってソースコードまたはバイナリがダウンロードされる場所へのパスです",{"2":{"103":1}}],["download",{"0":{"47":1,"106":1},"2":{"44":1,"51":1,"59":1,"102":1,"103":1,"106":6,"107":2}}],["dockerイメージ",{"0":{"8":1}}],["documentation",{"2":{"7":1,"41":1,"113":1}}],["docsifyとvitepressがvuepressに急速に取って代わっていた場合には不可能でした",{"2":{"11":1}}],["docs",{"2":{"7":3,"10":1,"12":1,"13":3,"14":2,"41":1}}],["disabled",{"2":{"60":1}}],["disable",{"0":{"49":1},"2":{"44":1,"48":1,"59":1}}],["display",{"2":{"41":4}}],["dirは空であり",{"2":{"59":1}}],["dirは空なので",{"2":{"59":1}}],["directory",{"2":{"58":1,"87":1}}],["direnvプラグインが役に立ちます",{"2":{"88":1}}],["direnvプラグインが存在します",{"2":{"37":1}}],["direnvの動作をasdfに統合するasdf",{"2":{"37":1}}],["direnv",{"0":{"37":1}}],["dirの値を使用します",{"2":{"56":1}}],["dirmngr",{"2":{"25":1}}],["dir=",{"2":{"22":3,"55":1,"56":1}}],["dir",{"0":{"55":1,"56":1},"2":{"22":4,"49":1,"59":2,"60":1,"69":12,"87":1,"123":5,"127":1}}],["dir変数に",{"2":{"2":1}}],["d",{"2":{"22":2,"69":2}}],["dnf",{"2":{"18":2}}],["deps",{"0":{"111":1},"2":{"102":1,"111":1}}],["debug",{"2":{"41":1}}],["debian",{"2":{"25":1}}],["defineconfig",{"2":{"14":1}}],["default",{"0":{"54":1},"2":{"13":1,"14":1,"41":3,"54":1,"59":2}}],["description",{"2":{"12":1,"50":1}}],["description>",{"2":{"7":1}}],["dev",{"2":{"11":1,"89":2}}],["npm",{"2":{"66":2,"67":1,"93":1,"117":1}}],["nproc",{"2":{"50":1}}],["ncpu",{"2":{"50":1}}],["name",{"0":{"49":1},"2":{"41":1,"43":1,"44":1,"48":3,"49":3,"51":4,"59":1,"76":2,"84":1,"99":2,"100":2,"105":1,"109":1,"110":1,"111":1,"112":1,"113":1,"117":1,"120":2,"121":2,"122":2,"125":2,"126":2}}],["name>",{"2":{"41":19,"66":1,"71":2,"74":1,"75":1,"78":1,"79":2,"80":2,"81":2,"82":2,"83":5,"84":1,"85":1,"86":1,"125":2,"127":1,"130":1}}],["nav",{"2":{"14":3}}],["navbars",{"2":{"13":1,"14":3}}],["navバー",{"2":{"13":1,"14":2}}],["nixは",{"2":{"39":1}}],["nixosは",{"2":{"39":2}}],["nixos",{"0":{"39":1}}],["nvm",{"0":{"36":1},"2":{"36":1}}],["nvmrcファイルと",{"2":{"31":1}}],["n$env",{"2":{"22":3}}],["nu",{"2":{"22":3}}],["nuを追加します",{"2":{"22":3}}],["nuにasdf",{"2":{"22":3}}],["nushell",{"2":{"22":6}}],["nsource",{"2":{"22":1}}],["neko",{"2":{"123":1}}],["never",{"2":{"48":1}}],["nexport",{"2":{"22":1}}],["nested",{"2":{"14":2}}],["new",{"2":{"7":1}}],["no",{"2":{"44":4,"45":1,"46":1,"47":1,"49":1,"59":4}}],["node",{"2":{"10":2,"15":1,"27":1,"31":1,"67":2,"85":1,"106":1,"107":1,"125":1}}],["nodejsプラグインをテストするときは",{"2":{"125":1}}],["nodejsプラグインを使用してnode",{"2":{"24":1}}],["nodejsプラグインで",{"2":{"67":1}}],["nodejsのバージョン18",{"2":{"117":1}}],["nodejsの",{"2":{"66":1}}],["nodejsの場合",{"2":{"25":1}}],["nodejsであれば",{"2":{"31":1}}],["nodejsコマンドで確認できますし",{"2":{"27":1}}],["nodejs",{"2":{"10":2,"26":2,"27":2,"29":2,"30":2,"43":2,"66":1,"67":6,"72":3,"85":1,"105":2,"106":1,"107":1,"117":1,"125":2,"130":2}}],["note",{"2":{"40":1}}],["not",{"2":{"6":1}}],["n",{"0":{"36":1},"2":{"6":2,"22":16,"36":1,"128":1}}],["public",{"2":{"129":1}}],["push",{"2":{"126":1}}],["pull",{"2":{"7":1,"126":1}}],["python",{"2":{"43":3,"84":1}}],["pythonのように",{"2":{"29":1}}],["parse",{"0":{"119":1},"2":{"102":1,"119":1}}],["particular",{"2":{"41":1}}],["path>",{"2":{"116":2,"127":1}}],["pathからの相対パスである必要があります",{"2":{"114":1}}],["path環境変数が設定されているかを確認してください",{"2":{"107":1}}],["pathにファイルを配置するようなスクリプトとしてください",{"2":{"107":1}}],["pathのパスのディレクトリにインストールする必要があります",{"2":{"107":1}}],["pathの変更を反映するために",{"2":{"22":1}}],["pathディレクトリに",{"2":{"107":1}}],["pathディレクトリに配置します",{"2":{"106":1}}],["pathディレクトリに配置する必要があります",{"2":{"106":1}}],["pathディレクトリ内に何もファイルを配置しないようにしてください",{"2":{"106":1}}],["pathで指定されたディレクトリに",{"2":{"106":1}}],["pathsスクリプトでカスタマイズできます",{"2":{"107":1}}],["paths",{"0":{"114":1},"2":{"102":1,"114":1}}],["pathコールバックで操作可能",{"2":{"87":1}}],["path",{"0":{"116":1},"2":{"22":8,"41":2,"43":1,"58":1,"87":2,"102":1,"103":3,"105":1,"106":3,"107":4,"109":2,"110":2,"111":2,"112":2,"113":2,"114":6,"115":2,"116":7,"117":1,"118":2,"119":2,"120":2,"121":2,"122":2,"128":1}}],["pacmanやhomebrewのようなパッケージマネージャによって使用され",{"2":{"60":1}}],["pacman",{"2":{"18":2,"21":1,"22":7,"68":1,"69":4}}],["packages",{"2":{"41":3}}],["package",{"2":{"10":1,"11":2,"41":15,"87":1}}],["ps1にasdf",{"2":{"22":1}}],["ps1に下記の行を追記します",{"2":{"22":2}}],["ps1",{"2":{"22":4}}],["post",{"0":{"120":1,"121":1},"2":{"51":3,"102":2,"103":1,"120":3,"121":4,"122":2}}],["posix",{"2":{"22":3}}],["powershell",{"2":{"22":7}}],["portuguese",{"2":{"14":1}}],["p",{"2":{"22":4}}],["project",{"2":{"85":1}}],["proc",{"2":{"50":1}}],["provide",{"2":{"41":1}}],["provided",{"2":{"41":2}}],["profileで",{"2":{"69":2}}],["profile",{"2":{"22":8,"94":1}}],["profileに設定が見つからない場合は",{"2":{"69":1}}],["profileにasdf",{"2":{"22":2}}],["profileに下記の行を追記します",{"2":{"22":4}}],["prev",{"2":{"103":1,"121":1}}],["prepend=no",{"2":{"58":1}}],["prepend",{"0":{"58":1}}],["prepend環境変数で制御できます",{"2":{"22":1}}],["pre",{"0":{"122":1},"2":{"51":5,"102":1,"120":2,"121":2,"122":3}}],["prefix",{"2":{"22":12,"69":6}}],["pr",{"2":{"14":1}}],["print",{"2":{"41":2}}],["printed",{"2":{"6":2}}],["printf",{"2":{"6":2}}],["pt",{"2":{"14":6}}],["perf",{"2":{"7":1}}],["pleaseという自動リリースツールを使用して",{"2":{"7":1}}],["plugins",{"2":{"41":6,"116":1,"123":5}}],["pluginsショートネームリポジトリ",{"2":{"15":1}}],["pluginトピック検索",{"2":{"15":1}}],["plugin",{"0":{"48":1,"49":1,"120":1,"121":1,"122":1},"2":{"1":3,"10":1,"22":1,"26":1,"41":12,"44":2,"48":4,"49":4,"51":6,"59":2,"71":4,"72":4,"73":1,"74":3,"75":2,"76":3,"87":2,"100":1,"102":3,"103":4,"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":2,"117":1,"118":1,"119":1,"120":11,"121":12,"122":10,"125":12,"126":4,"127":2,"130":2}}],["ディレクトリごとに環境変数をロード",{"2":{"37":1}}],["デフォルトは",{"2":{"125":2}}],["デフォルトは~",{"2":{"87":1}}],["デフォルト",{"2":{"115":1,"116":1}}],["デフォルトブランチ",{"2":{"74":1}}],["デフォルトブランチでのコミットメッセージのフォーマットとなる",{"2":{"7":1}}],["デフォルトでは",{"2":{"66":1}}],["デフォルト構成を使用します",{"2":{"59":5}}],["デフォルト構成のconcurrencyの値に依存します",{"2":{"59":1}}],["デフォルトロケーションは",{"2":{"52":1}}],["デフォルトのスクリプトが実装されたプラグインリポジトリ",{"2":{"100":1}}],["デフォルトのシェルがzshに変更されました",{"2":{"69":1}}],["デフォルトのシェルはzshです",{"2":{"22":2}}],["デフォルトのブランチをgitクローンしてください",{"2":{"1":1,"10":1}}],["デバッグが簡単になります",{"2":{"6":1}}],["go言語のgo",{"2":{"119":1}}],["gでグローバルにインストールしたものを含むすべてのshimを削除します",{"2":{"117":1}}],["g",{"2":{"66":1,"93":1}}],["given",{"2":{"41":1}}],["gitref",{"2":{"125":2}}],["gitのref",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["gitのurlからプラグインを追加します",{"2":{"71":1}}],["gitのオプションで",{"2":{"4":1}}],["git経由",{"2":{"68":1}}],["git経由でインストール",{"2":{"59":1}}],["git依存のアップデートコマンドが用意されています",{"2":{"68":1}}],["gitクローン",{"2":{"52":1}}],["gitコマンドを使用した公式ダウンロードの手順を使用することを強く推奨します",{"2":{"21":1}}],["gitlens",{"2":{"4":1}}],["gitignoreコード",{"2":{"3":1}}],["gitignore構成で無視する必要があります",{"2":{"3":1}}],["gitignoreファイルです",{"2":{"3":1}}],["gitignore",{"0":{"3":1}}],["github上でホストされているプラグインをテストするためのgithub",{"2":{"126":1}}],["githubのコントリビューターリスト🙏をご覧ください",{"2":{"98":1}}],["github",{"0":{"16":1,"126":1,"129":1},"2":{"1":6,"7":1,"10":4,"15":1,"20":1,"26":1,"41":2,"71":1,"72":2,"89":2,"92":1,"113":1,"125":1,"126":1,"127":1,"129":1,"130":1}}],["githubでasdfをフォークするか",{"2":{"1":1,"10":1}}],["git",{"0":{"4":1},"2":{"1":7,"4":6,"10":4,"18":6,"20":1,"21":2,"22":8,"26":1,"41":6,"48":1,"49":1,"69":5,"71":2,"72":2,"105":2,"121":1,"125":3,"127":2,"130":1}}],["globalの場合",{"2":{"83":1}}],["globalコマンド",{"2":{"43":1}}],["global",{"2":{"29":1,"41":4,"83":4,"84":1,"87":1,"109":1}}],["gnupg2",{"2":{"25":1}}],["gawk",{"2":{"25":3}}],["gpg",{"2":{"25":2}}],["get",{"2":{"25":1}}],["gt",{"2":{"6":1,"7":2,"12":1,"43":1,"48":3,"49":4,"51":5,"58":1,"66":2,"67":1,"76":1,"84":1,"99":3,"100":2,"105":1,"106":2,"107":3,"109":5,"110":2,"111":2,"112":2,"113":5,"114":3,"115":3,"116":3,"117":2,"120":1,"121":2,"122":1,"125":7}}],["難しいことがあります",{"2":{"6":1}}],["毎回手動でファイルを指定しなくても",{"2":{"4":1}}],["i",{"2":{"117":1}}],["io",{"2":{"113":1}}],["is",{"2":{"43":2}}],["if",{"2":{"41":1,"128":1}}],["information",{"2":{"41":1}}],["info",{"2":{"41":1,"65":1}}],["inside",{"2":{"41":1}}],["installs",{"2":{"116":1}}],["installでソースコードをダウンロードするようにしてください",{"2":{"107":1}}],["installスクリプトを実行します",{"2":{"106":1}}],["installスクリプトがあると想定して",{"2":{"106":1}}],["installation",{"2":{"87":1}}],["installコマンドでダウンロードしたソースコードやバイナリを",{"2":{"47":1}}],["installコマンドを引数を指定せずに実行します",{"2":{"43":1}}],["installed",{"2":{"41":5}}],["install",{"0":{"107":1},"2":{"1":1,"4":1,"10":2,"18":5,"21":1,"25":3,"27":1,"41":10,"43":1,"51":1,"66":1,"78":2,"79":4,"93":1,"99":1,"102":1,"103":4,"106":8,"107":15,"109":6,"110":7,"111":7,"112":7,"113":7,"114":11,"115":5,"116":6,"118":5}}],["in",{"2":{"41":3,"87":1}}],["into",{"2":{"22":2}}],["initialise",{"2":{"22":1}}],["i18nドキュメントには",{"2":{"14":1}}],["i18n",{"0":{"14":1}}],["ideを設定することもできます",{"2":{"4":1}}],["ignorerevsfile",{"2":{"4":1}}],["ignore",{"0":{"4":1},"2":{"4":6}}],["bit",{"2":{"123":2}}],["binディレクトリ内にあるバイナリを探し",{"2":{"114":1}}],["bin内にあるファイルに対して作成されます",{"2":{"107":1}}],["bin",{"0":{"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":2,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1},"2":{"55":1,"59":1,"87":1,"102":18,"103":1,"105":1,"106":1,"107":5,"109":1,"110":1,"111":2,"112":2,"113":2,"114":3,"115":1,"116":5,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"128":1}}],["by",{"2":{"41":1}}],["branches",{"2":{"126":1}}],["branch",{"2":{"20":1,"41":3,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["brazilian",{"2":{"14":1}}],["brew",{"2":{"18":1,"21":1,"22":12,"25":1,"68":2,"69":7}}],["breaking",{"2":{"7":1}}],["br",{"2":{"14":7}}],["build",{"2":{"7":1,"127":1}}],["before",{"2":{"127":1}}],["begins",{"2":{"41":1}}],["being",{"2":{"41":2}}],["be",{"2":{"6":2}}],["blameを呼び出すたびにこのファイルを使うように設定することもできます",{"2":{"4":1}}],["blameを実行するときは",{"2":{"4":1}}],["blameを実行する際のノイズを減らしています",{"2":{"4":1}}],["blameのドキュメントをご覧ください",{"2":{"4":1}}],["blame",{"0":{"4":1},"2":{"4":7}}],["baz`",{"2":{"123":1}}],["baz",{"2":{"123":1}}],["bat",{"2":{"123":6}}],["batsでのデバッグは",{"2":{"6":1}}],["batsのヒント",{"0":{"6":1}}],["batsテスト",{"0":{"5":1},"1":{"6":1}}],["bats",{"2":{"1":3,"2":2,"4":1,"5":1,"6":6}}],["bar`",{"2":{"123":1}}],["bar",{"2":{"51":1,"123":1}}],["barという実行可能ファイルが提供されている場合",{"2":{"51":1}}],["bash`",{"2":{"123":3}}],["bashスクリプトまたは実行ファイルを用意することで",{"2":{"123":1}}],["bash1",{"2":{"119":1}}],["bashbin",{"2":{"114":1}}],["bashgit",{"2":{"111":1,"113":1}}],["bashのスクリプトを実行し",{"2":{"100":1}}],["bashasdf",{"2":{"75":1}}],["bashシェル",{"2":{"59":1}}],["bashシェルでの使用方法について説明します",{"2":{"52":1}}],["bashまたはzshシェルを起動すると",{"2":{"22":1}}],["bashまたはposix準拠のスクリプトを単体テストするための",{"2":{"1":1}}],["bashrcで",{"2":{"69":3}}],["bashrc",{"2":{"22":2}}],["bashrcにasdf",{"2":{"22":1}}],["bashrcに下記の行を追記します",{"2":{"22":3}}],["bashに変更していない限り",{"2":{"22":2}}],["bashで使用されている既存のbatsの設定",{"2":{"5":1}}],["bash",{"2":{"2":4,"5":1,"22":17,"69":14,"94":1,"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":2,"119":1,"120":1,"121":1,"122":1,"123":6}}],["bashをサポートするシェルパーサ",{"2":{"1":1}}],["bash自動テストシステムです",{"2":{"1":1}}],["ツールに関連するユーティリティを提供したり",{"2":{"123":1}}],["ツールによってはこれが望ましくないことがあります",{"2":{"109":1}}],["ツールによってインストールされる実行ファイルのshimを作成するシェルスクリプトです",{"2":{"36":1}}],["ツールがインストール",{"2":{"103":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["ツール名とバージョンの情報を格納するファイルのファイル名です",{"2":{"54":1}}],["ツールは",{"2":{"43":1}}],["ツールのインストール",{"2":{"112":1}}],["ツールの最新バージョンを出力します",{"2":{"109":1}}],["ツールの最新安定バージョンをインストールします",{"2":{"109":1}}],["ツールの最新安定バージョンを標準出力する必要があります",{"2":{"109":1}}],["ツールの最新安定バージョンを判定します",{"2":{"109":1}}],["ツールのローカルバージョンとして",{"2":{"109":1}}],["ツールのグローバルバージョンとして",{"2":{"109":1}}],["ツールのビルドとインストールが成功したとみなされた場合にのみ",{"2":{"107":1}}],["ツールのバイナリのshimを実行する前に環境を準備します",{"2":{"102":1,"115":1}}],["ツールのバージョン管理をサポートするための実行スクリプトを含めたgitリポジトリのことです",{"2":{"99":1}}],["ツールのバージョンを決定します",{"2":{"119":1}}],["ツールのバージョンを決定するために使用されるレガシー構成ファイルのリストを出力します",{"2":{"118":1}}],["ツールのバージョンを読み込むすべてのコマンドから呼び出されます",{"2":{"118":1,"119":1}}],["ツールのバージョンをインストールする場所です",{"2":{"56":1}}],["ツールのバージョンを照会します",{"2":{"28":1}}],["ツールのバージョンマネージャです",{"2":{"40":1}}],["ツールのバージョン",{"2":{"32":1}}],["ツールの特定バージョンにおける",{"2":{"114":1}}],["ツールの特定バージョンを指定された場所にインストールします",{"2":{"107":1}}],["ツールの特定バージョンをアンインストールします",{"2":{"102":1,"117":1}}],["ツールの特定バージョンをインストールします",{"2":{"102":1}}],["ツールの特定バージョンの実行ファイルパスを取得します",{"2":{"116":2}}],["ツールの特定バージョンの実行ファイルパスを出力します",{"2":{"102":1}}],["ツールの特定バージョンのソースコードまたはバイナリを",{"2":{"106":1}}],["ツールの特定バージョンのソースコードまたはバイナリをダウンロードします",{"2":{"102":1}}],["ツールのためのバージョンマネージャです",{"2":{"33":1}}],["ツールごとに用意された既存バージョンファイルの利用",{"0":{"31":1}}],["ツールで指定されたバージョンが見つからない場合",{"2":{"28":1}}],["ツール",{"2":{"3":1,"17":1,"36":2}}],["プルーニングするのに有用です",{"2":{"75":1}}],["プルリクエストをテストする際に便利です",{"2":{"125":1}}],["プルリクエストを作成する前に",{"2":{"2":1}}],["プルリクエストタイトルのconventional",{"2":{"12":1}}],["プルリクエストタイトルのフォーマットを定義しています",{"2":{"7":1}}],["プルリクエストのタイトルには",{"2":{"7":1}}],["プルリクエストのタイトルは",{"2":{"7":1,"12":1}}],["プルリクエスト",{"0":{"7":1,"12":1}}],["プロジェクトのディレクトリに移動した際に自動的に環境変数を設定したい場合は",{"2":{"88":1}}],["プロジェクトのgitリポジトリにチェックインして共有することで",{"2":{"33":1}}],["プロジェクトのgitリポジトリ内となるでしょう",{"2":{"30":1}}],["プロジェクトで使用するツールごとに",{"2":{"32":1}}],["プロジェクトでのnodejsのバージョン管理ができるようになりました",{"2":{"32":1}}],["プロジェクト固有のファイルは無視をしています",{"2":{"3":1}}],["プラグイン内にshims",{"2":{"124":1}}],["プラグイン開発者はこの機能を使って",{"2":{"123":1}}],["プラグインおよび管理されているツールに関する概要説明を出力します",{"2":{"110":1}}],["プラグインおよびツールで設定必須または任意設定可能な構成設定一覧を出力します",{"2":{"112":1}}],["プラグインおよびツールのドキュメントを出力します",{"2":{"110":1,"111":1,"112":1,"113":1}}],["プラグインおよびツールの構成設定一覧を出力します",{"2":{"102":1}}],["プラグインおよびツールに関する概要説明を出力します",{"2":{"102":1}}],["プラグインで使用できます",{"2":{"109":1}}],["プラグインでは",{"2":{"106":1}}],["プラグインソースのurlです",{"2":{"103":1,"120":1}}],["プラグインとツールに関連するリンクリストを出力します",{"2":{"102":1,"113":1}}],["プラグインとは",{"2":{"99":1}}],["プラグインスクリプトの鉄則",{"0":{"101":1}}],["プラグインによってインストールされるものは",{"2":{"93":1}}],["プラグインによってツールがインストールされると",{"2":{"34":1}}],["プラグインがインストールされている場所へのパスです",{"2":{"103":1,"120":1,"121":1,"122":1}}],["プラグインが削除される前に実行されるフックです",{"2":{"102":1}}],["プラグインが更新された後に実行されるフックです",{"2":{"102":1}}],["プラグインが追加された後に実行されるフックです",{"2":{"102":1}}],["プラグインが",{"2":{"78":1,"120":1,"122":1}}],["プラグインはshimで指定された実行ファイルパスを条件付きで上書きして返すか",{"2":{"116":1}}],["プラグインは",{"2":{"70":1}}],["プラグイン名をサブコマンドとして使用し",{"2":{"123":1}}],["プラグイン名と",{"2":{"87":1}}],["プラグイン名",{"2":{"51":1}}],["プラグインコマンドの実行前後",{"2":{"51":1}}],["プラグインフック",{"0":{"51":1}}],["プラグインリポジトリのデフォルトブランチとなります",{"2":{"125":1}}],["プラグインリポジトリの",{"2":{"74":1}}],["プラグインリポジトリのショートネームを指定して追加します",{"2":{"71":1}}],["プラグインリポジトリの初期同期は停止されません",{"2":{"48":1}}],["プラグインリポジトリを削除するには",{"2":{"49":1}}],["プラグインショートネームインデックス",{"0":{"130":1}}],["プラグインショートネームの一覧もご覧ください",{"2":{"73":1}}],["プラグインショートネームリポジトリを無効化しても",{"2":{"49":2}}],["プラグインショートネームリポジトリを無効化します",{"2":{"49":1}}],["プラグインシステムによって多くのツールをサポートしており",{"2":{"40":1}}],["プラグインをテストするためのplugin",{"2":{"125":1}}],["プラグインを削除すると",{"2":{"49":1,"75":1}}],["プラグインを削除するには",{"2":{"49":1}}],["プラグインを作成することで",{"2":{"40":1}}],["プラグインをインストールしてからツールをインストールし",{"2":{"23":1}}],["プラグイン",{"0":{"70":1},"1":{"71":1,"72":1,"73":1,"74":1,"75":1,"76":1},"2":{"32":1}}],["プラグインの場所への相対パスを渡す必要がある場合があります",{"2":{"127":1}}],["プラグインのciにおいて",{"2":{"125":1}}],["プラグインのreadmeには",{"2":{"123":1}}],["プラグインのヘルプを表示するために必要です",{"2":{"110":1}}],["プラグインの以前のgit",{"2":{"103":1,"121":1}}],["プラグインの作成",{"0":{"99":1},"1":{"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1}}],["プラグインの作成をご覧ください",{"2":{"51":1,"70":1}}],["プラグインのexec",{"2":{"87":2}}],["プラグインの同期はトリガーされません",{"2":{"48":1,"49":1}}],["プラグインのフォールバックで使用します",{"2":{"45":1}}],["プラグインのリポジトリを確認しておきましょう",{"2":{"25":1}}],["プラグインの依存関係",{"0":{"25":1}}],["プラグインのインストール",{"0":{"24":1,"26":1},"1":{"25":1,"26":1},"2":{"51":1}}],["新しくインストールされたshimを検知してくれないのですが",{"0":{"94":1}}],["新しくインストールした実行ファイルが実行できないのですが",{"0":{"93":1}}],["新しいasdfコマンドを定義することができます",{"2":{"123":1}}],["新しいpkgbuildをダウンロードしてリビルド",{"2":{"68":1}}],["新しいzshコマンド補完を使用するには",{"2":{"22":2}}],["新しいコードをカバーするようなテストを作成してください",{"2":{"2":1}}],["新たに同期が開始されます",{"2":{"48":1}}],["新機能にとってテストは必要不可欠であり",{"2":{"2":1}}],["ヒント",{"2":{"2":1,"7":1,"43":1,"130":1}}],["xのデフォルト値は60ですが",{"2":{"76":1}}],["x26",{"2":{"2":1,"6":1,"22":2,"69":2}}],["x3c",{"2":{"1":1,"7":3,"10":1,"41":38,"63":1,"64":1,"66":2,"67":1,"71":3,"74":1,"75":1,"78":2,"79":3,"80":3,"81":3,"82":3,"83":13,"84":1,"85":1,"86":2,"116":3,"125":6,"126":1,"127":5,"130":2}}],["faq",{"0":{"90":1},"1":{"91":1,"92":1,"93":1,"94":1}}],["f",{"2":{"69":3}}],["fetch",{"2":{"68":1}}],["feature",{"2":{"7":2}}],["feat",{"2":{"7":4}}],["from",{"2":{"41":1}}],["framework",{"2":{"22":1}}],["fpath経由で",{"2":{"22":2}}],["fpath=",{"2":{"22":1,"69":1}}],["fpath",{"2":{"22":1}}],["fooファイルが存在すれば",{"2":{"124":1}}],["fooという実行ファイルに対して",{"2":{"124":1}}],["fooというプラグインがあるとすると",{"2":{"123":1}}],["fooというプラグインがインストールされていて",{"2":{"51":1}}],["foox",{"2":{"116":1}}],["fooは特定のブランチ",{"2":{"78":1}}],["fooの形式",{"2":{"78":1}}],["foo",{"2":{"14":2,"51":1,"116":4,"123":10}}],["force",{"0":{"58":1},"2":{"22":1,"58":1,"69":5}}],["for",{"2":{"2":1,"7":1,"22":2,"41":7,"91":1,"92":1}}],["format",{"2":{"2":1,"11":1}}],["fork",{"2":{"1":1,"10":1}}],["fi",{"2":{"128":1}}],["filter",{"2":{"41":2}}],["file環境変数は",{"2":{"123":1}}],["file環境変数で設定できます",{"2":{"44":1}}],["fileオプションを有効にしたユーザにのみ適用されます",{"2":{"118":1}}],["fileは空なので",{"2":{"59":1}}],["filenames",{"0":{"118":1},"2":{"102":1,"118":1}}],["filenameは空なので",{"2":{"59":1}}],["filename=tool",{"2":{"54":1}}],["filename",{"0":{"54":1},"2":{"59":1}}],["file=",{"2":{"53":1}}],["file",{"0":{"45":1,"53":1,"119":1},"2":{"4":2,"31":1,"41":2,"44":1,"59":2,"102":1,"103":1,"119":1}}],["fishのsourceが",{"2":{"94":1}}],["fishなど",{"2":{"94":1}}],["fishなどによって",{"2":{"87":1}}],["fishなどをsourceする前に設定する必要があります",{"2":{"52":1}}],["fishをsourceしている行を削除します",{"2":{"69":3}}],["fishで",{"2":{"69":3}}],["fishにasdf",{"2":{"22":1}}],["fishに下記の行を追記します",{"2":{"22":2}}],["fish",{"2":{"22":15,"69":11}}],["fix",{"2":{"2":2,"7":4}}],["same",{"2":{"123":5}}],["save",{"2":{"22":3}}],["subsystem",{"2":{"91":1,"92":1}}],["sysctl",{"2":{"50":1}}],["system",{"2":{"43":2,"84":2}}],["src",{"2":{"43":1}}],["steps",{"2":{"126":1}}],["stdoutまたはstderrへ適切に送信してください",{"2":{"117":1}}],["stableのように",{"2":{"128":1}}],["stable",{"0":{"109":1},"2":{"41":5,"102":1,"109":1}}],["strategy",{"2":{"126":1}}],["stratus3d",{"2":{"97":1}}],["string",{"2":{"22":2,"41":1,"69":2}}],["str",{"2":{"22":2}}],["style",{"2":{"7":1}}],["sort",{"2":{"101":1,"105":3}}],["sourceする必要があります",{"2":{"94":1}}],["source",{"2":{"22":4,"87":2,"103":1,"120":1}}],["some",{"2":{"6":3,"7":3}}],["silent",{"2":{"128":1}}],["si",{"2":{"21":1}}],["sidebar",{"2":{"14":3}}],["sidebars",{"2":{"13":1,"14":3}}],["specified",{"2":{"41":1}}],["specific",{"2":{"2":1,"41":2}}],["specifying",{"2":{"41":1}}],["spack",{"2":{"18":2}}],["ssg",{"2":{"11":1}}],["script",{"2":{"22":1,"87":2,"127":2}}],["scripts",{"2":{"2":3,"5":2}}],["scope",{"2":{"7":1}}],["sed",{"2":{"105":1,"111":1}}],["setup",{"2":{"22":1}}],["set",{"2":{"22":3,"41":7,"69":3}}],["settings",{"2":{"4":1}}],["semantic",{"2":{"7":1}}],["s",{"2":{"6":2,"18":1,"22":5}}],["shやasdf",{"2":{"87":1,"94":1}}],["shをsourceしている行を削除します",{"2":{"69":2}}],["shを追加します",{"2":{"22":6}}],["shおよびコマンド補完をsourceしている行を削除します",{"2":{"69":6}}],["short",{"0":{"49":1},"2":{"44":1,"48":1,"59":1,"76":1}}],["show",{"2":{"41":3}}],["shimで指定されたデフォルトのパスを返してください",{"2":{"116":1}}],["shimで指定されたデフォルトのパスを返すことができます",{"2":{"116":1}}],["shimで指定された実行ファイルパスを条件付きで上書きして返すか",{"2":{"116":1}}],["shimコマンドの実行時に使用される環境において",{"2":{"115":1,"116":1}}],["shimを作成するバイナリが存在するディレクトリへの相対パスの一覧を出力します",{"2":{"102":1}}],["shimを作成しなければならないということをasdfに通知する必要があります",{"2":{"93":1}}],["shimラッパーを経由させずに直接アクセスする必要があります",{"2":{"87":1}}],["shimがラップしているインストール済みパッケージの実行ファイルのパスを渡して",{"2":{"87":1}}],["shim自体は非常に単純なラッパーであり",{"2":{"87":1}}],["shimのバージョン",{"0":{"67":1}}],["shimの再作成",{"0":{"66":1}}],["shimはデフォルトで",{"2":{"107":1}}],["shimはまだ存在しません",{"2":{"66":1}}],["shimはプラグインによってツールのインストール中に作成されます",{"2":{"66":1}}],["shim再生成",{"2":{"51":1}}],["shimsディレクトリ",{"2":{"87":1}}],["shims",{"0":{"87":1},"1":{"88":1},"2":{"41":1,"87":1}}],["shim",{"2":{"33":1,"41":3,"56":1,"67":4}}],["shソース以下にcompinitがくるようにしてください",{"2":{"22":1}}],["sh",{"2":{"22":12,"52":1,"58":1,"69":8,"87":2,"127":1}}],["shgit",{"2":{"4":2}}],["shfmt",{"2":{"1":3}}],["shellcmd=",{"2":{"128":1}}],["shellcheck",{"2":{"1":3}}],["shell$",{"2":{"123":1}}],["shellfoo",{"2":{"123":1}}],["shellusage",{"2":{"116":1}}],["shelluse",{"2":{"69":3}}],["shellの場合",{"2":{"83":1}}],["shellのhomebrewが担います",{"2":{"22":1}}],["shellif",{"2":{"69":2}}],["shellpacman",{"2":{"69":4}}],["shellbrew",{"2":{"69":5}}],["shellrm",{"2":{"69":25}}],["shell➜",{"2":{"67":2}}],["shellexport",{"2":{"22":2}}],["shellecho",{"2":{"22":8}}],["shellmkdir",{"2":{"22":4}}],["shellsource",{"2":{"22":2,"69":3}}],["shellgit",{"2":{"20":1}}],["shelldocs",{"2":{"14":1}}],["shellnpm",{"2":{"10":1,"11":2}}],["shellasdf",{"2":{"1":2,"10":2,"26":1,"27":1,"29":1,"30":1,"63":1,"64":1,"65":1,"66":1,"67":1,"71":2,"72":2,"73":1,"74":2,"78":1,"79":2,"80":2,"81":2,"82":2,"83":2,"84":1,"85":1,"86":1,"125":1,"127":1}}],["shell",{"2":{"1":1,"2":1,"5":1,"6":1,"10":1,"22":16,"41":3,"69":8,"83":1,"87":1,"125":1,"130":1}}],["location",{"2":{"59":1}}],["localの場合",{"2":{"83":1}}],["localコマンド",{"2":{"43":1}}],["local",{"2":{"30":1,"41":4,"83":2,"84":3,"87":1,"109":1}}],["locales",{"2":{"14":1}}],["legacy",{"0":{"45":1,"118":1,"119":1},"2":{"31":1,"59":1,"102":2,"118":1,"119":1}}],["ln",{"2":{"22":4}}],["last",{"0":{"48":1},"2":{"44":1,"59":1,"76":1}}],["latestは",{"2":{"27":1}}],["latest",{"0":{"109":1},"2":{"27":1,"29":1,"30":1,"41":15,"79":4,"82":4,"83":3,"102":1,"106":1,"107":1,"109":9,"125":1,"126":2,"128":1}}],["lang",{"2":{"14":3,"41":1}}],["label",{"2":{"14":3}}],["lt",{"2":{"7":2,"12":1,"43":1,"48":3,"49":4,"51":5,"58":1,"66":2,"67":1,"76":1,"84":1,"99":3,"100":2,"105":1,"106":2,"107":3,"109":5,"110":2,"111":2,"112":2,"113":5,"114":3,"115":3,"116":3,"117":2,"120":1,"121":2,"122":1,"125":7}}],["license",{"2":{"96":1}}],["like",{"2":{"22":1}}],["lib",{"2":{"22":6,"69":3,"123":6}}],["libexec",{"2":{"22":10,"69":4}}],["linkを提供しており",{"2":{"123":1}}],["link",{"2":{"113":2}}],["links",{"0":{"113":1},"2":{"102":1,"113":1}}],["linuxとmacosの両方のci環境でテストすることを推奨します",{"2":{"125":1}}],["linux",{"2":{"18":4,"25":1,"91":1,"92":1,"127":1}}],["lint",{"2":{"2":4}}],["listed",{"2":{"41":1}}],["list",{"0":{"105":1,"114":1,"118":1},"2":{"2":1,"27":2,"41":9,"48":1,"49":1,"72":4,"73":1,"76":1,"80":4,"81":4,"99":1,"102":3,"105":4,"107":1,"109":2,"114":1,"117":1,"118":1,"128":1}}],["luizm",{"2":{"1":2}}],["コピーライト",{"2":{"96":1}}],["コントリビューター",{"0":{"98":1}}],["コントリビューションガイドについては",{"2":{"16":1}}],["コンパイルに必要な環境変数やその他フラグについて説明します",{"2":{"112":1}}],["コンパイルをサポートしている場合",{"2":{"78":1}}],["コンパイル時に使用するデフォルトのコア数です",{"2":{"50":1}}],["コンパイルされます",{"2":{"43":1}}],["コメントを含めることもできます",{"2":{"43":1}}],["コマンドが外部apiへのアクセスに依存している場合",{"2":{"128":1}}],["コマンドで",{"2":{"120":1,"121":1,"122":1}}],["コマンドでは",{"2":{"48":1,"49":1}}],["コマンドへの依存関係を小さく保つようにしてください",{"2":{"101":1}}],["コマンドを実行してください",{"2":{"49":1}}],["コマンドを実行します",{"2":{"43":1}}],["コマンドを使用してください",{"2":{"2":1}}],["コマンドは大きく分けて3つのカテゴリに分けられます",{"2":{"32":1}}],["コマンド補完を削除します",{"2":{"69":1}}],["コマンド補完をセットアップします",{"2":{"22":1}}],["コマンド補完については",{"2":{"69":2}}],["コマンド補完は自動的に設定されます",{"2":{"22":6}}],["コマンド補完は",{"2":{"22":5}}],["コマンド補完が必要な場合は",{"2":{"22":6}}],["コマンド",{"2":{"18":1,"21":1}}],["コミット",{"2":{"43":1}}],["コミットする前にコードをフォーマットするには",{"2":{"11":1}}],["コミュニティ主導の共同プロジェクトです",{"2":{"89":1}}],["コミュニティプロジェクト",{"0":{"89":1}}],["コミュニティプラグインについては",{"2":{"15":1}}],["コミュニティがサポートするダウンロード方法",{"0":{"21":1}}],["コアとなるasdf",{"2":{"110":1}}],["コアとなるasdfのコマンドはかなり少量ですが",{"2":{"61":1}}],["コア",{"0":{"61":1},"1":{"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1}}],["コアのインストールが完了",{"0":{"23":1}}],["コアのコントリビューションガイドのドキュメントに記述されています",{"2":{"12":1}}],["コア開発用のツールは",{"2":{"1":1}}],["コードをローカルでフォーマット",{"2":{"2":1}}],["イントロダクション",{"0":{"33":1},"1":{"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1}}],["インストールしたツールが正しく動作するかを確認するために実行するコマンドです",{"2":{"125":1}}],["インストールした場所や方法",{"2":{"52":1}}],["インストールをする必要があります",{"2":{"107":1}}],["インストールが実行されます",{"2":{"106":1}}],["インストールが成功したら",{"2":{"47":1}}],["インストールされているツールのバージョンに合わせて出力を調整する必要があります",{"2":{"110":1,"111":1,"112":1,"113":1}}],["インストールされているプログラムが当該環境で利用できるようになります",{"2":{"87":1}}],["インストールされたパッケージへのパスを返すため",{"2":{"87":1}}],["インストールされる実行ファイルごとにshimが作成されます",{"2":{"34":1}}],["インストール可能なすべてのバージョンをリストします",{"2":{"102":1,"105":1}}],["インストール可能な全バージョン一覧",{"0":{"81":1}}],["インストール可能なバージョンはasdf",{"2":{"27":1}}],["インストール済みバージョン一覧",{"0":{"80":1}}],["インストール済みプラグイン一覧",{"0":{"72":1}}],["インストール済みのasdfに変更を加えずに",{"2":{"2":1}}],["インストール",{"0":{"62":1}}],["インストール先は$home",{"2":{"59":1}}],["インストール後も",{"2":{"47":1}}],["インタプリタです",{"2":{"1":1}}],["開発ワークフローを簡素化するための単一インターフェースと構成ファイルを提供しており",{"2":{"33":1}}],["開発に必要なスクリプトが含まれています",{"2":{"11":1}}],["開発に必要なバージョンを",{"2":{"10":1}}],["開発用サーバのベースとしたり",{"2":{"8":1}}],["開発",{"0":{"2":1,"11":1},"1":{"3":1,"4":1}}],["開発ツールに影響を与える特定の機能を壊す可能性もあるため",{"2":{"1":1}}],["下記ディレクトリ内のファイルへのshimを作成するよう",{"2":{"114":1}}],["下記コマンドによってトリガーされます",{"2":{"76":1}}],["下記コマンドを実行します",{"2":{"22":3,"30":1}}],["下記コマンドでは",{"2":{"71":1}}],["下記コマンドで",{"2":{"22":12}}],["下記をご覧ください",{"2":{"15":1}}],["下記リンクから",{"2":{"15":1}}],["下記の例では",{"2":{"83":1}}],["下記のタイミングで",{"2":{"51":1}}],["下記の行を追記してください",{"2":{"31":1}}],["下記のフォーマットに従います",{"2":{"7":1}}],["下記のように使用できます",{"2":{"125":1}}],["下記のように指定してください",{"2":{"74":1}}],["下記のようにテストを呼び出します",{"2":{"5":1}}],["下記のように",{"2":{"4":1,"14":1,"59":1,"79":1,"80":1,"81":1,"82":1,"87":1,"119":1}}],["下記のようにインストールします",{"2":{"1":1,"10":1}}],["下記のようにプラグインを追加してください",{"2":{"1":1,"10":1}}],["下記項目を一通り参照してください",{"2":{"5":1}}],["下記は",{"2":{"3":1,"44":1}}],["下記に",{"2":{"1":1}}],["良いかもしれません",{"2":{"1":1}}],["title",{"2":{"113":1}}],["time",{"2":{"107":2}}],["timgluz",{"2":{"1":1}}],["tag",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["tscをパイプで通すだけで十分です",{"2":{"105":1}}],["travis",{"2":{"127":1}}],["travisci",{"0":{"127":1}}],["trash",{"2":{"49":1}}],["truffleruby+graalvm",{"2":{"109":1}}],["truffleruby",{"2":{"109":1}}],["trufflerubyなどの多くのプロバイダのrubyバージョンをリストアップします",{"2":{"109":1}}],["trim",{"2":{"22":2}}],["txt1",{"2":{"105":1}}],["txtlegacy",{"2":{"44":1}}],["txtmanage",{"2":{"41":1}}],["that",{"2":{"41":2}}],["this",{"2":{"22":1,"43":2}}],["then",{"2":{"128":1}}],["they",{"2":{"41":1}}],["themeconfig",{"2":{"14":3}}],["theme",{"2":{"13":1}}],["the",{"2":{"6":1,"7":1,"41":28,"87":1}}],["type環境変数の値を使用してください",{"2":{"110":1,"111":1,"112":1,"113":1}}],["type=refの場合",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["type=versionの場合",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["typeに応じてフルバージョンナンバーまたはgit",{"2":{"103":1}}],["typeをdocsとして",{"2":{"12":1}}],["type",{"2":{"7":1,"103":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["types",{"2":{"7":1}}],["type>",{"2":{"7":1}}],["templateリポジトリを使用し",{"2":{"100":1}}],["textpre",{"2":{"51":1}}],["terminalで説明されています",{"2":{"6":1}}],["testコマンドを用意しており",{"2":{"125":1}}],["tests",{"2":{"2":1,"6":3}}],["test",{"2":{"2":4,"4":1,"5":3,"6":3,"7":1,"83":1,"125":6,"126":6,"127":2}}],["tokenを利用する際は",{"2":{"129":1}}],["token",{"0":{"129":1},"2":{"128":3}}],["toctou",{"2":{"107":1}}],["to",{"2":{"6":1,"22":1,"41":8,"58":1,"87":2,"107":1}}],["tool>",{"2":{"126":1,"127":2}}],["tools",{"2":{"114":2}}],["tool",{"0":{"43":1,"54":1},"2":{"1":1,"10":1,"17":1,"28":1,"29":2,"30":2,"33":1,"34":1,"41":4,"42":1,"43":9,"45":1,"54":3,"59":4,"69":14,"83":6,"85":3,"87":1,"100":2,"106":2,"107":3,"109":3,"114":2,"120":1,"121":1,"122":1,"125":4,"127":2}}],["t",{"2":{"6":1}}],["tフラグを指定してtap出力を有効にすると",{"2":{"6":1}}],["another",{"2":{"43":1}}],["an",{"2":{"41":2}}],["and",{"2":{"22":2,"41":9}}],["at",{"2":{"41":1}}],["as",{"2":{"41":1,"123":5}}],["asdf拡張コマンドに関することを必ず記載するようにしてください",{"2":{"123":1}}],["asdf自体のコマンド拡張プラグインを作成したりすることができます",{"2":{"123":1}}],["asdf自身でこれらのツールを管理したい場合は",{"2":{"1":1}}],["asdfコマンドラインインターフェースを通して呼び出すことのできるlib",{"2":{"123":1}}],["asdfコアはbin",{"2":{"109":1}}],["asdfコアは各バージョンを1行ずつ表示するため",{"2":{"105":1}}],["asdfコアでは",{"2":{"89":1}}],["asdfコアチームが把握している限り",{"2":{"124":1}}],["asdfコアチームは",{"2":{"89":1}}],["asdfコアチームでは",{"2":{"15":1}}],["asdfコアの禁止コマンド一覧もご覧ください",{"2":{"101":1}}],["asdfコアのダウンロード",{"2":{"17":1}}],["asdfコアのコントリビューションガイドです",{"2":{"0":1}}],["asdfへ指示されます",{"2":{"114":1}}],["asdfからの呼び出しシグネチャ",{"2":{"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["asdfから呼び出せるスクリプトの全リストです",{"2":{"102":1}}],["asdfモジュールを削除します",{"2":{"69":3}}],["asdfモジュールを使用している行を削除します",{"2":{"69":3}}],["asdfをアンインストールするには以下の手順に従ってください",{"2":{"69":1}}],["asdfをシンプルにセットアップしたとします",{"2":{"59":1}}],["asdfを使用しないほうが",{"2":{"1":1}}],["asdfディレクトリを削除します",{"2":{"69":9}}],["asdfディレクトリを強制的にpathの先頭に配置することは",{"2":{"58":1}}],["asdfディレクトリを強制的にpathの先頭に配置します",{"2":{"58":1}}],["asdfディレクトリが存在すればその場所",{"2":{"56":1}}],["asdf構成ファイルのconcurrencyの値が使用されます",{"2":{"57":1}}],["asdf構成ファイルのconcurrencyの値よりも優先されます",{"2":{"57":1}}],["asdf実行ファイルの親ディレクトリが使用されます",{"2":{"55":1}}],["asdfが管理しているツールによって実行ファイルがインストールされた場合は",{"2":{"93":1}}],["asdfが管理していない",{"2":{"43":1}}],["asdfがパッケージをインストールすると",{"2":{"87":1}}],["asdfがnode",{"2":{"70":1}}],["asdfが使用されます",{"2":{"59":1}}],["asdfがプラグイン",{"2":{"56":1}}],["asdfが役に立つようになるのは",{"2":{"23":1}}],["asdfrc内のlegacy",{"2":{"118":1}}],["asdfrc内に",{"2":{"31":1}}],["asdfrcファイルのplugin",{"2":{"76":1}}],["asdfrcファイルは何もカスタマイズしていない",{"2":{"59":1}}],["asdfrcをカスタマイズしていないので",{"2":{"59":5}}],["asdfrcが使用されます",{"2":{"59":1}}],["asdfrcの値が使用されます",{"2":{"53":1}}],["asdfrc構成ファイルへのパスです",{"2":{"53":1}}],["asdfrcに構成ファイルを配置します",{"2":{"44":1}}],["asdfrcでは",{"2":{"44":1}}],["asdfrc",{"0":{"44":1},"1":{"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1},"2":{"53":1,"59":1,"69":14}}],["asdfrcや環境変数によってカスタマイズ可能なユーザ固有の設定とがあります",{"2":{"42":1}}],["asdfによって発見されたレガシーファイルをパースして",{"2":{"119":1}}],["asdfによって管理されているすべてのツールの最新バージョンと",{"2":{"109":1}}],["asdfによって実行されます",{"2":{"99":1}}],["asdfによってdocs",{"2":{"10":1}}],["asdfに関するよくある質問を紹介します",{"2":{"90":1}}],["asdfに関連するコミュニティプロジェクトをいくつか紹介します",{"2":{"89":1}}],["asdfには",{"2":{"68":1}}],["asdfには使いこなすと便利なコマンドが他にもいっぱいあり",{"2":{"32":1}}],["asdfに対して",{"2":{"29":1}}],["asdfで用意されているwhichおよびwhereコマンドは",{"2":{"87":1}}],["asdfで管理されているバージョンではなく",{"2":{"84":1}}],["asdfで管理するツールを実行した際に",{"2":{"28":1}}],["asdfで利用可能なすべてのコマンドの一覧です",{"2":{"41":1}}],["asdfでそのようなことはできません",{"2":{"39":1}}],["asdfではなくシステムが管理するツールが既にインストールされていることがあります",{"2":{"29":1}}],["asdfでは正確なバージョン番号を指定してください",{"2":{"27":1}}],["asdfでは",{"2":{"4":1,"124":1,"125":1}}],["asdfプラグインリポジトリをクローンまたは更新します",{"2":{"49":1}}],["asdfプラグインリポジトリの同期間隔",{"2":{"48":1}}],["asdfプラグインの長期的なメンテナンスを目的とした",{"2":{"89":1}}],["asdfプラグインの長期的なメンテナンスを目的としたコミュニティ主導の共同プロジェクトです",{"2":{"15":1}}],["asdfプラグインのショートネームリポジトリの同期を無効化します",{"2":{"49":1}}],["asdfプラグインは",{"2":{"22":2}}],["asdf~",{"2":{"22":6,"69":6}}],["asdfの各種コマンドでgit",{"2":{"130":1}}],["asdfの実行に代わって",{"2":{"123":1}}],["asdfのasdf",{"2":{"120":1,"121":1,"122":1}}],["asdfのオーサーおよびコントリビューターの皆様に感謝を申し上げます",{"2":{"95":1}}],["asdfのshimのバイパス",{"0":{"88":1}}],["asdfのshimやパスのディレクトリをpathの先頭",{"2":{"58":1}}],["asdfのすべての構成ファイルを削除するために次のコマンドを実行します",{"2":{"69":14}}],["asdfの親ディレクトリが使用されます",{"2":{"59":1}}],["asdfの上側に設定します",{"2":{"52":1}}],["asdfの構成設定には",{"2":{"42":1}}],["asdfの構成設定ファイルである$home",{"2":{"31":1}}],["asdfのコアスクリプト場所です",{"2":{"55":1}}],["asdfのコア",{"2":{"32":1}}],["asdfのコアのインストールは完了です🎉",{"2":{"23":1}}],["asdfの入門は完了です🎉",{"2":{"32":1}}],["asdfのスクリプトは",{"2":{"22":1}}],["asdfのダウンロード",{"0":{"19":1},"1":{"20":1,"21":1}}],["asdfの動作にはgitおよびcurlが必要です",{"2":{"18":1}}],["asdfのインストール",{"0":{"22":1},"2":{"17":1}}],["asdfのインストールには次の手順が必要です",{"2":{"17":1}}],["asdfの開発に必要なバージョンを",{"2":{"1":1}}],["asdfドキュメントサイトを構築するために使用している静的サイトジェネレータ",{"2":{"11":1}}],["asdfは正確なgit",{"2":{"130":1}}],["asdfは正常に動作しない可能性があります",{"2":{"91":1}}],["asdfは標準shimテンプレートを使用する代わりに",{"2":{"124":1}}],["asdfは当該スクリプトをbashスクリプトとしてsourceします",{"2":{"123":1}}],["asdfは単純にレガシーファイルをcatしてバージョンを決定します",{"2":{"119":1}}],["asdfはbin",{"2":{"106":1}}],["asdfはshimを使って実行ファイルを管理しています",{"2":{"93":1}}],["asdfはデフォルトで$",{"2":{"44":1}}],["asdfはシステムのパッケージマネージャになることを目指してはいません",{"2":{"40":1}}],["asdfはなるべく依存関係のリストを小さく保つように努めています",{"2":{"38":1}}],["asdfは上位の依存関係を管理することはしませんし",{"2":{"38":1,"39":1}}],["asdfは環境変数を管理することはしませんが",{"2":{"37":1}}],["asdfはプラグインシステムを採用し",{"2":{"36":1}}],["asdfはこれらのツールと非常に似ていて",{"2":{"36":1}}],["asdfは",{"2":{"7":1,"12":1,"28":1,"31":1,"33":2,"40":1,"114":1}}],["asdfリポジトリの",{"2":{"3":1}}],["asdf",{"0":{"0":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"123":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1},"2":{"1":9,"3":1,"8":1,"10":6,"15":3,"16":1,"20":3,"21":3,"22":92,"24":1,"25":1,"26":2,"28":1,"31":1,"32":1,"41":42,"43":3,"44":1,"46":1,"47":1,"48":3,"49":4,"50":1,"51":4,"52":2,"53":2,"54":1,"55":2,"56":2,"57":1,"58":3,"59":10,"60":2,"67":3,"68":5,"69":88,"71":3,"72":5,"74":1,"75":1,"76":2,"78":1,"79":2,"80":2,"81":2,"82":2,"83":7,"84":1,"85":3,"86":1,"87":6,"88":1,"89":2,"93":1,"94":2,"99":1,"100":3,"103":11,"105":3,"106":13,"107":15,"109":13,"110":7,"111":7,"112":7,"113":7,"114":11,"115":8,"116":10,"117":2,"118":5,"120":6,"121":7,"122":5,"123":6,"125":9,"126":4,"127":6,"130":4}}],["authorization",{"2":{"128":1}}],["autoremove",{"2":{"69":1}}],["auto",{"2":{"44":1,"50":1,"59":1}}],["autoload",{"2":{"22":1,"69":1}}],["aurパッケージのインストール時に自動的に設定されます",{"2":{"22":1}}],["aur",{"2":{"21":1,"52":1}}],["api",{"0":{"129":1},"2":{"128":2,"129":1}}],["apiレート制限",{"0":{"128":1},"1":{"129":1}}],["append",{"2":{"22":4}}],["apt",{"2":{"18":1,"25":1}}],["aptitude",{"2":{"18":1}}],["are",{"2":{"41":1}}],["args",{"2":{"41":1,"51":1,"63":1,"115":1,"116":1}}],["arg",{"2":{"22":6,"69":6}}],["archlinux",{"2":{"21":1}}],["always",{"0":{"47":1},"2":{"44":1,"59":1}}],["almalinux",{"2":{"25":1}}],["alpineおよびasdf",{"2":{"8":1}}],["allやbin",{"2":{"128":1}}],["allの出力をtailした結果をもとに判定しますが",{"2":{"109":1}}],["all",{"0":{"105":1},"2":{"2":1,"27":2,"41":9,"48":1,"49":1,"73":1,"74":1,"76":1,"81":4,"99":1,"102":1,"105":4,"109":2,"117":1}}],["a",{"2":{"7":1,"22":1,"41":15,"43":2}}],["actionを提供しています",{"2":{"126":1}}],["actionsリポジトリでは",{"2":{"126":1}}],["actionsでホストランナーのサポートが可能になれば",{"2":{"92":1}}],["actions",{"0":{"16":1},"2":{"16":1,"126":1}}],["action",{"0":{"126":1},"2":{"7":1}}],["actionamannn",{"2":{"7":1}}],["amp",{"0":{"9":1,"62":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1},"2":{"6":1,"21":4,"22":23,"69":14}}],["advanced",{"2":{"4":1}}],["add",{"0":{"120":1},"2":{"1":3,"10":1,"26":1,"41":3,"48":2,"49":2,"51":2,"71":4,"76":1,"102":1,"120":6,"130":2}}],["veggies",{"2":{"114":2}}],["versionまたは",{"2":{"125":1}}],["versionまたはrefです",{"2":{"103":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["versionおよびasdf",{"2":{"110":1,"111":1,"112":1,"113":1}}],["versionのような",{"2":{"102":1}}],["version=1",{"2":{"83":1}}],["versionという環境変数で設定することができます",{"2":{"83":1}}],["versionという環境変数に設定され",{"2":{"83":1}}],["versionなど",{"2":{"45":1}}],["version`",{"2":{"41":1}}],["version>",{"2":{"41":13,"66":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":8,"86":1,"125":1}}],["version",{"0":{"45":1},"2":{"31":1,"41":23,"44":1,"59":1,"66":2,"87":1,"99":1,"103":1,"105":1,"106":3,"107":3,"109":2,"110":2,"111":2,"112":2,"113":2,"114":3,"115":1,"116":1,"117":1,"118":3,"125":4,"126":1,"127":2}}],["versionファイルを読み込みます",{"2":{"45":1}}],["versionファイルといったものを排除しています",{"2":{"36":1}}],["versionファイルの両方に対応しています",{"2":{"31":1}}],["versionファイル",{"2":{"31":1}}],["versionsは下記のような一覧を返します",{"2":{"67":1}}],["versionsが使用されます",{"2":{"59":1}}],["versionsの値が使用されます",{"2":{"54":1}}],["versionsを使用します",{"2":{"45":1}}],["versionsに下記の行を追記します",{"2":{"43":1}}],["versions",{"0":{"43":1,"54":1},"2":{"33":1,"41":10,"54":2,"59":3,"67":3,"69":14,"85":3}}],["versions内には次のように書き込まれます",{"2":{"29":1,"30":1}}],["versionsファイルについて詳しくは",{"2":{"83":1}}],["versionsファイルに書き込まれます",{"2":{"83":2}}],["versionsファイルを無視したい場合を除き",{"2":{"54":1}}],["versionsファイルを含むディレクトリで",{"2":{"43":2}}],["versionsファイルをもとに",{"2":{"28":1}}],["versionsファイル内は下記のような記述となっています",{"2":{"43":1}}],["versionsファイルがディレクトリに存在する場合",{"2":{"43":1}}],["versionsファイルと",{"2":{"42":1}}],["versionsファイル",{"2":{"30":1}}],["versionsファイルで指定されたもの",{"2":{"87":1}}],["versionsファイルで指定されたバージョンでインストールされます",{"2":{"43":1}}],["versionsファイルでサポートされているものと同じです",{"2":{"83":1}}],["versionsファイルで定義されている単一のツールをインストールするには",{"2":{"43":1}}],["versionsファイルで定義されているすべてのツールをインストールするには",{"2":{"43":1}}],["versionsファイルで設定できます",{"2":{"43":1}}],["versionsファイルで",{"2":{"17":1}}],["versionsで定義されているバージョンをasdfが認識して",{"2":{"34":1}}],["versionsで定義されています",{"2":{"1":1}}],["versionsで管理されます",{"2":{"29":1}}],["versionsで管理されています",{"2":{"10":1}}],["v",{"2":{"113":1}}],["vlang",{"2":{"113":2}}],["vは移植性が無いため",{"2":{"105":1}}],["vなどです",{"2":{"101":1}}],["vic",{"2":{"71":1,"97":1}}],["vitepressは",{"2":{"14":1}}],["vitepressのドキュメントをご覧ください",{"2":{"13":1}}],["vitepress",{"0":{"13":1},"2":{"11":1,"13":3,"14":2}}],["v1",{"2":{"43":1}}],["var",{"2":{"22":3,"69":3}}],["v0",{"2":{"20":1}}],["v2",{"2":{"11":1,"105":1,"126":1}}],["vscode",{"2":{"4":2}}],["vmドキュメントですでに説明されている情報は出力しないでください",{"2":{"110":1}}],["vm",{"2":{"1":1,"3":1,"10":2,"20":1,"21":2,"22":9,"26":1,"41":2,"69":7,"72":1,"100":1,"125":1,"126":2,"127":1,"130":1}}],["ここに掲載されているものに関連する品質やセキュリティについては責任を負いません",{"2":{"89":1}}],["ここまでで",{"2":{"32":1}}],["ここでは",{"2":{"90":1}}],["ここではデモとして",{"2":{"24":1}}],["ここでの設定方法が変わります",{"2":{"22":1}}],["これを軽減するため",{"2":{"128":1}}],["これを回避するため",{"2":{"22":1}}],["これにより",{"2":{"116":1}}],["これで",{"2":{"23":1}}],["これらのスクリプトは",{"2":{"99":1}}],["これらのプロジェクトやコードを所有していません",{"2":{"89":1}}],["これらのプラグインのメンテナンスおよび改善にご協力いただける方を",{"2":{"15":1}}],["これらの実行ファイルはプラグインのライフサイクルを通してインストールされないため",{"2":{"66":1}}],["これらの実行ファイルを実行しようとすると",{"2":{"34":1}}],["これらの構成設定に関する公式ドキュメントは",{"2":{"13":1}}],["これらのdockerイメージは",{"2":{"8":1}}],["これ以外の機能セットはほとんど同じで",{"2":{"11":1}}],["これはプラグイン単位でのサポートです",{"2":{"31":1}}],["これは",{"2":{"0":1,"7":1,"9":1,"11":1,"22":1,"60":1,"75":1,"125":1}}],["このトークンをciパイプライン環境変数に追加してください",{"2":{"129":1}}],["この機能は公式プラグインであるelixirプラグインでのみ使用されています",{"2":{"124":1}}],["この機能は賢く使う必要があります",{"2":{"124":1}}],["この機能使ったプラグインの素晴らしい例です",{"2":{"123":1}}],["このプラグインは",{"2":{"123":1}}],["この内容は",{"2":{"118":1}}],["このクエリは",{"2":{"109":1}}],["この動作は",{"2":{"107":1}}],["この動作については",{"2":{"48":1}}],["このスクリプトの出力を考慮するために",{"2":{"111":1,"112":1,"113":1}}],["このスクリプトは",{"2":{"109":1,"110":1,"119":1,"120":1,"121":1,"122":1}}],["このスクリプトはすべてのプラグインで",{"2":{"106":1}}],["このスクリプトでは",{"2":{"107":1}}],["このスクリプトで返されるすべてのバージョンから",{"2":{"105":1}}],["このスクリプトで返されるすべてのバージョンを",{"2":{"105":1}}],["このスクリプトが呼び出される前に",{"2":{"119":1}}],["このスクリプトが存在しない場合",{"2":{"106":1,"109":1,"114":1,"119":1}}],["このスクリプトが導入される以前の",{"2":{"106":1}}],["このスクリプトを呼び出すコマンド",{"2":{"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1}}],["このスクリプトをsourceし",{"2":{"22":1}}],["このスクリプトに環境変数は提供されません",{"2":{"105":1,"117":1}}],["このページを借りて",{"2":{"95":1}}],["この状況を解決するのに役立ちます",{"2":{"87":1}}],["このディレクトリが",{"2":{"87":1}}],["この更新コマンドは",{"2":{"74":1}}],["この節では",{"2":{"60":1}}],["この節の最後にあるpath",{"2":{"22":1}}],["この環境変数の値は",{"2":{"57":1}}],["この値を変更するべきではありません",{"2":{"54":1}}],["このキーワードを指定した場合",{"2":{"43":1}}],["この一覧は",{"2":{"41":1}}],["このサポートを有効にするには",{"2":{"31":1}}],["このツールの特定のバージョンをインストールしましょう",{"2":{"27":1}}],["このフォーマットに従う必要があります",{"2":{"7":1}}],["このファイルが存在する場合",{"2":{"60":1}}],["このファイルを使用するように",{"2":{"4":1}}],["このファイルと共に使います",{"2":{"4":1}}],["この情報は",{"2":{"7":1}}],["このリポジトリの指示に従うことで",{"2":{"130":1}}],["このリポジトリの",{"2":{"1":1}}],["c",{"2":{"127":1}}],["cmd=",{"2":{"128":2}}],["cmd",{"2":{"103":1,"123":1}}],["cliの拡張コマンド",{"0":{"123":1}}],["cliなどのツールは",{"2":{"66":1}}],["clone",{"2":{"1":4,"10":4,"20":1,"21":1,"127":1}}],["cpuinfo",{"2":{"50":1}}],["call",{"2":{"116":1}}],["capabilityを使用する",{"2":{"105":1}}],["catalina以降では",{"2":{"69":1}}],["catalina以降を使用している場合",{"2":{"22":2}}],["candidates",{"0":{"46":1},"2":{"44":1,"59":1}}],["centos",{"2":{"25":1}}],["cd",{"2":{"21":1}}],["currently",{"2":{"41":1}}],["current",{"2":{"41":7,"85":4,"87":1}}],["currentコマンドを実行すると",{"2":{"28":1}}],["curl",{"2":{"18":6,"25":2,"111":1,"128":1}}],["customarguments",{"2":{"4":1}}],["ci",{"2":{"7":1}}],["chromeのv8",{"2":{"10":1}}],["chore",{"2":{"7":1}}],["change",{"2":{"7":2}}],["changelogを生成しています",{"2":{"7":1}}],["check",{"0":{"48":1},"2":{"2":1,"44":1,"59":1,"76":1,"107":1}}],["codespacesでasdfによるツール管理をサポートする",{"2":{"89":1}}],["cool",{"2":{"85":1}}],["container",{"2":{"89":2}}],["concurrencyは空なので",{"2":{"59":1}}],["concurrency=32",{"2":{"57":1}}],["concurrency環境変数が設定されている場合はそちらが優先されます",{"2":{"50":1}}],["concurrency",{"0":{"50":1,"57":1},"2":{"44":1,"59":1,"103":1,"107":1}}],["conventional",{"0":{"7":1,"12":1},"2":{"7":3,"12":1}}],["config",{"0":{"53":1,"112":1},"2":{"4":1,"13":1,"14":2,"22":38,"44":1,"53":2,"55":1,"59":2,"69":13,"94":1,"102":1,"112":1}}],["coreutils",{"2":{"18":2}}],["coreドキュメント内のprinting",{"2":{"6":1}}],["coreのドキュメント",{"2":{"5":1}}],["coreのドキュメントもご覧ください",{"2":{"2":1}}],["core",{"2":{"1":1,"22":3}}],["compinitのセットアップをカスタマイズしている場合は",{"2":{"22":1}}],["compinit",{"2":{"22":3,"69":2}}],["completer~",{"2":{"22":3,"69":3}}],["completer",{"2":{"22":3,"69":3}}],["completionをインストールします",{"2":{"22":1}}],["completion",{"2":{"22":5,"69":5}}],["completions",{"2":{"22":9,"69":4}}],["community",{"2":{"89":1}}],["communityオーガナイゼーション",{"2":{"15":1}}],["comment",{"2":{"43":2}}],["commitは",{"2":{"7":1}}],["commit",{"2":{"7":2,"12":1,"41":2,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["commitsに依存する自動リリースパイプラインを使用しています",{"2":{"12":1}}],["commits",{"0":{"7":1,"12":1}}],["command>",{"2":{"41":4,"63":1,"64":1,"67":1,"116":1,"127":1}}],["commands",{"2":{"2":1,"123":7}}],["command",{"2":{"2":1,"4":1,"41":3,"51":1,"67":1,"115":3,"116":3,"123":10,"125":3,"126":1}}],["com",{"2":{"1":5,"10":3,"20":1,"26":1,"41":2,"71":1,"72":2,"113":1,"125":1,"127":1,"130":1}}],["初期セットアップ",{"0":{"1":1,"10":1}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/@localSearchIndexko-kr.B6cKja34.js b/assets/chunks/@localSearchIndexko-kr.B6cKja34.js new file mode 100644 index 00000000..ed1eabfc --- /dev/null +++ b/assets/chunks/@localSearchIndexko-kr.B6cKja34.js @@ -0,0 +1 @@ +const t='{"documentCount":131,"nextId":131,"documentIds":{"0":"/ko-kr/contribute/core.html#asdf","1":"/ko-kr/contribute/core.html#초기-설정","2":"/ko-kr/contribute/core.html#개발","3":"/ko-kr/contribute/core.html#gitignore","4":"/ko-kr/contribute/core.html#git-blame-ignore-revs","5":"/ko-kr/contribute/core.html#bats-테스팅","6":"/ko-kr/contribute/core.html#bats-팁","7":"/ko-kr/contribute/core.html#풀-리퀘스트-릴리스-관습적-커밋","8":"/ko-kr/contribute/core.html#docker-이미지","9":"/ko-kr/contribute/documentation.html#문서-사이트","10":"/ko-kr/contribute/documentation.html#초기-세팅","11":"/ko-kr/contribute/documentation.html#개발","12":"/ko-kr/contribute/documentation.html#풀-리퀘스트-릴리스-관습적-커밋","13":"/ko-kr/contribute/documentation.html#vitepress","14":"/ko-kr/contribute/documentation.html#i18n","15":"/ko-kr/contribute/first-party-plugins.html#공식-플러그인","16":"/ko-kr/contribute/github-actions.html#github-actions","17":"/ko-kr/guide/getting-started.html#시작하기","18":"/ko-kr/guide/getting-started.html#_1-dependencies-설치","19":"/ko-kr/guide/getting-started.html#_2-asdf-다운로드","20":"/ko-kr/guide/getting-started.html#공식-다운로드","21":"/ko-kr/guide/getting-started.html#커뮤니티-지원-다운로드-방법","22":"/ko-kr/guide/getting-started.html#_3-asdf-설치","23":"/ko-kr/guide/getting-started.html#코어-설치-완료","24":"/ko-kr/guide/getting-started.html#_4-플러그인-설치","25":"/ko-kr/guide/getting-started.html#플러그인-dependencies","26":"/ko-kr/guide/getting-started.html#플러그인-설치","27":"/ko-kr/guide/getting-started.html#_5-버전-설치","28":"/ko-kr/guide/getting-started.html#_6-버전-설정","29":"/ko-kr/guide/getting-started.html#글로벌","30":"/ko-kr/guide/getting-started.html#로컬","31":"/ko-kr/guide/getting-started.html#기존의-툴-버전-파일들-사용하기","32":"/ko-kr/guide/getting-started.html#가이드-끝","33":"/ko-kr/guide/introduction.html#소개","34":"/ko-kr/guide/introduction.html#작동방식","35":"/ko-kr/guide/introduction.html#관련된-프로젝트","36":"/ko-kr/guide/introduction.html#nvm-n-rbenv-등","37":"/ko-kr/guide/introduction.html#direnv","38":"/ko-kr/guide/introduction.html#homebrew","39":"/ko-kr/guide/introduction.html#nixos","40":"/ko-kr/guide/introduction.html#왜-asdf를-사용할까요","41":"/ko-kr/manage/commands.html#모든-명령어","42":"/ko-kr/manage/configuration.html#설정","43":"/ko-kr/manage/configuration.html#tool-versions","44":"/ko-kr/manage/configuration.html#asdfrc","45":"/ko-kr/manage/configuration.html#legacy-version-file","46":"/ko-kr/manage/configuration.html#use-release-candidates","47":"/ko-kr/manage/configuration.html#always-keep-download","48":"/ko-kr/manage/configuration.html#plugin-repository-last-check-duration","49":"/ko-kr/manage/configuration.html#disable-plugin-short-name-repository","50":"/ko-kr/manage/configuration.html#concurrency","51":"/ko-kr/manage/configuration.html#플러그인-훅","52":"/ko-kr/manage/configuration.html#환경-변수","53":"/ko-kr/manage/configuration.html#asdf-config-file","54":"/ko-kr/manage/configuration.html#asdf-default-tool-versions-filename","55":"/ko-kr/manage/configuration.html#asdf-dir","56":"/ko-kr/manage/configuration.html#asdf-data-dir","57":"/ko-kr/manage/configuration.html#asdf-concurrency","58":"/ko-kr/manage/configuration.html#asdf-force-prepend","59":"/ko-kr/manage/configuration.html#전체-설정의-예시","60":"/ko-kr/manage/configuration.html#내부-설정","61":"/ko-kr/manage/core.html#코어","62":"/ko-kr/manage/core.html#설치-설정","63":"/ko-kr/manage/core.html#실행","64":"/ko-kr/manage/core.html#환경-변수","65":"/ko-kr/manage/core.html#정보","66":"/ko-kr/manage/core.html#shim-재생성","67":"/ko-kr/manage/core.html#shim-버전","68":"/ko-kr/manage/core.html#업데이트","69":"/ko-kr/manage/core.html#제거","70":"/ko-kr/manage/plugins.html#플러그인","71":"/ko-kr/manage/plugins.html#추가하기","72":"/ko-kr/manage/plugins.html#설치된-목록","73":"/ko-kr/manage/plugins.html#모든-short-name-리포지토리-목록","74":"/ko-kr/manage/plugins.html#업데이트","75":"/ko-kr/manage/plugins.html#제거","76":"/ko-kr/manage/plugins.html#asdf-short-name-리포지토리-동기화","77":"/ko-kr/manage/versions.html#버전","78":"/ko-kr/manage/versions.html#버전-설치","79":"/ko-kr/manage/versions.html#최신-안정-버전-설치","80":"/ko-kr/manage/versions.html#설치된-버전-목록","81":"/ko-kr/manage/versions.html#사용-가능한-모든-버전-목록","82":"/ko-kr/manage/versions.html#최신-안정-버전-보기","83":"/ko-kr/manage/versions.html#현재-버전-설정","84":"/ko-kr/manage/versions.html#시스템-버전으로의-폴백","85":"/ko-kr/manage/versions.html#현재-버전-보기","86":"/ko-kr/manage/versions.html#버전-제거","87":"/ko-kr/manage/versions.html#shims","88":"/ko-kr/manage/versions.html#asdf-shims-우회","89":"/ko-kr/more/community-projects.html#커뮤니티-프로젝트","90":"/ko-kr/more/faq.html#자주-묻는-질문","91":"/ko-kr/more/faq.html#wsl1을-지원하나요","92":"/ko-kr/more/faq.html#wsl2을-지원하나요","93":"/ko-kr/more/faq.html#새롭게-설치된-실행파일이-동작하지-않나요","94":"/ko-kr/more/faq.html#셸이-새롭게-설치된-shims들을-감지하지-못하나요","95":"/ko-kr/more/thanks.html#감사인사","96":"/ko-kr/more/thanks.html#credits","97":"/ko-kr/more/thanks.html#관리자","98":"/ko-kr/more/thanks.html#기여자","99":"/ko-kr/plugins/create.html#플러그인-생성하기","100":"/ko-kr/plugins/create.html#빠른-시작","101":"/ko-kr/plugins/create.html#플리그인-스크립트들을-위한-황금률","102":"/ko-kr/plugins/create.html#스크립트-개요","103":"/ko-kr/plugins/create.html#환경-변수-개요","104":"/ko-kr/plugins/create.html#필수적-스크립트","105":"/ko-kr/plugins/create.html#bin-list-all","106":"/ko-kr/plugins/create.html#bin-download","107":"/ko-kr/plugins/create.html#bin-install","108":"/ko-kr/plugins/create.html#선택적-스크립트","109":"/ko-kr/plugins/create.html#bin-latest-stable","110":"/ko-kr/plugins/create.html#bin-help-overview","111":"/ko-kr/plugins/create.html#bin-help-deps","112":"/ko-kr/plugins/create.html#bin-help-config","113":"/ko-kr/plugins/create.html#bin-help-links","114":"/ko-kr/plugins/create.html#bin-list-bin-paths","115":"/ko-kr/plugins/create.html#bin-exec-env","116":"/ko-kr/plugins/create.html#bin-exec-path","117":"/ko-kr/plugins/create.html#bin-uninstall","118":"/ko-kr/plugins/create.html#bin-list-legacy-filenames","119":"/ko-kr/plugins/create.html#bin-parse-legacy-file","120":"/ko-kr/plugins/create.html#bin-post-plugin-add","121":"/ko-kr/plugins/create.html#bin-post-plugin-update","122":"/ko-kr/plugins/create.html#bin-pre-plugin-remove","123":"/ko-kr/plugins/create.html#asdf-cli-확장-명령어","124":"/ko-kr/plugins/create.html#맞춤-shim-템플릿","125":"/ko-kr/plugins/create.html#테스팅","126":"/ko-kr/plugins/create.html#github-action","127":"/ko-kr/plugins/create.html#travisci-설정","128":"/ko-kr/plugins/create.html#api-속도-제한","129":"/ko-kr/plugins/create.html#github-api-token","130":"/ko-kr/plugins/create.html#플러그인-shortname-인덱스"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,5],"1":[2,1,86],"2":[1,1,83],"3":[1,2,22],"4":[5,2,58],"5":[2,1,21],"6":[2,3,54],"7":[6,1,99],"8":[2,1,21],"9":[3,1,6],"10":[2,3,55],"11":[1,3,72],"12":[6,3,34],"13":[1,3,52],"14":[1,3,96],"15":[2,1,54],"16":[2,1,15],"17":[1,1,25],"18":[3,1,49],"19":[3,1,1],"20":[2,4,14],"21":[4,4,30],"22":[3,1,276],"23":[4,1,21],"24":[3,1,14],"25":[2,4,42],"26":[2,4,11],"27":[3,1,42],"28":[3,1,41],"29":[1,4,46],"30":[1,4,37],"31":[5,4,42],"32":[3,1,44],"33":[1,1,65],"34":[1,1,41],"35":[2,1,1],"36":[4,3,44],"37":[1,3,29],"38":[1,3,29],"39":[1,3,54],"40":[4,1,55],"41":[2,1,151],"42":[1,1,19],"43":[3,1,141],"44":[2,1,49],"45":[3,2,37],"46":[3,2,21],"47":[3,2,21],"48":[5,2,77],"49":[5,2,75],"50":[1,2,38],"51":[2,2,78],"52":[2,1,40],"53":[3,3,26],"54":[5,3,34],"55":[2,3,30],"56":[3,3,34],"57":[2,3,24],"58":[3,3,42],"59":[3,1,84],"60":[2,1,46],"61":[1,1,9],"62":[3,1,5],"63":[1,1,11],"64":[2,1,6],"65":[1,1,16],"66":[2,1,66],"67":[2,1,49],"68":[1,1,46],"69":[1,1,146],"70":[1,1,21],"71":[1,1,31],"72":[2,1,14],"73":[5,1,14],"74":[1,1,38],"75":[1,1,25],"76":[5,1,55],"77":[1,1,1],"78":[2,1,36],"79":[4,1,17],"80":[3,1,14],"81":[5,1,15],"82":[4,1,16],"83":[3,1,87],"84":[3,1,35],"85":[3,1,20],"86":[2,1,10],"87":[1,1,129],"88":[3,2,28],"89":[2,1,38],"90":[3,1,5],"91":[3,3,26],"92":[3,3,54],"93":[6,3,52],"94":[7,3,40],"95":[1,1,8],"96":[1,1,11],"97":[1,1,6],"98":[1,1,6],"99":[2,1,32],"100":[2,2,47],"101":[4,4,28],"102":[2,2,113],"103":[3,2,85],"104":[2,2,1],"105":[3,4,132],"106":[2,4,133],"107":[2,4,155],"108":[2,2,1],"109":[3,4,157],"110":[3,4,116],"111":[3,4,92],"112":[3,4,100],"113":[3,4,104],"114":[3,4,101],"115":[3,4,71],"116":[3,4,111],"117":[2,4,69],"118":[4,4,78],"119":[4,4,112],"120":[4,4,53],"121":[4,4,55],"122":[4,4,45],"123":[4,2,124],"124":[3,2,56],"125":[1,2,91],"126":[2,3,48],"127":[2,3,53],"128":[3,2,55],"129":[3,5,29],"130":[3,2,46]},"averageFieldLength":[2.564885496183206,2.0916030534351155,50.778625954198475],"storedFields":{"0":{"title":"asdf","titles":[]},"1":{"title":"초기 설정","titles":["asdf"]},"2":{"title":"개발","titles":["asdf"]},"3":{"title":"Gitignore","titles":["asdf","개발"]},"4":{"title":".git-blame-ignore-revs","titles":["asdf","개발"]},"5":{"title":"Bats 테스팅","titles":["asdf"]},"6":{"title":"Bats 팁","titles":["asdf","Bats 테스팅"]},"7":{"title":"풀 리퀘스트, 릴리스 & 관습적 커밋","titles":["asdf"]},"8":{"title":"Docker 이미지","titles":["asdf"]},"9":{"title":"문서 & 사이트","titles":[]},"10":{"title":"초기 세팅","titles":["문서 & 사이트"]},"11":{"title":"개발","titles":["문서 & 사이트"]},"12":{"title":"풀 리퀘스트, 릴리스 & 관습적 커밋","titles":["문서 & 사이트"]},"13":{"title":"Vitepress","titles":["문서 & 사이트"]},"14":{"title":"I18n","titles":["문서 & 사이트"]},"15":{"title":"공식 플러그인","titles":[]},"16":{"title":"GitHub Actions","titles":[]},"17":{"title":"시작하기","titles":[]},"18":{"title":"1. Dependencies 설치","titles":["시작하기"]},"19":{"title":"2. asdf 다운로드","titles":["시작하기"]},"20":{"title":"공식 다운로드","titles":["시작하기","2. asdf 다운로드"]},"21":{"title":"커뮤니티 지원 다운로드 방법","titles":["시작하기","2. asdf 다운로드"]},"22":{"title":"3. asdf 설치","titles":["시작하기"]},"23":{"title":"코어 설치 완료!","titles":["시작하기"]},"24":{"title":"4. 플러그인 설치","titles":["시작하기"]},"25":{"title":"플러그인 Dependencies","titles":["시작하기","4. 플러그인 설치"]},"26":{"title":"플러그인 설치","titles":["시작하기","4. 플러그인 설치"]},"27":{"title":"5. 버전 설치","titles":["시작하기"]},"28":{"title":"6. 버전 설정","titles":["시작하기"]},"29":{"title":"글로벌","titles":["시작하기","6. 버전 설정"]},"30":{"title":"로컬","titles":["시작하기","6. 버전 설정"]},"31":{"title":"기존의 툴 버전 파일들 사용하기","titles":["시작하기","6. 버전 설정"]},"32":{"title":"가이드 끝!","titles":["시작하기"]},"33":{"title":"소개","titles":[]},"34":{"title":"작동방식","titles":["소개"]},"35":{"title":"관련된 프로젝트","titles":["소개"]},"36":{"title":"nvm / n / rbenv 등","titles":["소개","관련된 프로젝트"]},"37":{"title":"direnv","titles":["소개","관련된 프로젝트"]},"38":{"title":"Homebrew","titles":["소개","관련된 프로젝트"]},"39":{"title":"NixOS","titles":["소개","관련된 프로젝트"]},"40":{"title":"왜 asdf를 사용할까요?","titles":["소개"]},"41":{"title":"모든 명령어","titles":[]},"42":{"title":"설정","titles":[]},"43":{"title":".tool-versions","titles":["설정"]},"44":{"title":".asdfrc","titles":["설정"]},"45":{"title":"legacy_version_file","titles":["설정",".asdfrc"]},"46":{"title":"use_release_candidates","titles":["설정",".asdfrc"]},"47":{"title":"always_keep_download","titles":["설정",".asdfrc"]},"48":{"title":"plugin_repository_last_check_duration","titles":["설정",".asdfrc"]},"49":{"title":"disable_plugin_short_name_repository","titles":["설정",".asdfrc"]},"50":{"title":"concurrency","titles":["설정",".asdfrc"]},"51":{"title":"플러그인 훅","titles":["설정",".asdfrc"]},"52":{"title":"환경 변수","titles":["설정"]},"53":{"title":"ASDF_CONFIG_FILE","titles":["설정","환경 변수"]},"54":{"title":"ASDF_DEFAULT_TOOL_VERSIONS_FILENAME","titles":["설정","환경 변수"]},"55":{"title":"ASDF_DIR","titles":["설정","환경 변수"]},"56":{"title":"ASDF_DATA_DIR","titles":["설정","환경 변수"]},"57":{"title":"ASDF_CONCURRENCY","titles":["설정","환경 변수"]},"58":{"title":"ASDF_FORCE_PREPEND","titles":["설정","환경 변수"]},"59":{"title":"전체 설정의 예시","titles":["설정"]},"60":{"title":"내부 설정","titles":["설정"]},"61":{"title":"코어","titles":[]},"62":{"title":"설치 & 설정","titles":["코어"]},"63":{"title":"실행","titles":["코어"]},"64":{"title":"환경 변수","titles":["코어"]},"65":{"title":"정보","titles":["코어"]},"66":{"title":"Shim 재생성","titles":["코어"]},"67":{"title":"Shim 버전","titles":["코어"]},"68":{"title":"업데이트","titles":["코어"]},"69":{"title":"제거","titles":["코어"]},"70":{"title":"플러그인","titles":[]},"71":{"title":"추가하기","titles":["플러그인"]},"72":{"title":"설치된 목록","titles":["플러그인"]},"73":{"title":"모든 Short-name 리포지토리 목록","titles":["플러그인"]},"74":{"title":"업데이트","titles":["플러그인"]},"75":{"title":"제거","titles":["플러그인"]},"76":{"title":"asdf Short-name 리포지토리 동기화","titles":["플러그인"]},"77":{"title":"버전","titles":[]},"78":{"title":"버전 설치","titles":["버전"]},"79":{"title":"최신 안정 버전 설치","titles":["버전"]},"80":{"title":"설치된 버전 목록","titles":["버전"]},"81":{"title":"사용 가능한 모든 버전 목록","titles":["버전"]},"82":{"title":"최신 안정 버전 보기","titles":["버전"]},"83":{"title":"현재 버전 설정","titles":["버전"]},"84":{"title":"시스템 버전으로의 폴백","titles":["버전"]},"85":{"title":"현재 버전 보기","titles":["버전"]},"86":{"title":"버전 제거","titles":["버전"]},"87":{"title":"Shims","titles":["버전"]},"88":{"title":"asdf shims 우회","titles":["버전","Shims"]},"89":{"title":"커뮤니티 프로젝트","titles":[]},"90":{"title":"자주 묻는 질문","titles":[]},"91":{"title":"WSL1을 지원하나요?","titles":["자주 묻는 질문"]},"92":{"title":"WSL2을 지원하나요?","titles":["자주 묻는 질문"]},"93":{"title":"새롭게 설치된 실행파일이 동작하지 않나요?","titles":["자주 묻는 질문"]},"94":{"title":"셸이 새롭게 설치된 shims들을 감지하지 못하나요?","titles":["자주 묻는 질문"]},"95":{"title":"감사인사","titles":[]},"96":{"title":"Credits","titles":["감사인사"]},"97":{"title":"관리자","titles":["감사인사"]},"98":{"title":"기여자","titles":["감사인사"]},"99":{"title":"플러그인 생성하기","titles":[]},"100":{"title":"빠른 시작","titles":["플러그인 생성하기"]},"101":{"title":"플리그인 스크립트들을 위한 황금률","titles":["플러그인 생성하기","빠른 시작"]},"102":{"title":"스크립트 개요","titles":["플러그인 생성하기"]},"103":{"title":"환경 변수 개요","titles":["플러그인 생성하기"]},"104":{"title":"필수적 스크립트","titles":["플러그인 생성하기"]},"105":{"title":"bin/list-all","titles":["플러그인 생성하기","필수적 스크립트"]},"106":{"title":"bin/download","titles":["플러그인 생성하기","필수적 스크립트"]},"107":{"title":"bin/install","titles":["플러그인 생성하기","필수적 스크립트"]},"108":{"title":"선택적 스크립트","titles":["플러그인 생성하기"]},"109":{"title":"bin/latest-stable","titles":["플러그인 생성하기","선택적 스크립트"]},"110":{"title":"bin/help.overview","titles":["플러그인 생성하기","선택적 스크립트"]},"111":{"title":"bin/help.deps","titles":["플러그인 생성하기","선택적 스크립트"]},"112":{"title":"bin/help.config","titles":["플러그인 생성하기","선택적 스크립트"]},"113":{"title":"bin/help.links","titles":["플러그인 생성하기","선택적 스크립트"]},"114":{"title":"bin/list-bin-paths","titles":["플러그인 생성하기","선택적 스크립트"]},"115":{"title":"bin/exec-env","titles":["플러그인 생성하기","선택적 스크립트"]},"116":{"title":"bin/exec-path","titles":["플러그인 생성하기","선택적 스크립트"]},"117":{"title":"bin/uninstall","titles":["플러그인 생성하기","선택적 스크립트"]},"118":{"title":"bin/list-legacy-filenames","titles":["플러그인 생성하기","선택적 스크립트"]},"119":{"title":"bin/parse-legacy-file","titles":["플러그인 생성하기","선택적 스크립트"]},"120":{"title":"bin/post-plugin-add","titles":["플러그인 생성하기","선택적 스크립트"]},"121":{"title":"bin/post-plugin-update","titles":["플러그인 생성하기","선택적 스크립트"]},"122":{"title":"bin/pre-plugin-remove","titles":["플러그인 생성하기","선택적 스크립트"]},"123":{"title":"asdf CLI 확장 명령어","titles":["플러그인 생성하기"]},"124":{"title":"맞춤 Shim 템플릿","titles":["플러그인 생성하기"]},"125":{"title":"테스팅","titles":["플러그인 생성하기"]},"126":{"title":"GitHub Action","titles":["플러그인 생성하기","테스팅"]},"127":{"title":"TravisCI 설정","titles":["플러그인 생성하기","테스팅"]},"128":{"title":"API 속도 제한","titles":["플러그인 생성하기"]},"129":{"title":"GITHUB_API_TOKEN","titles":["플러그인 생성하기","API 속도 제한"]},"130":{"title":"플러그인 Shortname 인덱스","titles":["플러그인 생성하기"]}},"dirtCount":0,"index":[["권환으로",{"2":{"129":1}}],["권장되는",{"2":{"130":1}}],["권장합니다",{"2":{"125":1}}],["권장",{"2":{"68":1}}],["권장드립니다",{"2":{"21":1}}],["토큰을",{"2":{"128":1,"129":3}}],["토픽",{"2":{"15":1}}],["접근에",{"2":{"128":1}}],["접근하는",{"2":{"39":1}}],["외부",{"2":{"128":1}}],["액세스",{"2":{"129":1}}],["액세스되야",{"2":{"87":1}}],["액션",{"2":{"126":1}}],["양쪽",{"2":{"125":1}}],["체크아웃합니다",{"2":{"125":1}}],["체제에",{"2":{"111":1}}],["체제와",{"2":{"110":1,"111":1,"112":1,"113":1}}],["체제별",{"2":{"102":1}}],["현명하게",{"2":{"124":1}}],["현재는",{"2":{"92":1}}],["현재",{"0":{"83":1,"85":1},"2":{"28":2,"30":1,"37":1,"63":1,"66":1,"74":1,"83":2,"84":1,"92":1,"115":1,"116":1}}],["복사합니다",{"2":{"124":1}}],["템플릿",{"0":{"124":1}}],["템플릿을",{"2":{"100":1,"124":2}}],["라이브러리를",{"2":{"123":1}}],["라이프사이클을",{"2":{"66":1}}],["콜백",{"2":{"120":1,"121":1,"122":1}}],["콜백에",{"2":{"87":1}}],["줄이기",{"2":{"128":1}}],["줄로",{"2":{"119":1}}],["줄입니다",{"2":{"4":1}}],["완전한지는",{"2":{"119":1}}],["완료했습니다",{"2":{"23":1}}],["완료",{"0":{"23":1}}],["항상",{"2":{"119":1}}],["항목",{"2":{"59":1}}],["항목들을",{"2":{"22":1}}],["활성화한",{"2":{"118":1}}],["활성화하기",{"2":{"31":1}}],["또한",{"2":{"117":1}}],["또는",{"2":{"1":1,"43":1,"47":4,"49":1,"50":1,"51":4,"71":1,"78":1,"83":1,"87":1,"102":1,"103":3,"106":7,"107":3,"109":3,"110":2,"111":2,"112":3,"113":3,"114":2,"115":2,"116":2,"117":1,"118":2,"119":1,"123":1,"125":1}}],["송신",{"2":{"117":1}}],["덮어쓰거나",{"2":{"116":1}}],["덮어쓰게",{"2":{"116":1}}],["명령줄",{"2":{"123":1}}],["명령에서",{"2":{"118":1,"119":1}}],["명령을",{"2":{"115":1,"116":1,"123":1}}],["명령어에",{"2":{"123":1}}],["명령어의",{"2":{"101":1}}],["명령어만",{"2":{"83":1}}],["명령어가",{"2":{"68":1,"102":1,"125":1,"128":1}}],["명령어입니다",{"2":{"65":1,"125":1}}],["명령어는",{"2":{"61":1,"74":1}}],["명령어를",{"2":{"41":1,"60":1,"63":1,"74":1,"101":1,"123":1}}],["명령어로",{"2":{"22":1,"46":1,"47":1,"69":4,"120":1}}],["명령어",{"0":{"41":1,"123":1},"2":{"18":1,"21":1,"43":2,"51":3,"69":16,"87":1,"93":1,"101":2,"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":2,"116":2,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1}}],["명령어들에",{"2":{"76":1}}],["명령어들입니다",{"2":{"41":1}}],["명령어들",{"2":{"36":1}}],["명령어들의",{"2":{"18":1,"32":1}}],["명령어들을",{"2":{"2":1,"32":1,"48":1,"49":1,"99":1}}],["\\thttps",{"2":{"113":2}}],["출합니다",{"2":{"111":1}}],["출력값도",{"2":{"117":1}}],["출력값은",{"2":{"117":1}}],["출력값을",{"2":{"109":1}}],["출력되기",{"2":{"111":1,"112":1,"113":1}}],["출력해",{"2":{"119":1}}],["출력해도",{"2":{"110":1}}],["출력해서는",{"2":{"110":1}}],["출력해야합니다",{"2":{"109":1,"110":1,"111":1,"112":1,"113":1,"116":1}}],["출력합니다",{"2":{"109":3,"114":1}}],["출력에",{"2":{"109":1}}],["출력하지",{"2":{"110":1}}],["출력하여",{"2":{"105":1}}],["출력하는",{"2":{"65":1}}],["출력",{"2":{"102":6,"105":2,"110":2,"111":1,"112":2,"113":2,"114":2,"116":1,"117":1,"118":2}}],["출력할",{"2":{"67":1,"112":1}}],["출력을",{"2":{"6":1,"109":1,"110":1}}],["핵심이",{"2":{"110":1}}],["짧은",{"2":{"110":1}}],["텍스트로",{"2":{"110":1,"112":1}}],["머리말을",{"2":{"110":1}}],["머리말를",{"2":{"110":1}}],["머신에",{"2":{"76":1}}],["머신에서",{"2":{"1":1}}],["머신별",{"2":{"44":1}}],["받습니다",{"2":{"109":1,"119":1}}],["받아",{"2":{"99":1}}],["쿼리라는",{"2":{"109":1}}],["쿼리는",{"2":{"109":2}}],["번째",{"2":{"109":1}}],["번호를",{"2":{"119":2}}],["번호나",{"2":{"109":1}}],["번호",{"2":{"103":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["첫",{"2":{"109":1}}],["표시",{"2":{"115":1,"116":1}}],["표시하려면",{"2":{"110":1}}],["표시함으로써",{"2":{"28":1}}],["표준",{"2":{"109":1,"124":2}}],["판단될때만",{"2":{"107":1}}],["성공적이라고",{"2":{"107":1}}],["성공적인",{"2":{"47":1}}],["성공",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1}}],["남아서는",{"2":{"106":1}}],["압축",{"2":{"106":1}}],["장소에",{"2":{"106":1}}],["장기",{"2":{"15":1,"89":1}}],["함수",{"2":{"105":1}}],["함께",{"2":{"4":1,"11":1,"34":1}}],["충분합니다",{"2":{"105":1}}],["잡는것으로",{"2":{"105":1}}],["잡음을",{"2":{"4":1}}],["역순으로",{"2":{"105":1}}],["좋은",{"2":{"123":1}}],["좋습니다",{"2":{"105":1}}],["좋을",{"2":{"1":1}}],["많기",{"2":{"105":1}}],["많은",{"2":{"4":1,"31":1,"32":1,"39":1,"48":1,"61":1,"70":1,"75":1,"109":1}}],["웹사이트의",{"2":{"105":1}}],["밀어낼",{"2":{"105":1}}],["밖으로",{"2":{"105":1}}],["화면",{"2":{"105":1}}],["준비",{"2":{"102":1,"115":1}}],["준수",{"2":{"1":1}}],["링크",{"2":{"102":1,"113":3}}],["링크들에서",{"2":{"15":1}}],["운영",{"2":{"102":1,"110":1,"111":2,"112":1,"113":1}}],["운영체제에서",{"2":{"58":1}}],["운영체제들은",{"2":{"29":1}}],["운영체제들",{"2":{"22":1}}],["운영체제",{"2":{"3":1,"18":1,"65":1,"125":1}}],["개인",{"2":{"129":1}}],["개의",{"2":{"111":1,"113":2}}],["개요",{"0":{"102":1,"103":1}}],["개발자는",{"2":{"123":1}}],["개발자들",{"2":{"43":1}}],["개발에",{"2":{"11":1}}],["개발",{"0":{"2":1,"11":1},"1":{"3":1,"4":1},"2":{"1":3,"8":1,"11":1,"33":1,"74":1,"89":1}}],["개발하기",{"2":{"1":1}}],["개발을",{"2":{"1":1,"10":1}}],["금지된",{"2":{"101":1}}],["피하세요",{"2":{"101":1}}],["안",{"2":{"106":1,"110":1}}],["안됩니다",{"2":{"101":1,"129":1}}],["안정",{"0":{"79":1,"82":1},"2":{"68":1,"79":1,"82":1,"102":1,"109":4}}],["황금률",{"0":{"101":1}}],["붙인",{"2":{"100":1}}],["빠른",{"0":{"100":1},"1":{"101":1}}],["🙏",{"2":{"98":1}}],["고열",{"2":{"96":1}}],["고유한",{"2":{"33":1}}],["페이지에서",{"2":{"105":1}}],["페이지",{"2":{"95":1}}],["페이지를",{"2":{"31":1}}],["저장",{"2":{"106":1}}],["저장하는",{"2":{"54":1}}],["저작권",{"2":{"96":1}}],["저자들",{"2":{"95":1}}],["높습니다",{"2":{"94":1}}],["높은",{"2":{"22":1}}],["못한다면",{"2":{"94":1}}],["못하나요",{"0":{"94":1}}],["알려줄",{"2":{"93":1}}],["된",{"2":{"93":1,"94":2,"102":1,"103":2,"106":1,"107":1,"121":1}}],["새롭게",{"0":{"93":1,"94":1}}],["새로",{"2":{"83":1}}],["새로운",{"2":{"2":2,"7":3,"22":3,"37":1,"48":1,"66":1,"68":1,"123":1,"129":1}}],["호스팅되는",{"2":{"126":1}}],["호스트",{"2":{"92":1}}],["호환성을",{"2":{"107":1}}],["호출할",{"2":{"123":1}}],["호출되기",{"2":{"119":1}}],["호출됩니다",{"2":{"118":1,"119":1}}],["호출하는",{"2":{"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1}}],["호출하는지",{"2":{"102":1}}],["호출하면",{"2":{"101":1}}],["호출",{"2":{"102":1,"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["호출을",{"2":{"87":1}}],["종료",{"2":{"106":2,"107":2,"109":2,"110":2,"111":2,"112":2,"113":2}}],["종료까지의",{"2":{"96":1}}],["종료됩니다",{"2":{"49":1,"76":1}}],["종속되어",{"2":{"92":1}}],["드라이브에",{"2":{"92":1}}],["드라이브",{"2":{"92":1}}],["질문들입니다",{"2":{"90":1}}],["질문",{"0":{"90":1},"1":{"91":1,"92":1,"93":1,"94":1}}],["묻는",{"0":{"90":1},"1":{"91":1,"92":1,"93":1,"94":1}}],["책임지지",{"2":{"89":1}}],["품질과",{"2":{"89":1}}],["컨테이너",{"2":{"89":1}}],["될",{"2":{"88":1}}],["반환해야합니다",{"2":{"119":1}}],["반환",{"2":{"116":1}}],["반환합니다",{"2":{"116":1}}],["반환된",{"2":{"105":2}}],["반환할",{"2":{"87":1}}],["반드시",{"2":{"5":1,"7":1,"14":1,"22":2,"105":1,"123":1,"124":1}}],["두는",{"2":{"105":1}}],["두",{"2":{"87":1,"100":1}}],["넘겨주는",{"2":{"87":1}}],["넘는",{"2":{"39":1}}],["감기",{"2":{"96":1}}],["감사",{"2":{"95":1}}],["감사인사",{"0":{"95":1},"1":{"96":1,"97":1,"98":1}}],["감사드리며",{"2":{"16":1}}],["감지하지",{"0":{"94":1}}],["감싸고",{"2":{"87":1}}],["kim",{"2":{"85":3}}],["keep",{"0":{"47":1},"2":{"44":1,"59":1}}],["916",{"2":{"74":1}}],["999999999",{"2":{"48":1}}],["진행할",{"2":{"92":1}}],["진행됩니다",{"2":{"76":1}}],["진행되지",{"2":{"76":1}}],["진행되고있습니다",{"2":{"8":1}}],["진행중",{"2":{"74":1}}],["긴",{"2":{"71":1}}],["독립적인",{"2":{"71":1}}],["취급하는",{"2":{"70":1}}],["봐",{"2":{"69":1}}],["행마다",{"2":{"111":1,"113":1}}],["행에",{"2":{"105":3}}],["행을",{"2":{"69":2}}],["행들을",{"2":{"69":14}}],["삭제할",{"2":{"69":2}}],["삭제",{"2":{"69":14}}],["절차를",{"2":{"68":1,"69":1}}],["절대",{"2":{"53":1,"55":1,"56":1,"129":1}}],["빌드",{"2":{"107":1}}],["빌드하기",{"2":{"11":1}}],["빌트인",{"2":{"68":1}}],["8",{"2":{"67":2,"107":1,"109":1}}],["8837",{"2":{"22":2}}],["들면",{"2":{"66":1,"67":1,"123":1}}],["들어",{"2":{"4":1,"14":1,"43":1,"45":1,"51":1,"66":1,"101":1,"105":1,"109":1,"112":1,"125":1,"128":1}}],["헬퍼는",{"2":{"87":1}}],["헬퍼",{"2":{"65":1,"68":1,"87":1}}],["헬퍼입니다",{"2":{"27":1}}],["올바르게",{"2":{"125":1}}],["올바른",{"2":{"60":1,"105":1}}],["올리고",{"2":{"7":1}}],["무엇이",{"2":{"119":1}}],["무관하게",{"2":{"60":1}}],["무시하고",{"2":{"54":1}}],["무시되어야합니다",{"2":{"3":1}}],["무시합니다",{"2":{"3":1}}],["걱정할",{"2":{"60":1}}],["없는",{"2":{"69":1,"106":1,"107":1}}],["없습니다",{"2":{"60":1,"91":1,"93":1,"105":1,"106":1,"107":1,"117":1,"118":1,"120":1,"121":1,"122":1,"124":1}}],["없음",{"2":{"59":7}}],["없이",{"2":{"2":1,"43":1,"119":1}}],["간단한",{"2":{"59":1}}],["간격보다",{"2":{"48":1}}],["간격",{"2":{"48":1}}],["quot",{"2":{"58":2,"106":2,"114":8,"118":2}}],["문제해결을",{"2":{"123":1}}],["문제를",{"2":{"94":1,"107":1}}],["문자열을",{"2":{"105":1}}],["문자열로",{"2":{"79":1,"80":1,"81":1,"82":1,"116":2}}],["문자열",{"2":{"58":1}}],["문서에",{"2":{"100":1}}],["문서에서",{"2":{"14":1,"37":1,"38":1,"39":1,"76":2,"110":1}}],["문서를",{"2":{"13":1,"93":1,"102":1,"103":1,"110":1,"111":1,"112":1,"113":1}}],["문서는",{"2":{"12":1}}],["문서",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1},"2":{"2":1,"4":1,"5":1,"6":1,"9":1,"10":1,"11":1,"12":1,"13":1}}],["맥",{"2":{"58":1,"125":1}}],["맨",{"2":{"58":1}}],["값에",{"2":{"59":1}}],["값",{"2":{"59":1}}],["값보다",{"2":{"57":1}}],["값이",{"2":{"57":2,"59":1}}],["값을",{"2":{"48":1,"54":1,"110":1,"111":1,"112":1,"113":1}}],["존재합니다",{"2":{"87":1}}],["존재",{"2":{"56":1}}],["존재하지",{"2":{"56":1,"66":1,"83":1,"107":1,"109":1,"114":1,"119":1}}],["존재하면",{"2":{"43":1,"124":1}}],["존재하는",{"2":{"5":2,"16":1,"50":1,"107":1}}],["상황에서도",{"2":{"119":1}}],["상관없지만",{"2":{"110":1}}],["상태의",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1}}],["상대적으로",{"2":{"123":1}}],["상대",{"2":{"102":1,"114":1,"116":2,"127":1}}],["상세한",{"2":{"88":1}}],["상위",{"2":{"55":1,"59":1}}],["상단에서",{"2":{"52":1}}],["됩니다",{"2":{"54":1,"57":1,"59":1,"106":1,"110":1,"123":1}}],["미사용중인",{"2":{"75":1}}],["미설정",{"2":{"53":1,"54":1,"55":1,"56":1,"57":1,"58":1}}],["미치는",{"2":{"22":1}}],["임의의",{"2":{"53":1,"54":1,"55":1,"56":1}}],["임시로",{"2":{"2":1}}],["달려있습니다",{"2":{"52":1}}],["패턴은",{"2":{"51":1}}],["패키지로의",{"2":{"87":1}}],["패키지의",{"2":{"66":1,"87":4}}],["패키지들의",{"2":{"39":1}}],["패키지들과",{"2":{"38":1}}],["패키지를",{"2":{"22":1,"74":1,"87":1}}],["패키지",{"2":{"18":2,"38":2,"39":3,"40":1,"60":2,"69":9,"87":1}}],["훅들이",{"2":{"51":1}}],["훅들을",{"2":{"25":1,"51":1,"120":1,"121":1,"122":1}}],["훅",{"0":{"51":1},"2":{"102":3}}],["갖습니다",{"2":{"50":1}}],["갖고있어",{"2":{"25":1,"27":1}}],["갖고",{"2":{"25":1}}],["계획입니다만",{"2":{"92":1}}],["계획이",{"2":{"91":1}}],["계산합니다",{"2":{"50":1}}],["계속해서",{"2":{"23":1}}],["순서대로",{"2":{"105":1}}],["순서로",{"2":{"105":1}}],["순서를",{"2":{"22":1}}],["순위를",{"2":{"50":1}}],["순차적으로",{"2":{"50":1}}],["비트",{"2":{"123":2}}],["비안정판이나",{"2":{"109":1}}],["비의도적으로",{"2":{"109":1}}],["비록",{"2":{"106":1}}],["비었으므로",{"2":{"59":5}}],["비활성화됩니다",{"2":{"60":1}}],["비활성화해도",{"2":{"49":2}}],["비활성화",{"2":{"49":2}}],["비활성화합니다",{"2":{"49":1}}],["비슷하고",{"2":{"36":1}}],["비슷합니다",{"2":{"11":1}}],["막지",{"2":{"48":1}}],["초과된",{"2":{"48":1}}],["초기에",{"2":{"114":1}}],["초기",{"0":{"1":1,"10":1},"2":{"48":1}}],["트리거하지",{"2":{"48":1,"49":1}}],["트리거",{"2":{"48":3}}],["분",{"2":{"48":2}}],["분석",{"2":{"1":1}}],["동적",{"2":{"123":1}}],["동일하고",{"2":{"119":1}}],["동일하게",{"2":{"83":1}}],["동일한",{"2":{"78":1,"119":1}}],["동안",{"2":{"76":1}}],["동기화는",{"2":{"76":1}}],["동기화됩니다",{"2":{"76":1}}],["동기화된",{"2":{"49":1}}],["동기화를",{"2":{"48":2,"49":2}}],["동기화가",{"2":{"48":1,"76":2}}],["동기화",{"0":{"76":1},"2":{"48":9,"49":3,"76":2}}],["동작하는지",{"2":{"125":1}}],["동작하지",{"0":{"93":1},"2":{"91":1}}],["동작은",{"2":{"107":1}}],["동작합니다",{"2":{"92":1}}],["동작를",{"2":{"37":1}}],["동작을",{"2":{"22":1}}],["소유하지",{"2":{"89":1}}],["소수지만",{"2":{"61":1}}],["소스의",{"2":{"120":1}}],["소스에서",{"2":{"78":1}}],["소스",{"2":{"47":3,"50":1,"57":1,"102":1,"103":3,"106":5,"107":3}}],["소개",{"0":{"33":1},"1":{"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1}}],["레거시",{"2":{"45":1,"102":2,"106":3,"107":1,"118":1,"119":7}}],["레퍼런스들을",{"2":{"14":1}}],["데",{"2":{"60":1,"109":1,"112":1,"118":1,"119":1}}],["데는",{"2":{"45":1}}],["데모",{"2":{"24":1}}],["불가능하므로",{"2":{"105":1}}],["불가능했을",{"2":{"11":1}}],["불가피한",{"2":{"105":1}}],["불러오는",{"2":{"45":1}}],["옵션에서",{"2":{"125":2}}],["옵션을",{"2":{"76":1,"118":1}}],["옵션이",{"2":{"76":1,"100":1}}],["옵션",{"2":{"45":1,"46":1,"47":1,"48":1,"49":1,"50":1}}],["옵션들은",{"2":{"31":1}}],["루비의",{"2":{"45":1}}],["편집하거나",{"2":{"43":1}}],["편하죠",{"2":{"22":1}}],["7",{"2":{"43":4,"107":1,"109":1}}],["파악하고",{"2":{"124":1}}],["파이썬으로",{"2":{"43":1}}],["파이썬",{"2":{"43":2}}],["파일로도",{"2":{"124":1}}],["파일도",{"2":{"106":1}}],["파일은",{"2":{"43":1,"44":2}}],["파일의",{"2":{"43":1,"53":1,"54":1,"102":1,"103":1,"119":2,"123":1}}],["파일이름들의",{"2":{"118":1}}],["파일이름입니다",{"2":{"54":1}}],["파일이",{"2":{"43":3,"60":1,"102":1,"106":1,"107":1,"124":1}}],["파일에서",{"2":{"83":1,"119":1}}],["파일에",{"2":{"30":1,"33":1,"43":5,"87":2,"107":1}}],["파일",{"2":{"6":1,"13":1,"31":1,"45":1,"54":1,"59":1,"94":1,"118":1,"119":1,"127":1}}],["파일을",{"2":{"4":3,"83":1,"107":1,"119":3,"124":1}}],["파일들",{"0":{"31":1},"2":{"31":1,"33":1,"42":1,"69":14}}],["파일들에서",{"2":{"28":1}}],["파일들의",{"2":{"14":1}}],["파일들로",{"2":{"13":1}}],["파일들은",{"2":{"3":1,"13":1}}],["파일들을",{"2":{"3":1,"17":1,"31":1,"36":1,"45":1,"54":1,"102":1,"114":1}}],["파일입니다",{"2":{"3":1}}],["키워드는",{"2":{"43":1}}],["키들과",{"2":{"14":1}}],["컴파일하는",{"2":{"112":1}}],["컴파일을",{"2":{"78":1}}],["컴파일할",{"2":{"50":1,"57":1,"103":1,"107":1}}],["컴파일",{"2":{"43":1,"50":1}}],["컴파일됩니다",{"2":{"43":1}}],["태그로",{"2":{"125":1}}],["태그",{"2":{"43":1,"78":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["바탕으로",{"2":{"130":1}}],["바꿔",{"2":{"127":1}}],["바로",{"2":{"105":1}}],["바이너리의",{"2":{"115":1}}],["바이너리들을",{"2":{"114":3}}],["바이너리만",{"2":{"106":1}}],["바이너리가",{"2":{"103":1}}],["바이너리를",{"2":{"43":1,"47":1,"106":2,"114":1}}],["바이너리",{"2":{"43":1,"47":2,"102":3,"106":2,"107":1}}],["바라신다면",{"2":{"1":1}}],["넣을",{"2":{"43":1}}],["형태는",{"2":{"43":1}}],["형식의",{"2":{"110":1,"112":1}}],["형식은",{"2":{"83":1,"113":1,"119":1}}],["형식과",{"2":{"44":1}}],["형식일",{"2":{"43":1}}],["형식인",{"2":{"12":1}}],["형식",{"2":{"11":1,"105":1,"117":1}}],["형식을",{"2":{"7":4}}],["형식이",{"2":{"7":1}}],["모듈을",{"2":{"69":6}}],["모두",{"2":{"42":1,"125":1}}],["모든",{"0":{"41":1,"73":1,"81":1},"2":{"4":1,"7":1,"28":1,"33":3,"41":1,"43":2,"49":1,"69":14,"75":1,"87":1,"102":1,"103":3,"105":4,"106":2,"109":1,"117":1,"118":1,"119":1}}],["뿐만",{"2":{"42":1,"124":1}}],["`$asdf",{"2":{"123":5}}],["`env`",{"2":{"41":1}}],["`asdf",{"2":{"41":1}}],["최소로",{"2":{"101":1}}],["최소한의",{"2":{"11":1}}],["최종적으로",{"2":{"87":1,"106":1}}],["최종",{"2":{"87":1}}],["최근",{"2":{"74":1}}],["최우선순위",{"2":{"58":1}}],["최신",{"0":{"79":1,"82":1},"2":{"46":2,"68":2,"79":1,"82":1,"102":1,"105":1,"109":7}}],["최선의",{"2":{"40":1}}],["을",{"2":{"40":1,"48":1,"49":1,"66":1,"74":1}}],["친숙성",{"2":{"40":1}}],["친화적인",{"2":{"22":1}}],["과정",{"2":{"59":1}}],["과",{"2":{"40":1}}],["왜",{"0":{"40":1}}],["말씀드리지만",{"2":{"39":1}}],["말해서",{"2":{"14":1}}],["한행마다",{"2":{"113":1}}],["한개씩",{"2":{"105":1}}],["한개의",{"2":{"83":1}}],["한다고",{"2":{"93":1}}],["한",{"2":{"43":1,"55":1,"59":1,"75":1,"105":1,"110":1,"111":2,"113":3,"119":1}}],["한번",{"2":{"39":1}}],["한가지",{"2":{"34":1}}],["컬렉션을",{"2":{"39":1}}],["창의적으로",{"2":{"39":1}}],["부여되지",{"2":{"123":1}}],["부여되어",{"2":{"123":1}}],["부분의",{"2":{"91":1}}],["부분에",{"2":{"22":1,"58":3}}],["부재",{"2":{"38":1}}],["별",{"2":{"36":1}}],["별로",{"2":{"14":1}}],["차별화",{"2":{"36":1}}],["영역에서",{"2":{"36":1}}],["영향을",{"2":{"22":1}}],["영향",{"2":{"2":1}}],["매개변수",{"2":{"125":1}}],["매개변수는",{"2":{"105":1,"106":1,"107":1,"117":1,"118":1,"120":1,"121":1,"122":1}}],["매우",{"2":{"36":1,"87":1}}],["매니저에서",{"2":{"45":1}}],["매니저가",{"2":{"38":1,"39":1,"40":1}}],["매니저의",{"2":{"36":1}}],["매니저들이",{"2":{"60":1}}],["매니저들",{"2":{"33":1}}],["매니저들의",{"2":{"31":1}}],["매니저입니다",{"2":{"33":1,"40":1}}],["매니저",{"2":{"18":1,"38":1}}],["매니저를",{"2":{"18":1}}],["때는",{"2":{"129":1}}],["때문입니다",{"2":{"124":1}}],["때문에",{"2":{"66":1,"87":1,"105":1,"106":1,"124":1}}],["때도",{"2":{"78":1}}],["때",{"2":{"34":1,"48":1,"49":1,"50":1,"54":1,"57":1,"87":1,"88":1,"92":1,"103":2,"107":2,"119":1,"125":1}}],["때에",{"2":{"6":1}}],["할",{"2":{"34":1,"37":1,"66":1}}],["생성할",{"2":{"123":1}}],["생성",{"2":{"114":1}}],["생성되면",{"2":{"100":1}}],["생성되지만",{"2":{"93":1}}],["생성해야",{"2":{"93":1}}],["생성합니다",{"2":{"87":1,"114":1,"129":1}}],["생성하게",{"2":{"114":1}}],["생성하기",{"0":{"99":1},"1":{"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1},"2":{"70":1,"93":1,"100":1,"102":1}}],["생성하기를",{"2":{"51":1}}],["생성하고",{"2":{"40":1}}],["생성됩니다",{"2":{"34":1,"66":1,"107":1}}],["생성기",{"2":{"11":1}}],["확장",{"0":{"123":1},"2":{"123":2}}],["확장가능합니다",{"2":{"33":1}}],["확인합니다",{"2":{"107":1}}],["확인해",{"2":{"88":1}}],["확인해야합니다",{"2":{"25":1}}],["확인하십시오",{"2":{"128":1}}],["확인하기위해",{"2":{"125":1}}],["확인하여",{"2":{"103":1}}],["확인하려면",{"2":{"102":1,"107":1}}],["확인하는",{"2":{"60":1}}],["확인하게",{"2":{"48":1}}],["확인하세요",{"2":{"15":1,"73":1,"98":1,"103":1}}],["확인할",{"2":{"32":1,"33":1}}],["확인가능합니다",{"2":{"27":1,"41":1}}],["확인",{"2":{"14":1,"16":1}}],["인덱스에",{"2":{"130":1}}],["인덱스에서",{"2":{"73":1}}],["인덱스",{"0":{"130":1},"2":{"130":1}}],["인증",{"2":{"128":1,"129":1}}],["인쇄하므로",{"2":{"110":1}}],["인수를",{"2":{"109":1,"119":1}}],["인수로",{"2":{"109":1}}],["인수",{"2":{"43":1}}],["인터페이스를",{"2":{"33":1,"123":1}}],["인터페이스와",{"2":{"33":1}}],["인기",{"2":{"15":1}}],["워크플로우를",{"2":{"61":1}}],["워크플로우",{"2":{"33":1,"126":1}}],["조건부로",{"2":{"116":2}}],["조기",{"2":{"49":1,"76":1}}],["조정될",{"2":{"87":1}}],["조정",{"2":{"33":1}}],["조합들이",{"2":{"22":1}}],["여기서",{"2":{"78":1}}],["여부를",{"2":{"109":1}}],["여부",{"2":{"58":1}}],["여러가지",{"2":{"70":1}}],["여러",{"2":{"33":1,"67":1}}],["여는",{"2":{"22":1}}],["팀들이",{"2":{"40":1}}],["팀들과",{"2":{"33":1}}],["팀은",{"2":{"15":1,"89":1}}],["카테고리로",{"2":{"32":1}}],["익숙해져야하는",{"2":{"32":1}}],["끝났습니다",{"2":{"32":1}}],["끝",{"0":{"32":1},"2":{"69":1}}],["하십시오",{"2":{"123":1}}],["하면",{"2":{"123":1}}],["하거나",{"2":{"116":1}}],["하고",{"2":{"88":1}}],["하나여야합니다",{"2":{"113":1}}],["하나씩",{"2":{"105":1}}],["하나를",{"2":{"105":1}}],["하나로",{"2":{"84":1}}],["하나의",{"2":{"30":1,"33":2,"40":1,"43":1,"109":1,"119":1}}],["하에",{"2":{"83":1}}],["하는",{"2":{"67":1,"93":1,"123":1,"124":1}}],["하지",{"2":{"48":1}}],["하위명령어로",{"2":{"123":1}}],["하위",{"2":{"27":1,"43":1}}],["발생할",{"2":{"128":1}}],["발생합니다",{"2":{"28":1,"48":2,"49":1}}],["발견된",{"2":{"119":1}}],["발전시키는",{"2":{"15":1}}],["맞지",{"2":{"119":1}}],["맞는",{"2":{"111":1}}],["맞게",{"2":{"110":1,"111":1,"112":1,"113":1}}],["맞춤",{"0":{"124":1},"2":{"43":1,"51":2,"59":6,"102":1,"105":1,"107":1,"124":1}}],["맞춤화",{"2":{"42":1}}],["맞춰서",{"2":{"28":1}}],["맞추기",{"2":{"11":1}}],["작동합니다",{"2":{"92":1}}],["작동방식",{"0":{"34":1}}],["작게",{"2":{"38":1}}],["작업",{"2":{"28":1,"30":1,"33":1,"92":1}}],["작성할",{"2":{"106":1}}],["작성시",{"2":{"65":1}}],["작성되어",{"2":{"36":1}}],["작성해왔습니다",{"2":{"15":1}}],["작성에",{"2":{"11":1}}],["작성합니다",{"2":{"7":1,"83":2}}],["작성",{"2":{"5":1,"105":1}}],["60입니다만",{"2":{"76":1}}],["60",{"2":{"44":1,"48":1,"59":1}}],["6000개가",{"2":{"39":1}}],["6",{"0":{"28":1},"1":{"29":1,"30":1,"31":1},"2":{"85":1}}],["찾으려하는",{"2":{"123":1}}],["찾아",{"2":{"114":1}}],["찾아주세요",{"2":{"69":2}}],["찾는",{"2":{"27":1}}],["찾을",{"2":{"12":1,"69":1}}],["실패",{"2":{"106":2,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1}}],["실패하는지",{"2":{"28":1}}],["실제",{"2":{"27":1,"43":1}}],["실행에",{"2":{"117":1}}],["실행에서",{"2":{"4":1}}],["실행될",{"2":{"102":3}}],["실행하기",{"2":{"83":1,"115":1}}],["실행하려",{"2":{"34":1}}],["실행되는",{"2":{"51":1}}],["실행이",{"2":{"51":1}}],["실행할",{"2":{"48":1,"49":1,"51":1,"87":1,"123":1}}],["실행합니다",{"2":{"43":2,"63":1,"87":1,"100":1}}],["실행파일일",{"2":{"124":1}}],["실행파일에",{"2":{"116":2,"124":1}}],["실행파일",{"2":{"102":1,"116":4}}],["실행파일은",{"2":{"66":1,"124":1}}],["실행파일의",{"2":{"55":1,"66":1,"87":1,"115":1,"116":1}}],["실행파일이",{"0":{"93":1},"2":{"51":1,"67":1,"93":1,"114":2,"123":1}}],["실행파일을",{"2":{"36":1,"66":1,"123":1}}],["실행파일들은",{"2":{"93":1}}],["실행파일들을",{"2":{"34":1,"93":1}}],["실행파일들이",{"2":{"34":1}}],["실행을",{"2":{"28":2,"102":1,"123":1}}],["실행됩니다",{"2":{"28":1,"34":1,"99":1,"120":1,"121":1,"123":1}}],["실행시키는",{"2":{"125":1}}],["실행시키세요",{"2":{"30":1,"122":1}}],["실행시킬",{"2":{"34":1,"93":1,"125":1}}],["실행시킬때",{"2":{"28":1}}],["실행시킵니다",{"2":{"22":1}}],["실행했을때",{"2":{"27":1}}],["실행",{"0":{"63":1},"2":{"5":1,"6":1,"51":1,"69":14,"87":3,"99":1,"106":1,"115":3,"116":3,"123":2}}],["먼저",{"2":{"25":1,"51":1}}],["후속",{"2":{"117":1}}],["후에",{"2":{"94":2,"120":1,"121":1}}],["후보판은",{"2":{"109":1}}],["후보판",{"2":{"46":1}}],["후보판으로",{"2":{"46":1}}],["후",{"2":{"25":1,"47":2,"51":2,"102":2}}],["어떻게",{"2":{"93":1}}],["어떠한",{"2":{"40":1,"88":1,"106":1,"107":1,"117":1}}],["어떤",{"2":{"25":1,"27":1,"28":1,"29":1,"34":1,"51":2,"91":1,"102":2}}],["어려울",{"2":{"6":1}}],["yml",{"2":{"127":1}}],["yamllanguage",{"2":{"127":1}}],["yamlname",{"2":{"126":1}}],["yaml",{"2":{"126":1}}],["yarn의",{"2":{"93":1}}],["yarn과",{"2":{"66":1}}],["yarn",{"2":{"66":1,"93":1}}],["yarn을",{"2":{"66":1,"93":1}}],["yes로",{"2":{"76":1}}],["yes가",{"2":{"58":1}}],["yes",{"2":{"31":1,"45":1,"46":1,"47":1,"49":1,"58":2}}],["yum",{"2":{"25":1}}],["your",{"2":{"1":1,"10":1,"22":1}}],["목표로",{"2":{"39":1}}],["목적으로",{"2":{"24":1}}],["목록를",{"2":{"98":1}}],["목록들에",{"2":{"89":1}}],["목록들을",{"2":{"38":1}}],["목록은",{"2":{"41":2}}],["목록을",{"2":{"25":1,"73":1,"109":1,"111":1,"113":1,"114":1,"118":2}}],["목록",{"0":{"72":1,"73":1,"80":1,"81":1},"2":{"7":1,"15":1,"101":1,"102":2}}],["목록입니다",{"2":{"1":1,"18":1,"102":1,"103":1}}],["4",{"0":{"24":1},"1":{"25":1,"26":1},"2":{"83":3,"105":1}}],["배치합니다",{"2":{"107":1}}],["배우세요",{"2":{"23":1}}],["배포들로부터",{"2":{"7":1}}],["배포",{"2":{"7":1,"12":1}}],["및",{"2":{"23":1,"42":1,"60":1,"65":1,"67":1,"69":6,"87":1,"102":3,"107":1,"109":1,"110":3,"111":2,"112":3,"113":3,"125":1}}],["🎉",{"2":{"23":1,"32":1,"69":1}}],["터미널을",{"2":{"22":1}}],["재빌드",{"2":{"68":1}}],["재작성",{"2":{"66":1}}],["재생성합니다",{"2":{"66":1}}],["재생성",{"0":{"66":1},"2":{"51":1,"114":1}}],["재현가능한",{"2":{"39":1}}],["재시작하세요",{"2":{"22":1}}],["재배열",{"2":{"22":1}}],["강제적으로",{"2":{"66":1}}],["강제",{"2":{"58":1}}],["강제합니다",{"2":{"27":1}}],["강제로",{"2":{"22":1,"58":1}}],["강제됩니다",{"2":{"7":1}}],["우회하고",{"2":{"88":1}}],["우회",{"0":{"88":1}}],["우선",{"2":{"50":1,"57":1}}],["우선순위",{"2":{"22":1}}],["우리가",{"2":{"11":1,"32":1,"38":1}}],["우리는",{"2":{"3":1,"24":1,"25":2,"27":3,"91":1,"92":1}}],["요소는",{"2":{"36":1}}],["요구하는",{"2":{"22":1}}],["요청을",{"2":{"2":1,"125":1}}],["등의",{"2":{"99":1,"109":1}}],["등과",{"2":{"66":1}}],["등을",{"2":{"52":1}}],["등이",{"2":{"43":1}}],["등",{"0":{"36":1},"2":{"22":1,"33":1,"45":1,"70":1,"87":1}}],["+",{"2":{"22":2}}],["|",{"2":{"22":11}}],["플래그를",{"2":{"112":1}}],["플래그의",{"2":{"101":1}}],["플리그인",{"0":{"101":1}}],["플로그인들의",{"2":{"89":1}}],["플로그인들은",{"2":{"70":1}}],["플로그인이",{"2":{"22":2}}],["플러그인에서만",{"2":{"124":1}}],["플러그인에서의",{"2":{"109":1}}],["플러그인에서는",{"2":{"106":1}}],["플러그인에서",{"2":{"106":2}}],["플러그인에",{"2":{"34":1,"87":1,"93":1,"110":1}}],["플러그인들과",{"2":{"74":1}}],["플러그인들의",{"2":{"73":1}}],["플러그인들이",{"2":{"34":1}}],["플러그인들은",{"2":{"25":1,"45":1}}],["플러그인들을",{"2":{"1":1,"10":1,"15":2}}],["플러그인은",{"2":{"25":1,"43":1,"49":1,"99":1,"123":1}}],["플러그인과",{"2":{"23":1}}],["플러그인이",{"2":{"22":2,"51":1,"78":1,"88":1,"102":3,"103":1,"109":1,"116":1,"120":2,"121":1,"122":1,"123":1}}],["플러그인을",{"2":{"22":2,"24":1,"27":1,"37":1,"40":1,"49":2,"66":2,"100":1,"122":1,"123":1,"125":2,"126":1,"130":1}}],["플러그인의",{"2":{"15":1,"45":1,"66":1,"87":1,"103":1,"121":2,"123":1}}],["플러그인",{"0":{"15":1,"24":1,"25":1,"26":1,"51":1,"70":1,"99":1,"130":1},"1":{"25":1,"26":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1},"2":{"15":2,"17":1,"22":1,"25":1,"31":1,"32":1,"33":1,"36":1,"40":1,"48":3,"49":7,"51":4,"56":1,"67":1,"69":1,"70":2,"71":2,"73":1,"74":1,"75":1,"87":1,"100":1,"102":3,"103":2,"106":2,"107":1,"110":2,"111":1,"112":2,"113":2,"120":1,"121":1,"123":3,"124":2,"125":2,"127":1,"130":1}}],["오직",{"2":{"92":1,"124":1,"129":1}}],["오도록",{"2":{"22":2}}],["오브젝트의",{"2":{"13":1}}],["난",{"2":{"22":2}}],["프레임워크를",{"2":{"22":4}}],["프레임워크",{"2":{"22":5,"69":1,"94":1}}],["프로그램을",{"2":{"87":1}}],["프로그램들이",{"2":{"87":1}}],["프로그램에",{"2":{"87":1}}],["프로그래밍",{"2":{"39":1}}],["프로덕션",{"2":{"8":1}}],["프로젝트들",{"2":{"89":1}}],["프로젝트들입니다",{"2":{"89":1}}],["프로젝트들은",{"2":{"8":1}}],["프로젝트의",{"2":{"30":1,"32":1,"33":1,"88":1}}],["프로젝트",{"0":{"35":1,"89":1},"1":{"36":1,"37":1,"38":1,"39":1},"2":{"17":1}}],["프로젝트입니다",{"2":{"15":1,"89":1}}],["프로젝트에서",{"2":{"83":1}}],["프로젝트에",{"2":{"3":1}}],["=s",{"2":{"69":2}}],["=",{"2":{"22":9,"31":1,"44":6,"51":1,"69":6}}],["통하지",{"2":{"87":1}}],["통합자에게",{"2":{"60":1}}],["통합할",{"2":{"37":1}}],["통한",{"2":{"22":1,"42":1,"59":1,"60":1,"66":1}}],["통해",{"2":{"17":1,"22":4,"24":1,"27":2,"32":1,"33":1,"34":1,"37":1,"39":2,"40":2,"41":1,"66":3,"67":1,"71":1,"76":1,"105":1,"123":1,"128":1}}],["되야하는",{"2":{"87":1}}],["되도록",{"2":{"46":1}}],["되어있는",{"2":{"103":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["되어있으면",{"2":{"49":1}}],["되어",{"2":{"30":1,"69":2,"105":2,"106":1}}],["되어야하는",{"2":{"103":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["되어야",{"2":{"22":1,"94":1,"117":1}}],["되어야합니다",{"2":{"22":4}}],["되지",{"2":{"22":2}}],["되는",{"2":{"7":1,"103":1,"110":1,"123":1}}],["$releases",{"2":{"128":1}}],["$relative",{"2":{"116":1}}],["$github",{"2":{"128":2}}],["$travis",{"2":{"127":1}}],["$file",{"2":{"119":1}}],["$fpath",{"2":{"22":1,"69":1}}],["$cmd",{"2":{"116":1,"128":2}}],["$install",{"2":{"116":1}}],["$query",{"2":{"109":1}}],["$e",{"2":{"69":4}}],["$env",{"2":{"22":2}}],["$1",{"2":{"51":2}}],["$pwd",{"2":{"30":2,"83":1}}],["$path가",{"2":{"94":1}}],["$path",{"2":{"22":1,"33":1,"87":1}}],["$nu",{"2":{"22":3}}],["$",{"2":{"22":16,"41":1,"44":1,"51":1,"69":17,"83":2,"87":4,"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":5,"115":1,"116":1,"117":1,"118":2,"119":1,"120":3,"121":3,"122":3,"123":4,"126":1}}],["$home으로",{"2":{"59":1}}],["$home",{"2":{"22":8,"28":1,"29":2,"31":1,"43":1,"53":1,"56":1,"59":6,"69":49,"83":1}}],["$asdf",{"2":{"2":1,"49":1,"60":1,"69":2,"87":1,"107":1,"123":1}}],["마이그레이션을",{"2":{"31":1}}],["마지막에",{"2":{"105":1}}],["마지막으로",{"2":{"43":1}}],["마지막",{"2":{"22":1,"48":2}}],["마크다운",{"2":{"11":1}}],["섹션에",{"2":{"60":1,"83":1,"84":1}}],["섹션은",{"2":{"60":1}}],["섹션를",{"2":{"29":1}}],["섹션",{"2":{"22":1}}],["적절히",{"2":{"117":1}}],["적용됩니다",{"2":{"105":1,"118":1}}],["적합한",{"2":{"22":1}}],["적극적으로",{"2":{"21":1}}],["선호됩니다",{"2":{"71":1}}],["선호하는",{"2":{"68":1}}],["선호하시는",{"2":{"21":1}}],["선택적인",{"2":{"109":1}}],["선택적",{"0":{"108":1},"1":{"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1},"2":{"107":1,"112":1,"125":1}}],["선택적으로",{"2":{"4":1}}],["선택한",{"2":{"92":1}}],["선택된",{"2":{"87":1}}],["선택사항들",{"2":{"22":1}}],["선택",{"2":{"14":1,"106":1}}],["선택되었습니다",{"2":{"11":1}}],["방지하려면",{"2":{"107":1}}],["방지하기",{"2":{"22":1}}],["방금",{"2":{"93":1}}],["방식들이",{"2":{"76":1}}],["방식들로",{"2":{"76":1}}],["방식이",{"2":{"71":1}}],["방식",{"2":{"52":1}}],["방식은",{"2":{"33":1}}],["방식을",{"2":{"21":1}}],["방해합니다",{"2":{"22":1}}],["방법은",{"2":{"130":1}}],["방법입니다",{"2":{"70":1}}],["방법이",{"2":{"60":1}}],["방법을",{"2":{"40":1,"68":1}}],["방법으로",{"2":{"32":1,"68":1,"69":2}}],["방법에",{"2":{"22":3}}],["방법",{"0":{"21":1},"2":{"21":1,"68":2}}],["0을",{"2":{"107":1}}],["0이",{"2":{"106":2,"107":2,"109":2,"110":2,"111":2,"112":2,"113":2}}],["0의",{"2":{"83":1,"106":1}}],["0",{"2":{"20":1,"29":1,"30":1,"43":4,"48":1,"67":4,"83":1,"105":4,"106":3,"107":5,"116":1,"117":2}}],["~",{"2":{"20":1,"22":49,"43":1,"69":23,"87":1,"116":2}}],["22",{"2":{"109":1}}],["2014년부터",{"2":{"96":1}}],["2개의",{"2":{"67":1}}],["2를",{"2":{"43":1}}],["2",{"0":{"19":1},"1":{"20":1,"21":1},"2":{"43":6,"83":1,"92":1,"105":1,"109":4,"119":1}}],["노트",{"2":{"18":1,"27":1,"40":1,"43":1,"48":1,"49":1,"50":1,"87":1,"89":1,"103":1,"125":1,"127":1}}],["zdotdir",{"2":{"22":1}}],["zsh는",{"2":{"22":1}}],["zshrc",{"2":{"22":1,"94":1}}],["zshrc에서",{"2":{"69":3}}],["zshrc에",{"2":{"22":4,"69":1}}],["zsh와",{"2":{"22":2}}],["zsh",{"2":{"22":18,"69":4,"94":1}}],["zsh의",{"2":{"22":2,"69":1}}],["zsh로",{"2":{"22":2,"69":1}}],["zypper",{"2":{"18":2}}],["zh",{"2":{"14":4}}],["몇몇은",{"2":{"18":1}}],["일반적인",{"2":{"102":1,"110":1}}],["일반적으로",{"2":{"52":1,"54":1,"125":1}}],["일반",{"2":{"60":1}}],["일관된",{"2":{"22":1}}],["일부",{"2":{"18":1,"105":1,"119":1}}],["일상",{"2":{"15":1}}],["당신은",{"2":{"29":1,"32":1,"83":1}}],["당신이",{"2":{"18":1,"92":1}}],["당신의",{"2":{"2":1,"16":1,"32":1,"33":1,"94":2}}],["18로",{"2":{"105":1}}],["18",{"2":{"105":2,"106":2,"107":2,"117":2}}],["11",{"2":{"85":1}}],["17",{"2":{"67":2,"78":1,"79":1,"80":1,"81":1,"82":1,"85":2,"86":1}}],["1을",{"2":{"50":1}}],["1에서",{"2":{"48":1}}],["15로",{"2":{"43":1}}],["15",{"2":{"43":4,"117":2}}],["10",{"2":{"43":3}}],["16",{"2":{"29":1,"30":1,"67":2}}],["14를",{"2":{"27":1}}],["14",{"2":{"20":1,"67":4}}],["1",{"0":{"18":1},"2":{"83":2,"91":1,"105":4,"109":1,"116":1}}],["싶으시면",{"2":{"88":1}}],["싶으시다면",{"2":{"2":1}}],["싶거나",{"2":{"88":1}}],["싶다면",{"2":{"74":1}}],["싶을",{"2":{"54":1}}],["싶은",{"2":{"17":1,"30":1}}],["해제된",{"2":{"106":1}}],["해결합니다",{"2":{"123":1}}],["해결",{"2":{"103":1}}],["해결하지",{"2":{"94":1}}],["해결됩니다",{"2":{"22":1}}],["해야하나요",{"2":{"93":1}}],["해서",{"2":{"40":1}}],["해보겠습니다",{"2":{"24":1}}],["해주세요",{"2":{"16":1,"22":2}}],["해당",{"2":{"4":1,"22":1,"34":1,"39":1,"41":1,"43":3,"48":2,"49":1,"54":1,"66":1,"74":1,"75":1,"83":2,"87":1,"105":1,"106":1,"109":2,"123":3,"125":1,"130":1}}],["검색은",{"2":{"28":1}}],["검색",{"2":{"15":1}}],["검색을",{"2":{"15":1,"28":1}}],["주어진",{"2":{"79":1,"80":1,"81":1,"82":1}}],["주기적으로",{"2":{"76":1}}],["주세요",{"2":{"43":1,"69":1,"88":1,"119":1}}],["주석을",{"2":{"43":1}}],["주도의",{"2":{"15":1,"89":1}}],["주요한",{"2":{"7":1}}],["유효하거나",{"2":{"119":1}}],["유효한",{"2":{"54":1}}],["유틸리티",{"2":{"115":1,"116":1}}],["유틸리티를",{"2":{"22":1,"123":1}}],["유기적으로",{"2":{"100":1}}],["유용",{"2":{"103":1,"107":1,"119":1}}],["유용한",{"2":{"60":1}}],["유용합니다",{"2":{"23":1,"75":1,"125":1}}],["유지하세요",{"2":{"101":1}}],["유지하므로",{"2":{"38":1}}],["유지",{"2":{"47":2}}],["유지보수를",{"2":{"15":1}}],["유의적",{"2":{"7":1,"46":2,"109":1}}],["공개해서는",{"2":{"129":1}}],["공급자를",{"2":{"109":1}}],["공통된",{"2":{"90":1}}],["공백으로",{"2":{"43":1,"105":1,"114":1,"118":1}}],["공유해주세요",{"2":{"65":1}}],["공유가능한",{"2":{"42":1}}],["공유되는",{"2":{"33":1}}],["공동체",{"2":{"15":2}}],["공식적으로",{"2":{"14":1,"91":1}}],["공식",{"0":{"15":1,"20":1},"2":{"13":1,"14":1,"21":1,"91":1,"124":1}}],["커맨드로",{"2":{"121":1,"122":1}}],["커뮤니티",{"0":{"21":1,"89":1},"2":{"15":1,"89":2}}],["커밋입니다",{"2":{"78":1}}],["커밋들에",{"2":{"12":1}}],["커밋",{"0":{"7":1,"12":1},"2":{"2":1,"7":5,"11":1,"12":1,"43":1,"68":1,"74":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1,"125":1}}],["아닙니다",{"2":{"39":1,"40":2,"103":1}}],["아니라",{"2":{"42":1,"124":1}}],["아니고",{"2":{"38":1}}],["아니면",{"2":{"11":1}}],["아닌",{"2":{"29":1,"46":1,"84":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1}}],["아직",{"2":{"22":2,"66":1,"92":1}}],["아래쪽에",{"2":{"94":1}}],["아래와",{"2":{"67":1,"119":1}}],["아래에서",{"2":{"23":1}}],["아래",{"2":{"15":1,"22":1,"44":1,"69":14,"100":1,"103":1,"123":1}}],["환경을",{"2":{"87":1,"115":1}}],["환경",{"0":{"52":1,"64":1,"103":1},"1":{"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"33":1,"37":2,"39":1,"42":1,"44":1,"50":1,"52":2,"59":1,"83":2,"88":1,"102":1,"103":4,"105":2,"106":1,"107":3,"109":1,"110":2,"111":2,"112":3,"113":2,"114":1,"115":1,"116":1,"117":2,"118":1,"119":2,"120":1,"121":1,"122":1,"128":1,"129":1}}],["환경에서",{"2":{"15":1,"115":1,"116":1,"125":1}}],["환영입니다",{"2":{"15":1}}],["언어의",{"2":{"119":1}}],["언어",{"2":{"39":1,"43":1,"99":1}}],["언제든",{"2":{"15":1}}],["언급한",{"2":{"14":1}}],["도입되기",{"2":{"106":1}}],["도움말",{"2":{"110":1}}],["도움이",{"2":{"88":1}}],["도움은",{"2":{"15":1}}],["도구에",{"2":{"102":1,"112":1}}],["도구의",{"2":{"84":2,"102":1,"109":3}}],["도구들은",{"2":{"10":1}}],["도구들의",{"2":{"1":1}}],["도구",{"2":{"1":1,"110":1,"111":1,"112":1,"113":1}}],["도구를",{"2":{"1":1,"107":1,"112":1}}],["업그레이드",{"2":{"46":1}}],["업데이트하여",{"2":{"100":1}}],["업데이트하고",{"2":{"74":1}}],["업데이트들은",{"2":{"74":1}}],["업데이트가",{"2":{"60":1}}],["업데이트해",{"2":{"43":1}}],["업데이트",{"0":{"68":1,"74":1},"2":{"22":4,"49":1,"51":1,"60":1,"68":1,"102":1,"103":1,"121":2}}],["업데이트를",{"2":{"12":1,"22":1}}],["업무",{"2":{"15":1}}],["가져옵니다",{"2":{"116":2}}],["가져오는",{"2":{"105":1,"118":1,"119":1}}],["가정하고",{"2":{"106":1,"107":1}}],["가",{"2":{"94":1,"123":2}}],["가지",{"2":{"87":1,"100":1}}],["가지고",{"2":{"25":1,"32":1}}],["가능",{"2":{"123":2}}],["가능성이",{"2":{"69":3,"94":1,"105":1}}],["가능한",{"0":{"81":1},"2":{"45":1,"99":1,"102":2,"105":2,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["가능합니다",{"2":{"14":1,"43":1,"44":1,"51":1,"53":1,"107":1}}],["가진",{"2":{"34":1}}],["가장",{"2":{"22":2,"74":1}}],["가이드에",{"2":{"62":1,"69":2}}],["가이드에서",{"2":{"12":1}}],["가이드가",{"2":{"32":1}}],["가이드라인을",{"2":{"16":1}}],["가이드",{"0":{"32":1},"2":{"0":1,"9":1,"23":1}}],["└─",{"2":{"14":4}}],["│",{"2":{"14":1}}],["├─",{"2":{"14":5}}],["똑같이",{"2":{"14":1}}],["세부사항",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"116":1,"118":1,"119":1}}],["세부",{"2":{"83":1}}],["세션에",{"2":{"83":2}}],["세트가",{"2":{"14":1}}],["세팅되는",{"2":{"59":1}}],["세팅",{"0":{"10":1}}],["简体中文",{"2":{"14":1}}],["edit",{"2":{"22":3,"69":3}}],["echo",{"2":{"22":7,"51":1}}],["elm",{"2":{"71":2}}],["else",{"2":{"69":2}}],["elv",{"2":{"22":14,"69":3}}],["elv를",{"2":{"22":2}}],["elv에서",{"2":{"69":3}}],["elv에",{"2":{"22":2}}],["elvish의",{"2":{"52":1}}],["elvish",{"2":{"22":18,"69":9}}],["elixir",{"2":{"15":1,"43":1,"70":1,"83":4,"124":2}}],["etc",{"2":{"22":2,"69":2,"94":2}}],["e",{"2":{"22":9,"33":1}}],["erlang",{"2":{"15":1,"71":1,"74":1,"75":1,"78":1,"79":2,"80":2,"81":2,"82":2,"85":3,"86":1}}],["environment",{"2":{"41":1}}],["env",{"0":{"115":1},"2":{"41":1,"64":1,"87":1,"102":1,"115":3,"116":2}}],["en",{"2":{"14":3}}],["english",{"2":{"14":1}}],["example",{"2":{"116":1}}],["examples",{"2":{"7":1}}],["exec시키는",{"2":{"87":1}}],["exec라는",{"2":{"87":1}}],["executing",{"2":{"51":1}}],["execution",{"2":{"41":1}}],["executes",{"2":{"41":1}}],["executable",{"2":{"41":1,"87":1,"116":1,"123":2}}],["exec",{"0":{"115":1,"116":1},"2":{"41":1,"63":1,"87":4,"102":2,"115":2,"116":4}}],["export",{"2":{"14":1,"53":1,"54":1,"55":1,"56":1,"57":1}}],["다릅니다",{"2":{"52":1}}],["다른",{"2":{"31":1,"32":1,"36":1,"43":1,"45":1,"58":2,"68":1,"101":1,"127":1}}],["다양한",{"2":{"22":1,"40":1,"43":1}}],["다운로드한",{"2":{"121":1}}],["다운로드했다고",{"2":{"107":1}}],["다운로드해야합니다",{"2":{"106":1}}],["다운로드하는",{"2":{"47":1}}],["다운로드하고",{"2":{"43":1,"106":1}}],["다운로드합니다",{"2":{"43":1,"107":1}}],["다운로드를",{"2":{"43":1}}],["다운로드",{"0":{"19":1,"20":1,"21":1},"1":{"20":1,"21":1},"2":{"17":1,"68":1,"78":1,"102":1,"103":1,"106":3,"107":2}}],["다시",{"2":{"14":1,"22":2,"39":1}}],["다음으로",{"2":{"129":1}}],["다음의",{"2":{"59":1}}],["다음에서",{"2":{"51":1}}],["다음을",{"2":{"4":1,"13":1,"22":16,"25":1,"29":1,"30":1,"31":1,"43":1,"59":1,"125":1}}],["다음과",{"2":{"4":1,"13":1,"17":1,"29":1,"30":1,"43":3,"51":1,"114":1,"119":1}}],["다음은",{"2":{"3":1,"52":1}}],["다음",{"2":{"1":1,"2":2,"7":1,"22":3,"41":1,"48":1,"49":1,"51":1,"69":5,"74":1,"76":1,"83":1,"105":1,"106":1,"113":1,"114":1}}],["폴백",{"0":{"84":1}}],["폴백으로",{"2":{"45":1}}],["폴백하려면",{"2":{"43":1}}],["폴백을",{"2":{"11":1}}],["폴더에",{"2":{"14":1}}],["내에",{"2":{"114":1,"124":1}}],["내용을",{"2":{"67":1,"119":1}}],["내용과",{"2":{"60":1}}],["내용은",{"2":{"14":1,"51":1,"83":1,"88":1}}],["내부",{"0":{"60":1},"2":{"60":1}}],["내보내기된",{"2":{"14":1}}],["각각",{"2":{"36":1}}],["각각의",{"2":{"17":1,"32":1,"33":1,"34":1,"105":1}}],["각기",{"2":{"36":1}}],["각",{"2":{"14":1,"15":1,"25":1,"31":1,"39":1,"48":1,"102":1,"103":1,"105":2}}],["나열하며",{"2":{"105":1}}],["나열",{"2":{"102":3,"105":1}}],["나열합니다",{"2":{"67":1,"105":1}}],["나",{"2":{"96":1}}],["나와있는대로",{"2":{"84":1}}],["나오게",{"2":{"59":1}}],["나눠질",{"2":{"32":1}}],["나중",{"2":{"18":1}}],["나누어지고",{"2":{"14":1}}],["나타냅니다",{"2":{"7":1}}],["앞으로",{"2":{"106":1}}],["앞",{"2":{"58":3}}],["앞부분에",{"2":{"22":1}}],["앞서",{"2":{"14":1}}],["앞에",{"2":{"2":1}}],["국제화를",{"2":{"14":1}}],["보다",{"2":{"107":2}}],["보안을",{"2":{"89":1}}],["보여줍니다",{"2":{"44":1,"82":1}}],["보장합니다",{"2":{"40":1}}],["보통",{"2":{"30":1}}],["보실",{"2":{"13":1}}],["보기",{"0":{"82":1,"85":1},"2":{"3":1,"15":1}}],["참고하세요",{"2":{"29":1,"31":1,"70":1,"83":1,"93":1,"101":1}}],["참고",{"2":{"22":2}}],["참고자료에서",{"2":{"13":1}}],["참조를",{"2":{"78":1}}],["참조하세요",{"2":{"13":1,"48":1,"51":1,"102":1,"120":1,"121":1,"122":1}}],["참조",{"2":{"2":1,"13":1,"29":1}}],["테마",{"2":{"13":1}}],["테스팅",{"0":{"5":1,"125":1},"1":{"6":1,"126":1,"127":1}}],["테스트하는",{"2":{"125":1}}],["테스트하기",{"2":{"1":1,"125":2,"126":1}}],["테스트할",{"2":{"125":1}}],["테스트를",{"2":{"83":1}}],["테스트들",{"2":{"5":1}}],["테스트들은",{"2":{"2":1}}],["테스트해보시고",{"2":{"2":1}}],["테스트",{"2":{"1":1,"2":1,"5":2,"6":1,"92":1,"128":1}}],["로",{"2":{"100":1,"106":1}}],["로케일을",{"2":{"14":1}}],["로케일",{"2":{"14":1}}],["로케일들의",{"2":{"14":1}}],["로케일로",{"2":{"13":1}}],["로컬",{"0":{"30":1},"2":{"1":1,"5":1,"11":1,"30":1,"76":1,"109":1,"120":1}}],["추출하는",{"2":{"119":1}}],["추출되었고",{"2":{"13":1}}],["추천",{"2":{"71":1}}],["추가된",{"2":{"102":1,"120":1}}],["추가할",{"2":{"58":1,"91":1,"130":1}}],["추가합니다",{"2":{"22":1,"37":1}}],["추가함으로써",{"2":{"22":1}}],["추가하십시오",{"2":{"129":1}}],["추가하지",{"2":{"58":1}}],["추가하기",{"0":{"71":1},"2":{"10":1,"22":1,"71":2}}],["추가하세요",{"2":{"2":1,"4":1,"22":23,"31":1}}],["추가해주세요",{"2":{"2":1,"43":1}}],["추가",{"2":{"2":1,"58":1}}],["객체가",{"2":{"13":1}}],["큰",{"2":{"13":1}}],["를",{"2":{"13":1,"43":2,"115":1,"116":1,"121":1,"125":2}}],["와야",{"2":{"105":1}}],["와",{"2":{"13":1,"22":1}}],["같은",{"2":{"14":1,"22":2,"32":1,"33":1,"36":1,"40":1,"43":1,"60":1,"66":2,"67":1,"83":1,"119":2}}],["같습니다",{"2":{"13":1,"17":1,"29":1,"30":1,"43":1,"51":1,"92":1,"114":1}}],["같이",{"2":{"4":1,"43":1,"119":1,"128":1}}],["구문",{"2":{"119":1}}],["구현",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"116":1,"118":1,"119":1}}],["구현하세요",{"2":{"100":1}}],["구현된",{"2":{"100":1}}],["구현이",{"2":{"33":1}}],["구분된",{"2":{"105":1}}],["구분하여",{"2":{"43":1,"114":1,"118":1}}],["구분되었습니다",{"2":{"13":1}}],["구축을",{"2":{"39":1}}],["구축된",{"2":{"10":1}}],["구동하기",{"2":{"18":1}}],["구성되어",{"2":{"13":1}}],["타입",{"2":{"12":1}}],["rvmrc",{"2":{"118":1}}],["rbx",{"2":{"109":1}}],["rbenv에서",{"2":{"45":1}}],["rbenv과",{"2":{"36":1}}],["rbenv",{"0":{"36":1}}],["rbenv의",{"2":{"31":1}}],["rs",{"2":{"69":4}}],["rf",{"2":{"69":26}}],["rm",{"2":{"49":1,"69":4}}],["rocky",{"2":{"25":1}}],["root",{"2":{"13":2,"14":3}}],["rc",{"2":{"22":9,"69":3}}],["ruby는",{"2":{"109":1}}],["ruby",{"2":{"15":1,"31":1,"43":2,"45":2,"70":1,"102":1,"109":5,"118":1}}],["running",{"2":{"123":5}}],["runner",{"2":{"92":1}}],["runs",{"2":{"41":1,"126":1}}],["run",{"2":{"11":2}}],["returns",{"2":{"87":2}}],["returned",{"2":{"41":1}}],["recursive",{"2":{"49":1}}],["recreate",{"2":{"41":1}}],["resources",{"2":{"41":1}}],["reshim가",{"2":{"94":1}}],["reshim",{"2":{"41":1,"51":2,"66":2,"93":1,"114":1}}],["remove",{"0":{"122":1},"2":{"41":3,"49":1,"51":2,"75":2,"102":1,"122":6}}],["registered",{"2":{"41":1}}],["ref>",{"2":{"41":1,"125":1}}],["ref",{"2":{"41":2,"43":2,"78":1,"103":6,"106":2,"107":2,"109":2,"110":2,"111":2,"112":2,"113":2,"114":2,"115":2,"116":2,"118":2,"121":5,"125":1}}],["refs",{"2":{"41":1}}],["refactor",{"2":{"7":1}}],["repository로",{"2":{"49":1}}],["repository를",{"2":{"48":1,"49":1}}],["repository",{"0":{"48":1,"49":1},"2":{"41":1,"44":2,"59":2,"76":2,"113":1}}],["repo",{"2":{"41":3,"129":1}}],["readme에는",{"2":{"123":1}}],["readme를",{"2":{"88":1}}],["readme",{"2":{"14":4}}],["revert",{"2":{"7":1}}],["revs을",{"2":{"4":1}}],["revs",{"0":{"4":1},"2":{"4":6}}],["request",{"2":{"7":1,"126":1}}],["release",{"0":{"46":1},"2":{"7":1,"41":1,"44":1,"59":1}}],["시그니처",{"2":{"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["시에는",{"2":{"106":3,"107":2,"109":2,"110":2,"111":2,"112":2,"113":2}}],["시에",{"2":{"83":1}}],["시",{"2":{"53":1,"54":1,"55":1,"56":2,"57":2,"58":1,"115":1,"116":1}}],["시간",{"2":{"48":1}}],["시간이",{"2":{"48":1}}],["시간을",{"2":{"48":1}}],["시켜",{"2":{"22":1}}],["시작",{"0":{"100":1},"1":{"101":1}}],["시작하고",{"2":{"100":1}}],["시작하는",{"2":{"79":1,"80":1,"81":1,"82":1,"100":1,"105":1}}],["시작하기의",{"2":{"62":1}}],["시작하기",{"0":{"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1},"2":{"11":1,"32":1}}],["시작시에",{"2":{"22":1}}],["시스템은",{"2":{"87":1}}],["시스템과",{"2":{"52":1}}],["시스템을",{"2":{"40":1}}],["시스템이",{"2":{"36":1}}],["시스템에서는",{"2":{"58":1}}],["시스템에",{"2":{"29":2}}],["시스템",{"0":{"84":1},"2":{"1":1,"18":1,"39":1,"40":1,"43":1,"84":1}}],["서버",{"2":{"11":1}}],["서버의",{"2":{"8":1}}],["5",{"0":{"27":1},"2":{"11":1,"29":1,"30":1,"43":2,"67":2,"85":1}}],["필터를",{"2":{"109":1}}],["필터링하는",{"2":{"109":1}}],["필터링합니다",{"2":{"80":1,"81":1}}],["필터는",{"2":{"109":1}}],["필터하기",{"2":{"109":1}}],["필터",{"2":{"109":2}}],["필터가",{"2":{"105":1}}],["필수",{"2":{"100":1,"106":1}}],["필수적",{"0":{"104":1},"1":{"105":1,"106":1,"107":1},"2":{"112":1}}],["필수적인",{"2":{"44":1}}],["필수적입니다",{"2":{"2":1,"125":1}}],["필요에",{"2":{"110":1,"111":1,"112":1,"113":1,"127":1}}],["필요",{"2":{"105":2}}],["필요가",{"2":{"60":1,"93":1,"127":1}}],["필요성",{"2":{"36":1}}],["필요했었습니다",{"2":{"33":1}}],["필요할",{"2":{"18":1}}],["필요합니다",{"2":{"14":1,"18":1,"110":1,"111":1,"112":1,"113":1}}],["필요한",{"2":{"11":1,"18":1,"112":1,"124":1}}],["집중하는",{"2":{"11":1}}],["것",{"2":{"92":1}}],["것과",{"2":{"83":1}}],["것인지",{"2":{"58":1}}],["것은",{"2":{"40":1,"48":1,"92":1,"103":1,"124":1}}],["것을",{"2":{"21":1,"22":1,"40":1,"75":1,"93":1,"100":1,"123":1,"125":1}}],["것입니다",{"2":{"11":1,"27":1,"36":1,"88":1}}],["것이",{"2":{"1":1,"105":1}}],["대로",{"2":{"87":2}}],["대해서든",{"2":{"107":1}}],["대해서만",{"2":{"83":2}}],["대해서는",{"2":{"69":2}}],["대해서",{"2":{"66":1}}],["대해",{"2":{"60":1,"124":1}}],["대한",{"2":{"51":1,"87":2,"102":5,"103":1,"106":1,"110":2,"116":2,"127":1,"128":1}}],["대표적인",{"2":{"29":1}}],["대표하는",{"2":{"13":2}}],["대화들",{"2":{"16":1}}],["대부분의",{"2":{"94":1}}],["대부분",{"2":{"11":1,"22":1}}],["대체수단",{"2":{"83":1}}],["대체된",{"2":{"11":1}}],["대체하기",{"2":{"11":1}}],["대신하여",{"2":{"123":1}}],["대신",{"2":{"4":1,"34":1,"87":1,"124":1}}],["않아야",{"2":{"110":1}}],["않나요",{"0":{"93":1}}],["않은",{"2":{"92":1,"123":1,"130":1}}],["않을때",{"2":{"92":1}}],["않을때도",{"2":{"11":1}}],["않을",{"2":{"83":1,"91":1,"94":1,"119":1}}],["않았다면",{"2":{"76":1}}],["않았기",{"2":{"66":1}}],["않았습니다",{"2":{"22":2}}],["않습니다",{"2":{"48":1,"49":3,"66":1,"89":2,"91":1,"105":1,"117":2,"119":1}}],["않습니다만",{"2":{"37":1}}],["않음",{"2":{"48":1,"58":1}}],["않고",{"2":{"38":1,"48":1,"87":1}}],["않으며",{"2":{"39":1}}],["않으면",{"2":{"28":1,"107":1,"116":2}}],["않으셨다면",{"2":{"22":2}}],["않는",{"2":{"1":1,"39":1,"43":1,"56":1,"109":1,"114":1,"119":1}}],["입니다",{"2":{"11":1,"74":1,"106":1,"125":1}}],["는",{"2":{"11":1,"14":1,"49":1,"91":1,"92":1,"125":2}}],["런타임들",{"2":{"33":1}}],["런타임",{"2":{"10":1,"17":2,"36":2}}],["엔진을",{"2":{"10":1}}],["jruby",{"2":{"109":1}}],["j를",{"2":{"103":1,"107":1}}],["jthegedus",{"2":{"97":1}}],["java",{"2":{"72":3}}],["javascript를",{"2":{"11":1}}],["javascript",{"2":{"10":2}}],["jobs",{"2":{"126":1}}],["john",{"2":{"53":1,"55":1,"56":1}}],["join",{"2":{"22":4,"69":2}}],["js에는",{"2":{"67":1}}],["js를",{"2":{"27":1}}],["js는",{"2":{"14":1}}],["js와",{"2":{"11":1}}],["js",{"2":{"10":2,"13":5,"14":2,"15":1,"24":1,"70":1,"106":1,"107":1}}],["json이나",{"2":{"119":1}}],["json은",{"2":{"11":1}}],["json로부터",{"2":{"10":1}}],["json",{"2":{"4":1,"11":1}}],["json에",{"2":{"4":1}}],["브랜치",{"2":{"10":1,"43":1,"74":1,"78":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1,"125":1}}],["브랜치의",{"2":{"7":1}}],["사이의",{"2":{"48":1}}],["사이트의",{"2":{"13":1}}],["사이트를",{"2":{"11":1,"13":1}}],["사이트",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1},"2":{"9":1,"10":1,"11":1}}],["사람들이",{"2":{"33":1}}],["사용될",{"2":{"109":1,"130":1}}],["사용이",{"2":{"105":1}}],["사용중인",{"2":{"94":1}}],["사용중이라면",{"2":{"22":4}}],["사용중이지",{"2":{"11":1}}],["사용가능할",{"2":{"92":1}}],["사용된",{"2":{"69":1,"118":1}}],["사용되고",{"2":{"124":1}}],["사용되지",{"2":{"117":1}}],["사용되어야",{"2":{"109":1}}],["사용되었는지",{"2":{"60":1}}],["사용되는",{"2":{"15":1,"45":1,"103":1,"115":1,"116":1}}],["사용법",{"2":{"53":1,"54":1,"55":1,"56":1,"57":1,"58":1}}],["사용법에",{"2":{"52":1}}],["사용합니다",{"2":{"43":1,"45":2,"130":1}}],["사용됩니다",{"2":{"43":1,"53":1,"54":1,"55":1,"57":1,"60":1}}],["사용을",{"2":{"22":1,"101":1}}],["사용자는",{"2":{"123":1}}],["사용자에게만",{"2":{"118":1}}],["사용자의",{"2":{"44":1}}],["사용자",{"2":{"42":1,"51":2}}],["사용자들은",{"2":{"22":1,"60":1}}],["사용자가",{"2":{"11":1,"38":1,"109":1}}],["사용할까요",{"0":{"40":1}}],["사용할",{"2":{"6":1,"8":1,"21":1,"50":2,"57":1,"87":1,"103":3,"107":1,"124":2,"129":1}}],["사용",{"0":{"81":1},"2":{"4":1,"21":1,"46":2,"56":2,"59":9,"68":1,"105":2,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["사용해서",{"2":{"100":1}}],["사용해야합니다",{"2":{"124":1}}],["사용해야",{"2":{"78":1}}],["사용해",{"2":{"4":1}}],["사용하십시오",{"2":{"110":1,"111":1,"112":1,"113":1}}],["사용하려는",{"2":{"43":1}}],["사용하려면",{"2":{"22":2,"84":1}}],["사용하게합니다",{"2":{"43":1}}],["사용하게",{"2":{"33":1}}],["사용하기",{"0":{"31":1},"2":{"87":1}}],["사용하신다면",{"2":{"22":2,"69":1}}],["사용하고",{"2":{"12":1,"43":1}}],["사용하는",{"2":{"11":1,"15":1,"40":1,"44":1,"69":3,"123":1,"124":1,"127":1}}],["사용하여",{"2":{"6":1,"7":1,"43":1,"49":1,"50":1,"51":1,"69":9,"93":1,"123":2}}],["사용하실",{"2":{"4":1}}],["사용하도록",{"2":{"4":2}}],["사용하세요",{"2":{"2":1,"7":1,"22":3,"74":1,"124":1,"127":1}}],["사용하지",{"2":{"1":1}}],["앱들을",{"2":{"8":1}}],["베이스",{"2":{"8":1}}],["합니다",{"2":{"7":1,"22":4,"33":1,"39":1,"48":1,"53":1,"55":1,"56":1,"78":1,"87":1,"94":1,"105":1,"109":2,"110":1,"114":1,"117":1}}],["mod와",{"2":{"119":1}}],["mit",{"2":{"96":1}}],["mix",{"2":{"83":1}}],["minor을",{"2":{"7":1}}],["my",{"2":{"22":5,"94":1,"126":1,"127":2}}],["md",{"2":{"14":6}}],["matrix",{"2":{"126":2}}],["make",{"2":{"103":1,"107":1}}],["makepkg",{"2":{"21":1}}],["main",{"2":{"87":1,"126":1}}],["master에",{"2":{"68":1}}],["master",{"2":{"41":1}}],["man",{"2":{"123":3}}],["manage",{"2":{"41":1}}],["manpath",{"2":{"22":1}}],["macos에서",{"2":{"22":2}}],["macos",{"2":{"18":2,"22":5,"25":1,"38":1,"69":3,"126":1}}],["markdown",{"2":{"14":2}}],["major을",{"2":{"7":1}}],["의존하고",{"2":{"128":1}}],["의존하는",{"2":{"12":1,"68":1}}],["의존",{"2":{"59":1}}],["의미하는",{"2":{"40":1}}],["의한",{"2":{"29":1,"76":1,"109":1}}],["의해서",{"2":{"93":2}}],["의해",{"2":{"14":1,"18":1,"22":1,"29":1,"34":1,"43":1,"87":3,"99":1,"103":1,"105":2,"117":1,"119":1}}],["의",{"2":{"7":1,"22":3,"74":1}}],["util",{"2":{"41":2,"64":1,"115":1,"116":1}}],["utils",{"2":{"41":1}}],["unix",{"2":{"92":1}}],["uninstall",{"0":{"117":1},"2":{"41":1,"51":1,"69":5,"86":2,"102":1,"117":2}}],["unload",{"2":{"37":1}}],["upgrade",{"2":{"68":2}}],["upstream",{"2":{"38":2,"39":1}}],["updates",{"2":{"60":1}}],["update",{"0":{"121":1},"2":{"7":1,"41":8,"46":1,"51":2,"60":1,"68":2,"74":3,"102":1,"121":6}}],["uz",{"2":{"22":1,"69":1}}],["uses",{"2":{"126":1}}],["users",{"2":{"85":3}}],["user>",{"2":{"1":1,"10":1}}],["used",{"2":{"41":3}}],["use",{"0":{"46":1},"2":{"22":3,"44":1,"52":1,"59":1,"107":1}}],["us",{"2":{"14":1}}],["url이",{"2":{"130":1}}],["url을",{"2":{"130":2}}],["url로",{"2":{"71":1}}],["urls",{"2":{"41":3,"72":1}}],["url>",{"2":{"41":1,"71":1,"125":2,"130":1}}],["url",{"2":{"14":1,"41":1,"48":1,"49":1,"71":1,"103":2,"120":2,"125":1}}],["ubuntu",{"2":{"8":1,"126":1}}],["따른",{"2":{"103":1}}],["따르면",{"2":{"92":1}}],["따르세요",{"2":{"69":1}}],["따릅니다",{"2":{"7":1}}],["따라주세요",{"2":{"22":2,"68":1}}],["따라야",{"2":{"7":1}}],["따라",{"2":{"6":1,"22":3,"37":1,"52":1,"69":2,"110":1,"111":1,"112":1,"113":1,"127":1,"130":1}}],["제한이",{"2":{"128":1}}],["제한",{"0":{"128":1},"1":{"129":1}}],["제외되어야",{"2":{"109":1}}],["제외하면",{"2":{"11":1}}],["제안합니다",{"2":{"105":1}}],["제대로",{"2":{"91":1}}],["제거될",{"2":{"106":1}}],["제거되기",{"2":{"102":1}}],["제거되지",{"2":{"49":2}}],["제거는",{"2":{"75":1}}],["제거를",{"2":{"69":15}}],["제거됩니다",{"2":{"49":1}}],["제거할",{"2":{"49":1,"78":1}}],["제거합니다",{"2":{"49":1,"75":1,"117":1}}],["제거",{"0":{"69":1,"75":1,"86":1},"2":{"47":1,"51":1,"69":23,"102":1,"117":2}}],["제거하기",{"2":{"122":1}}],["제거하면",{"2":{"49":1}}],["제거하도록",{"2":{"47":1}}],["제거하였다는",{"2":{"36":1}}],["제공함으로써",{"2":{"123":1}}],["제공한",{"2":{"109":1}}],["제공자들의",{"2":{"109":1}}],["제공자에",{"2":{"109":1}}],["제공됩니다",{"2":{"109":1}}],["제공되는",{"2":{"105":1,"106":1,"107":1,"117":1,"118":1,"120":1,"121":1,"122":1}}],["제공되지",{"2":{"105":1,"117":1}}],["제공되고",{"2":{"67":1}}],["제공된",{"2":{"51":1,"87":1,"105":1}}],["제공합니다",{"2":{"39":1,"123":1,"126":1}}],["제공하거나",{"2":{"123":1}}],["제공하지",{"2":{"39":1}}],["제공하고",{"2":{"33":1}}],["제공하기",{"2":{"8":1}}],["제공하는",{"2":{"4":1,"67":1,"128":1}}],["제목과",{"2":{"14":1}}],["제목들의",{"2":{"12":1}}],["제목을",{"2":{"7":1,"12":1}}],["제목은",{"2":{"7":1}}],["제목의",{"2":{"7":1}}],["메세지",{"2":{"7":2}}],["메세지는",{"2":{"7":1}}],["결정론적이고",{"2":{"119":1}}],["결정",{"2":{"119":1}}],["결정하기",{"2":{"130":1}}],["결정하는",{"2":{"118":1}}],["결정하고",{"2":{"34":1,"87":1}}],["결정합니다",{"2":{"87":1,"109":1,"119":1}}],["결정됩니다",{"2":{"7":1,"14":1}}],["결과가",{"2":{"59":1}}],["결과적으로",{"2":{"11":1}}],["결과물",{"2":{"6":1}}],["읽히기",{"2":{"124":1}}],["읽을",{"2":{"45":1}}],["읽어보세요",{"2":{"22":1}}],["읽음으로써",{"2":{"7":1}}],["읽기",{"2":{"5":1,"119":1}}],["h",{"2":{"128":1}}],["haxe",{"2":{"123":2}}],["haxe는",{"2":{"123":1}}],["hashnuke",{"2":{"96":1,"97":1}}],["halcyon",{"2":{"72":1}}],["hans",{"2":{"14":4}}],["hw",{"2":{"50":1}}],["head",{"2":{"41":1,"68":2}}],["help입니다",{"2":{"125":1}}],["help",{"0":{"110":1,"111":1,"112":1,"113":1},"2":{"32":1,"41":2,"102":4,"110":2,"111":3,"112":3,"113":3,"123":3}}],["helper는",{"2":{"22":1}}],["helper에",{"2":{"22":1}}],["helper",{"2":{"21":1,"22":1}}],["home",{"2":{"22":2,"44":1,"53":1,"55":1,"56":1,"118":1}}],["homebrew와",{"2":{"60":1}}],["homebrew는",{"2":{"38":1}}],["homebrew에",{"2":{"22":1,"69":2}}],["homebrew",{"0":{"38":1},"2":{"18":1,"21":1,"22":11,"38":1,"52":1,"68":1,"69":5}}],["html",{"2":{"11":1}}],["https",{"2":{"1":5,"10":3,"20":1,"21":1,"26":1,"41":2,"71":1,"72":2,"125":1,"127":1,"130":1}}],["history를",{"2":{"7":1}}],["릴리스",{"0":{"7":1,"12":1},"2":{"46":1,"68":1,"105":1,"109":1}}],["자바스크립트의",{"2":{"119":1}}],["자유로운",{"2":{"110":1,"112":1}}],["자체를",{"2":{"125":1}}],["자체의",{"2":{"123":1}}],["자체",{"2":{"100":1}}],["자체는",{"2":{"87":1}}],["자주",{"0":{"90":1},"1":{"91":1,"92":1,"93":1,"94":1}}],["자신만의",{"2":{"39":1}}],["자동적으로",{"2":{"22":8,"93":1}}],["자동완성에",{"2":{"69":2}}],["자동완성을",{"2":{"22":6,"69":7}}],["자동완성은",{"2":{"22":13}}],["자동완성",{"2":{"22":3}}],["자동으로",{"2":{"7":1,"18":1,"88":1}}],["자동화된",{"2":{"12":1}}],["자동화",{"2":{"1":1,"7":1,"128":1}}],["자세한",{"2":{"6":1,"12":1,"14":1,"51":1,"102":1}}],["39cb398vb39",{"2":{"43":1}}],["3가지",{"2":{"32":1}}],["3",{"0":{"22":1},"2":{"6":1,"11":1,"43":4,"67":2,"78":1,"85":2,"86":1,"105":1,"109":2,"119":1}}],["3를",{"2":{"6":1}}],[">>",{"2":{"22":15}}],[">",{"2":{"6":1,"7":1,"109":3}}],["dylibs",{"2":{"123":1}}],["danhper",{"2":{"97":1}}],["data",{"0":{"56":1},"2":{"49":1,"56":1,"59":2,"69":11,"87":1,"123":5}}],["duration",{"0":{"48":1},"2":{"44":1,"59":1,"76":1}}],["during",{"2":{"6":2}}],["dowload",{"2":{"106":1}}],["download에",{"2":{"103":1}}],["download",{"0":{"47":1,"106":1},"2":{"44":1,"51":1,"59":1,"102":1,"103":1,"106":4,"107":4}}],["doload",{"2":{"106":1}}],["doe",{"2":{"53":1,"55":1,"56":1}}],["dockerized",{"2":{"8":1}}],["docker",{"0":{"8":1},"2":{"8":1}}],["documentation",{"2":{"7":1,"41":1,"113":1}}],["docsify",{"2":{"11":2}}],["docs",{"2":{"7":3,"10":2,"12":2,"13":3,"14":3,"41":1}}],["distro를",{"2":{"92":1}}],["disabled",{"2":{"60":1}}],["disable",{"0":{"49":1},"2":{"44":1,"48":1,"59":1,"76":1}}],["display",{"2":{"41":4}}],["dir가",{"2":{"59":2}}],["directory",{"2":{"58":1,"87":1}}],["direnv",{"0":{"37":1},"2":{"37":3,"88":1}}],["dirmngr",{"2":{"25":1}}],["dir=",{"2":{"22":3,"55":1,"56":1}}],["dir",{"0":{"55":1,"56":1},"2":{"2":1,"22":4,"49":1,"56":1,"59":2,"60":1,"69":12,"87":1,"123":5,"127":1}}],["d",{"2":{"22":2,"69":2}}],["dnf",{"2":{"18":2}}],["dropdown에서의",{"2":{"14":1}}],["deps",{"0":{"111":1},"2":{"102":1,"111":1}}],["dependency를",{"2":{"101":1}}],["dependency",{"2":{"25":1,"38":1,"39":1,"92":1,"111":1}}],["dependencies들을",{"2":{"38":2,"39":1}}],["dependencies",{"0":{"18":1,"25":1},"2":{"10":1,"17":1,"25":2,"102":1,"111":1}}],["debug",{"2":{"41":1}}],["debian",{"2":{"25":1}}],["defineconfig",{"2":{"14":1}}],["default",{"0":{"54":1},"2":{"14":1,"41":3,"54":1,"59":2}}],["description",{"2":{"12":1}}],["description>",{"2":{"7":1}}],["dev",{"2":{"11":1,"89":1}}],["workflows",{"2":{"126":1}}],["workflows에",{"2":{"3":1}}],["wsl",{"2":{"92":1}}],["wsl2에서",{"2":{"92":1}}],["wsl2는",{"2":{"92":1}}],["wsl2",{"2":{"92":1}}],["wsl2을",{"0":{"92":1}}],["wsl1의",{"2":{"91":1}}],["wsl1",{"2":{"91":1}}],["wsl1을",{"0":{"91":1}}],["wrapper를",{"2":{"87":1}}],["wrapper입니다",{"2":{"87":1}}],["which와",{"2":{"87":1}}],["which",{"2":{"41":1,"87":1,"115":1,"116":1}}],["where는",{"2":{"87":1}}],["where",{"2":{"41":1,"87":1}}],["windows",{"2":{"91":1,"92":2}}],["with",{"2":{"7":1,"22":2,"41":3,"51":1,"126":1}}],["will",{"2":{"6":2}}],["website",{"2":{"7":2}}],["npm이라고",{"2":{"67":1}}],["npm",{"2":{"66":2,"67":1,"93":1,"117":1}}],["nproc",{"2":{"50":1}}],["ncpu",{"2":{"50":1}}],["nix는",{"2":{"39":1}}],["nixos는",{"2":{"39":2}}],["nixos",{"0":{"39":1},"2":{"39":1}}],["nvm",{"0":{"36":1},"2":{"36":1}}],["nvmrc와",{"2":{"31":1}}],["n$env",{"2":{"22":3}}],["nu",{"2":{"22":3}}],["nu를",{"2":{"22":3}}],["nu에",{"2":{"22":3}}],["nushell",{"2":{"22":6}}],["nsource",{"2":{"22":1}}],["name을",{"2":{"71":1}}],["name>",{"2":{"41":19,"66":1,"71":2,"74":1,"75":1,"78":1,"79":2,"80":2,"81":2,"82":2,"83":5,"84":1,"85":1,"86":1,"125":2,"127":1,"130":1}}],["name",{"0":{"49":1,"73":1,"76":1},"2":{"15":1,"41":1,"43":1,"44":1,"48":3,"49":8,"51":4,"59":1,"71":1,"73":1,"76":3,"84":1,"99":2,"100":2,"105":1,"109":1,"110":1,"111":1,"112":1,"113":1,"117":1,"120":2,"121":2,"122":2,"125":2,"126":2}}],["nav",{"2":{"14":3}}],["navbars",{"2":{"13":1,"14":3}}],["navbar",{"2":{"13":1,"14":2}}],["neko",{"2":{"123":1}}],["never로",{"2":{"48":1}}],["never",{"2":{"48":1}}],["nexport",{"2":{"22":1}}],["nested",{"2":{"14":2}}],["new",{"2":{"7":1}}],["non",{"2":{"101":1}}],["no가",{"2":{"58":1}}],["no",{"2":{"44":4,"45":1,"46":1,"47":1,"49":1,"59":4}}],["node와",{"2":{"67":1}}],["node",{"2":{"10":2,"15":1,"24":1,"27":1,"31":1,"67":2,"70":1,"85":1,"106":1,"107":1,"125":1}}],["nodejs을",{"2":{"67":1}}],["nodejs의",{"2":{"66":1,"117":1}}],["nodejs를",{"2":{"27":1}}],["nodejs는",{"2":{"25":1,"31":1}}],["nodejs",{"2":{"10":2,"24":1,"26":2,"27":2,"29":2,"30":2,"32":1,"43":2,"66":1,"67":6,"72":3,"85":1,"105":2,"106":1,"107":1,"117":1,"125":3,"130":2}}],["not",{"2":{"6":1}}],["n",{"0":{"36":1},"2":{"6":2,"22":16,"36":1,"128":1}}],["예정이기",{"2":{"106":1}}],["예시는",{"2":{"114":1}}],["예시에서는",{"2":{"83":1}}],["예시입니다",{"2":{"29":1,"123":1}}],["예시",{"0":{"59":1},"2":{"6":1,"31":1,"126":1,"127":1}}],["예를",{"2":{"4":1,"14":1,"43":1,"45":1,"51":1,"66":2,"67":1,"101":1,"105":1,"109":1,"112":1,"123":1,"125":1,"128":1}}],["go",{"2":{"119":2}}],["g로",{"2":{"117":1}}],["given",{"2":{"41":1}}],["gitref",{"2":{"125":2}}],["git에",{"2":{"68":1}}],["git을",{"2":{"59":1}}],["gitlens",{"2":{"4":1}}],["gitlens와",{"2":{"4":1}}],["gitignore",{"0":{"3":1},"2":{"3":3}}],["github에서",{"2":{"98":1,"126":1}}],["github로부터",{"2":{"43":1}}],["github",{"0":{"16":1,"126":1,"129":1},"2":{"1":6,"7":1,"10":4,"15":1,"20":1,"26":1,"41":2,"71":1,"72":2,"89":2,"92":1,"113":1,"125":1,"126":2,"127":1,"129":1,"130":1}}],["github의",{"2":{"1":1,"10":1}}],["git",{"0":{"4":1},"2":{"1":7,"4":7,"10":5,"18":7,"20":1,"21":3,"22":8,"26":1,"30":1,"33":1,"41":6,"48":1,"49":1,"52":1,"68":1,"69":5,"71":3,"72":2,"99":1,"103":3,"105":2,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1,"121":3,"125":3,"127":2,"130":3}}],["g",{"2":{"33":1,"66":1,"93":1}}],["global은",{"2":{"83":1}}],["global",{"2":{"29":1,"41":4,"43":1,"83":4,"84":1,"87":1,"109":1}}],["gnupg2",{"2":{"25":1}}],["gawk",{"2":{"25":3}}],["gpg",{"2":{"25":2}}],["get",{"2":{"25":1}}],["gt",{"2":{"6":1,"7":2,"12":1,"43":1,"48":3,"49":4,"51":5,"58":1,"66":2,"76":1,"84":1,"99":3,"100":2,"105":1,"106":2,"107":3,"109":5,"110":2,"111":2,"112":2,"113":5,"114":3,"115":3,"116":3,"117":2,"120":1,"121":2,"122":1,"125":7}}],["특정",{"2":{"22":1,"34":1,"60":1,"74":1,"78":1,"83":1,"99":1,"102":1,"107":1,"114":1,"116":2}}],["특정한",{"2":{"3":1,"40":1,"42":1}}],["특별한",{"2":{"6":1}}],["중인",{"2":{"110":1}}],["중요한",{"2":{"92":1}}],["중에",{"2":{"50":1,"66":1,"84":1,"113":1,"128":1}}],["중",{"2":{"6":1,"22":1,"105":1}}],["중일",{"2":{"1":1}}],["overview가",{"2":{"111":1,"112":1,"113":1}}],["overview",{"0":{"110":1},"2":{"102":1,"110":1}}],["off",{"2":{"107":1}}],["of",{"2":{"41":9,"107":1}}],["output",{"2":{"41":1,"116":1}}],["output을",{"2":{"6":1}}],["one",{"2":{"41":1}}],["on",{"2":{"41":4,"126":2}}],["osx",{"2":{"127":1}}],["os",{"2":{"25":1,"41":1,"126":2,"127":1}}],["ohmyzsh",{"2":{"22":4}}],["oh",{"2":{"22":5,"94":1}}],["opt",{"2":{"22":9,"69":3}}],["optionally",{"2":{"41":3}}],["optional",{"2":{"7":2,"41":1}}],["origin",{"2":{"74":1}}],["org",{"2":{"21":1}}],["or",{"2":{"1":1,"10":1,"41":6,"84":1}}],["단락",{"2":{"110":1}}],["단계",{"2":{"55":1,"59":1}}],["단계에서",{"2":{"18":1}}],["단지",{"2":{"40":1}}],["단순히",{"2":{"83":1,"119":1}}],["단순함",{"2":{"40":1}}],["단순한",{"2":{"33":1,"87":1}}],["단순화를",{"2":{"6":1,"13":1,"33":1}}],["단",{"2":{"33":1}}],["단위",{"2":{"1":1}}],["디렉토리로",{"2":{"88":1}}],["디렉토리로부터",{"2":{"28":1}}],["디렉토리의",{"2":{"87":1,"114":1}}],["디렉토리를",{"2":{"58":1}}],["디렉토리가",{"2":{"55":1,"92":1}}],["디렉토리와",{"2":{"43":1}}],["디렉토리에",{"2":{"37":1,"43":1,"102":1,"106":3,"107":1}}],["디렉토리에서",{"2":{"30":1,"43":3,"123":1}}],["디렉토리는",{"2":{"30":1,"87":1}}],["디렉토리",{"2":{"30":1,"58":2,"59":1,"69":9,"87":1,"114":2,"120":1}}],["디렉토리까지",{"2":{"28":1}}],["디렉토리부터",{"2":{"28":1}}],["디렉토리들을",{"2":{"2":1}}],["디스크립터",{"2":{"6":1}}],["디버깅",{"2":{"6":1,"65":1}}],["디버깅은",{"2":{"6":1}}],["팁",{"0":{"6":1}}],["에서",{"2":{"87":1}}],["에서의",{"2":{"38":1}}],["에러가",{"2":{"28":1}}],["에",{"2":{"5":1,"14":1,"22":1,"52":1,"66":1,"87":2}}],["전달할",{"2":{"127":1}}],["전체",{"0":{"59":1},"2":{"39":1,"73":1,"102":1,"103":2,"123":1}}],["전",{"2":{"5":1,"11":1,"51":2,"102":1}}],["전에",{"2":{"2":2,"52":1,"115":1,"119":1,"122":1}}],["정도의",{"2":{"110":1}}],["정렬이",{"2":{"105":1}}],["정렬",{"2":{"105":3}}],["정상적으로",{"2":{"92":1}}],["정수",{"2":{"48":1,"50":1}}],["정확히",{"2":{"33":1,"40":1,"130":1}}],["정확한",{"2":{"27":1,"39":1,"119":1}}],["정의할",{"2":{"123":1}}],["정의된",{"2":{"43":4}}],["정의들은",{"2":{"33":1}}],["정의",{"2":{"30":1}}],["정의합니다",{"2":{"7":1,"14":1,"44":1}}],["정보를",{"2":{"65":1}}],["정보는",{"2":{"14":1,"110":1}}],["정보들은",{"2":{"7":1}}],["정보",{"0":{"65":1},"2":{"4":1,"102":1}}],["정적",{"2":{"1":1,"11":1}}],["i",{"2":{"117":1}}],["io",{"2":{"113":1}}],["is",{"2":{"43":2}}],["if",{"2":{"41":1,"128":1}}],["i18n",{"0":{"14":1},"2":{"14":1}}],["ide들에서",{"2":{"4":1}}],["ignorerevsfile",{"2":{"4":1}}],["ignore",{"0":{"4":1},"2":{"4":7}}],["information",{"2":{"41":1}}],["info",{"2":{"41":1,"65":1}}],["inside",{"2":{"41":1}}],["installs",{"2":{"116":1}}],["installation",{"2":{"87":1}}],["install을",{"2":{"43":1}}],["installed",{"2":{"41":5}}],["install",{"0":{"107":1},"2":{"1":1,"4":1,"10":2,"18":5,"21":1,"25":3,"27":1,"41":10,"43":1,"47":1,"51":1,"66":1,"78":2,"79":4,"93":1,"99":1,"102":1,"103":4,"106":10,"107":16,"109":6,"110":7,"111":7,"112":7,"113":7,"114":11,"115":5,"116":6,"118":5}}],["in",{"2":{"41":3,"87":1}}],["into",{"2":{"22":2}}],["interpreter",{"2":{"1":1}}],["initialise",{"2":{"22":1}}],["더보기",{"2":{"37":1,"38":1,"39":1,"76":2}}],["더",{"2":{"3":1,"4":1,"6":1,"12":1,"13":1,"14":1,"31":1,"32":1,"48":1,"70":1}}],["글로벌",{"0":{"29":1},"2":{"3":1,"17":1,"29":2,"43":1,"66":1,"109":1,"117":1}}],["툴에",{"2":{"93":1,"102":1,"110":1}}],["툴은",{"2":{"43":1}}],["툴입니다",{"2":{"39":1}}],["툴의",{"2":{"34":1,"39":1,"43":2,"49":1,"75":1,"99":1,"102":1,"107":1,"109":5,"110":1,"111":1,"112":1,"113":1,"114":1,"116":2,"117":1,"119":1}}],["툴이나",{"2":{"101":1}}],["툴이",{"2":{"34":1,"67":1,"103":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1,"125":2}}],["툴과",{"2":{"33":1,"75":1,"113":1,"123":1}}],["툴을",{"2":{"23":1,"28":1,"40":2,"43":1,"109":1}}],["툴들",{"2":{"39":1,"70":1}}],["툴들을",{"2":{"33":1,"34":2,"40":1,"43":1,"70":1,"89":1}}],["툴들이",{"2":{"28":1,"29":1}}],["툴들의",{"2":{"8":1,"22":1,"32":1,"40":1}}],["툴들은",{"2":{"1":1,"36":1,"66":1}}],["툴",{"0":{"31":1},"2":{"3":1,"7":1,"10":1,"17":2,"27":1,"28":3,"29":1,"30":1,"32":1,"33":2,"36":2,"40":1,"43":1,"54":1,"56":1,"66":1,"83":1,"101":1,"102":2,"109":1,"115":1,"118":2,"119":1}}],["관계",{"2":{"119":1}}],["관한",{"2":{"52":1,"123":1}}],["관찰할",{"2":{"28":1}}],["관심에",{"2":{"16":1}}],["관리",{"2":{"84":1,"110":1}}],["관리자를",{"2":{"69":9}}],["관리자",{"0":{"97":1},"2":{"60":1}}],["관리함으로써",{"2":{"39":1}}],["관리와",{"2":{"39":1}}],["관리합니다",{"2":{"38":1,"93":1}}],["관리의",{"2":{"36":1}}],["관리할",{"2":{"32":1,"40":1}}],["관리를",{"2":{"29":1,"40":1,"89":1,"99":1}}],["관리되지",{"2":{"43":1}}],["관리되는",{"2":{"29":1}}],["관리되고",{"2":{"10":1}}],["관리방법을",{"2":{"23":1}}],["관리해야합니다",{"2":{"38":1}}],["관리해야",{"2":{"23":1}}],["관리됩니다",{"2":{"22":1,"29":1}}],["관리하지",{"2":{"37":1,"38":1,"39":1}}],["관리하기",{"2":{"34":1}}],["관리하기를",{"2":{"1":1}}],["관리하세요",{"2":{"32":1}}],["관리하는",{"2":{"28":1,"89":1,"109":1}}],["관리하고",{"2":{"15":1,"17":1,"93":1}}],["관습적인",{"2":{"7":1,"12":2}}],["관습적",{"0":{"7":1,"12":1},"2":{"7":1}}],["관련된",{"0":{"35":1},"1":{"36":1,"37":1,"38":1,"39":1},"2":{"3":2,"15":1,"22":2,"75":1,"89":1,"90":1,"113":1,"120":1,"121":1,"122":1,"123":1}}],["만듦",{"2":{"83":1}}],["만들어줍니다",{"2":{"61":1}}],["만들어졌습니다",{"2":{"36":1}}],["만들어주세요",{"2":{"12":1}}],["만드는",{"2":{"36":1,"100":1}}],["만드실때는",{"2":{"12":1}}],["만드시기",{"2":{"2":1}}],["만듭니다",{"2":{"7":3}}],["만약",{"2":{"1":1,"2":1,"22":4,"69":1,"76":2,"94":1}}],["풀",{"0":{"7":1,"12":1},"2":{"2":1,"7":3,"51":1,"103":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1,"125":1}}],["위의",{"2":{"89":1}}],["위에",{"2":{"84":1}}],["위치",{"2":{"55":1,"56":1,"59":1}}],["위치로",{"2":{"53":1,"55":1,"56":1}}],["위치와",{"2":{"52":1}}],["위치는",{"2":{"52":1}}],["위치입니다",{"2":{"44":1}}],["위치에",{"2":{"22":1,"107":1,"114":1,"127":1}}],["위치한",{"2":{"14":1}}],["위치해야합니다",{"2":{"14":1,"106":1}}],["위",{"2":{"13":1,"22":2}}],["위해서는",{"2":{"111":1,"112":1,"113":1}}],["위해",{"2":{"2":1,"6":1,"8":2,"11":2,"13":1,"15":1,"22":4,"29":1,"31":1,"33":1,"34":2,"36":1,"48":1,"69":15,"83":1,"93":1,"99":1,"102":1,"109":1,"119":1,"123":1,"125":1,"128":1,"130":1}}],["위한",{"0":{"101":1},"2":{"1":3,"6":1,"10":1,"12":1,"13":1,"14":1,"15":1,"18":1,"22":2,"27":1,"28":1,"36":1,"40":2,"43":1,"66":1,"68":1,"70":1,"89":1,"92":1,"95":1,"102":2,"114":4,"125":1,"126":1}}],["향상을",{"2":{"2":1}}],["속도",{"0":{"128":1},"1":{"129":1},"2":{"2":1,"128":1}}],["리눅스와",{"2":{"125":1}}],["리포트",{"2":{"65":1}}],["리포지토리는",{"2":{"76":1,"126":1}}],["리포지토리로부터",{"2":{"49":1}}],["리포지토리가",{"2":{"49":2,"100":1}}],["리포지토리입니다",{"2":{"30":1,"99":1}}],["리포지토리",{"0":{"73":1,"76":1},"2":{"15":1,"48":1,"49":2,"100":2}}],["리포지토리들을",{"2":{"15":1}}],["리포지토리에서",{"2":{"16":1,"33":1}}],["리포지토리에",{"2":{"2":1,"3":1,"36":1,"71":2,"129":1,"130":1}}],["리포지토리를",{"2":{"2":1,"49":2,"100":2,"130":1}}],["리포지토리의",{"2":{"1":1,"25":1,"48":1,"49":1,"74":1,"103":2}}],["리퀘스트",{"0":{"7":1,"12":1},"2":{"2":1,"7":3}}],["리뷰",{"2":{"2":1}}],["버전과",{"2":{"109":1}}],["버전에서",{"2":{"114":1,"115":1,"116":1}}],["버전에",{"2":{"102":1,"105":1,"106":1,"110":1,"111":1,"112":1,"113":1}}],["버전화된",{"2":{"74":1}}],["버전이",{"2":{"46":1,"49":1,"84":1,"105":1,"119":1}}],["버전으로의",{"0":{"84":1}}],["버전으로",{"2":{"43":1,"80":1,"81":1,"109":2}}],["버전의",{"2":{"33":1,"40":1,"63":1,"67":1,"102":1,"107":1,"109":1,"116":2,"125":1}}],["버전들의",{"2":{"75":1,"107":1}}],["버전들은",{"2":{"30":1,"43":3}}],["버전들이",{"2":{"27":1}}],["버전들",{"2":{"17":1}}],["버전들을",{"2":{"1":1,"10":1,"23":1,"27":2,"32":1,"39":1,"56":1,"67":1,"102":1,"105":1}}],["버전",{"0":{"27":1,"28":1,"31":1,"67":1,"77":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"85":1,"86":1},"1":{"29":1,"30":1,"31":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1},"2":{"17":1,"28":1,"29":1,"31":2,"32":1,"33":3,"36":1,"40":2,"43":2,"45":3,"46":2,"51":1,"66":1,"83":3,"84":1,"99":1,"102":4,"103":1,"105":1,"106":2,"107":2,"109":4,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1,"119":2}}],["버전을",{"2":{"7":1,"27":3,"28":2,"29":1,"30":1,"32":1,"34":2,"40":1,"43":2,"45":1,"54":1,"79":1,"82":1,"83":4,"84":2,"87":1,"102":1,"105":5,"106":1,"107":3,"109":5,"117":2,"118":2,"119":4}}],["버그",{"2":{"2":1,"65":1}}],["x의",{"2":{"76":1}}],["x분",{"2":{"76":1}}],["x26",{"2":{"2":1,"6":1,"22":2,"69":2}}],["x3c",{"2":{"1":1,"7":3,"10":1,"41":38,"63":1,"64":1,"66":2,"67":1,"71":3,"74":1,"75":1,"78":2,"79":3,"80":3,"81":3,"82":3,"83":13,"84":1,"85":1,"86":2,"116":3,"125":6,"126":1,"127":5,"130":2}}],["f",{"2":{"69":3}}],["fetch합니다",{"2":{"74":1}}],["fetch",{"2":{"68":1}}],["feature",{"2":{"7":2,"11":1}}],["feat",{"2":{"7":4}}],["from",{"2":{"41":1}}],["fpath를",{"2":{"22":2}}],["fpath=",{"2":{"22":1,"69":1}}],["fpath",{"2":{"22":1}}],["foo라고",{"2":{"123":1,"124":1}}],["foo라는",{"2":{"51":1}}],["foox",{"2":{"116":1}}],["foo는",{"2":{"78":1}}],["foo를",{"2":{"78":1}}],["foo",{"2":{"14":2,"51":1,"116":4,"123":10,"124":1}}],["force",{"0":{"58":1},"2":{"22":1,"58":1,"69":5}}],["for",{"2":{"2":1,"7":1,"41":7,"91":1,"92":1}}],["format",{"2":{"2":2,"11":1}}],["formatter",{"2":{"1":1}}],["fork",{"2":{"1":1,"10":2}}],["fork하거나",{"2":{"1":1}}],["flag로",{"2":{"6":1}}],["fi",{"2":{"128":1}}],["filter",{"2":{"41":2}}],["file는",{"2":{"123":1}}],["file가",{"2":{"59":1}}],["filenames",{"0":{"118":1},"2":{"102":1,"118":1}}],["filename가",{"2":{"59":1}}],["filename=tool",{"2":{"54":1}}],["filename",{"0":{"54":1},"2":{"59":1}}],["file=",{"2":{"53":1}}],["file로",{"2":{"44":1}}],["file",{"0":{"45":1,"53":1,"119":1},"2":{"4":2,"31":1,"41":2,"44":1,"59":2,"102":1,"103":1,"118":1,"119":1}}],["fish를",{"2":{"22":1,"69":3}}],["fish에서",{"2":{"69":3}}],["fish에",{"2":{"22":3}}],["fish",{"2":{"22":15,"52":1,"69":11,"87":1,"94":2}}],["fix",{"2":{"2":2,"7":4}}],["same",{"2":{"123":5}}],["save",{"2":{"22":3}}],["suite를",{"2":{"92":1}}],["support가",{"2":{"92":1}}],["subsystem",{"2":{"91":1,"92":1}}],["sudo가",{"2":{"18":1}}],["sysctl",{"2":{"50":1}}],["system을",{"2":{"84":1}}],["system으로",{"2":{"84":1}}],["system",{"2":{"43":3,"84":2}}],["src",{"2":{"43":1}}],["steps",{"2":{"126":1}}],["stderr에",{"2":{"117":1}}],["stdout",{"2":{"117":1}}],["stable과",{"2":{"128":1}}],["stable",{"0":{"109":1},"2":{"41":5,"102":1,"109":1}}],["strategy",{"2":{"126":1}}],["stratus3d",{"2":{"97":1}}],["string",{"2":{"22":2,"41":1,"69":2}}],["str",{"2":{"22":2}}],["style",{"2":{"7":1}}],["sort",{"2":{"101":1,"105":2}}],["sourcing이",{"2":{"94":1}}],["source합니다",{"2":{"123":1}}],["source하기",{"2":{"52":1}}],["source하고",{"2":{"22":2,"69":11}}],["source",{"2":{"22":5,"87":3,"94":2,"103":2,"120":1,"123":1}}],["some",{"2":{"6":3,"7":3}}],["silent",{"2":{"128":1}}],["si",{"2":{"21":1}}],["sidebar의",{"2":{"14":1}}],["sidebars",{"2":{"13":1,"14":3}}],["sidebar",{"2":{"13":1,"14":4}}],["specified",{"2":{"41":1}}],["specific",{"2":{"2":1,"41":2}}],["specifying",{"2":{"41":1}}],["spack",{"2":{"18":2}}],["ssg",{"2":{"11":1}}],["script",{"2":{"87":2,"127":2}}],["scripts",{"2":{"2":3,"5":2}}],["scope",{"2":{"7":1}}],["sed",{"2":{"105":1,"111":1}}],["setup",{"2":{"100":1}}],["set",{"2":{"22":3,"41":7,"69":3}}],["set은",{"2":{"11":1}}],["settings",{"2":{"4":1}}],["semantic",{"2":{"7":1}}],["semver",{"2":{"7":4}}],["s",{"2":{"6":2,"18":1,"22":5}}],["sh을",{"2":{"69":2}}],["show",{"2":{"41":3}}],["short",{"0":{"49":1,"73":1,"76":1},"2":{"15":1,"44":1,"48":1,"49":5,"59":1,"71":2,"73":1,"76":2}}],["shortname",{"0":{"130":1},"2":{"15":1,"73":1,"130":2}}],["shim에서",{"2":{"116":4}}],["shim은",{"2":{"107":1}}],["shim을",{"2":{"66":2,"67":1,"93":2,"115":1,"124":1}}],["shim과",{"2":{"58":1}}],["shim들은",{"2":{"66":1}}],["shim들",{"2":{"56":1,"114":2,"117":1}}],["shim들을",{"2":{"36":1,"87":1,"88":1,"102":1,"114":2}}],["shim",{"0":{"66":1,"67":1,"124":1},"2":{"41":3,"51":1,"63":1,"67":4,"87":2,"115":2,"116":2,"124":2}}],["shim이",{"2":{"34":1,"66":1,"87":1,"93":1}}],["shims를",{"2":{"93":1}}],["shims들을",{"0":{"94":1},"2":{"34":1}}],["shims",{"0":{"87":1,"88":1},"1":{"88":1},"2":{"2":1,"33":1,"41":1,"87":2,"124":1}}],["sh를",{"2":{"22":5}}],["sh",{"2":{"22":13,"52":1,"58":1,"69":14,"87":3,"94":1,"127":1}}],["shgit",{"2":{"4":2}}],["shfmt",{"2":{"1":4}}],["shellcmd=",{"2":{"128":1}}],["shellcheck",{"2":{"1":3}}],["shell$",{"2":{"123":1}}],["shellfoo",{"2":{"123":1}}],["shellusage",{"2":{"116":1}}],["shelluse",{"2":{"69":3}}],["shell은",{"2":{"83":1}}],["shellif",{"2":{"69":2}}],["shellpacman",{"2":{"69":4}}],["shellbrew",{"2":{"69":5}}],["shellrm",{"2":{"69":25}}],["shell➜",{"2":{"67":2}}],["shellexport",{"2":{"22":2}}],["shellecho",{"2":{"22":8}}],["shellmkdir",{"2":{"22":4}}],["shellsource",{"2":{"22":2,"69":3}}],["shellgit",{"2":{"20":1}}],["shelldocs",{"2":{"14":1}}],["shellnpm",{"2":{"10":1,"11":2}}],["shellasdf",{"2":{"1":2,"10":2,"26":1,"27":1,"29":1,"30":1,"63":1,"64":1,"65":1,"66":1,"67":1,"71":2,"72":2,"73":1,"74":2,"78":1,"79":2,"80":2,"81":2,"82":2,"83":2,"84":1,"85":1,"86":1,"125":1,"127":1}}],["shell",{"2":{"1":1,"2":1,"5":1,"6":1,"10":1,"22":16,"41":3,"69":8,"83":1,"84":1,"87":1,"130":1}}],["location",{"2":{"59":1}}],["local은",{"2":{"83":1}}],["local",{"2":{"30":1,"41":4,"43":1,"83":2,"84":3,"87":1,"109":1}}],["locales",{"2":{"14":1}}],["locales의",{"2":{"14":1}}],["locally",{"2":{"2":1}}],["load와",{"2":{"37":1}}],["legacy",{"0":{"45":1,"118":1,"119":1},"2":{"31":1,"59":1,"102":2,"118":2,"119":1}}],["ln",{"2":{"22":4}}],["last",{"0":{"48":1},"2":{"44":1,"59":1,"76":1}}],["latest는",{"2":{"27":1}}],["latest",{"0":{"109":1},"2":{"27":2,"29":1,"30":1,"41":15,"79":4,"82":4,"83":3,"102":1,"106":1,"107":1,"109":9,"125":1,"126":2,"128":1}}],["lang",{"2":{"14":3,"41":1}}],["label",{"2":{"14":3}}],["lt",{"2":{"7":2,"12":1,"43":1,"48":3,"49":4,"51":5,"58":1,"66":2,"76":1,"84":1,"99":3,"100":2,"105":1,"106":2,"107":3,"109":5,"110":2,"111":2,"112":2,"113":5,"114":3,"115":3,"116":3,"117":2,"120":1,"121":2,"122":1,"125":7}}],["license",{"2":{"96":1}}],["lib",{"2":{"22":6,"69":3,"123":7}}],["libexec",{"2":{"22":10,"69":4}}],["link를",{"2":{"123":1}}],["link",{"2":{"113":2}}],["links",{"0":{"113":1},"2":{"102":1,"113":1}}],["linux",{"2":{"18":4,"25":1,"38":1,"91":1,"92":1,"127":1}}],["lint",{"2":{"2":4}}],["listed",{"2":{"41":1}}],["list",{"0":{"105":1,"114":1,"118":1},"2":{"2":1,"27":2,"41":9,"48":1,"49":1,"72":4,"73":1,"76":1,"80":4,"81":4,"99":1,"102":3,"105":4,"107":1,"109":2,"114":1,"117":1,"118":1,"128":1}}],["luizm",{"2":{"1":2}}],["코드입니다",{"2":{"106":2,"107":2,"109":2,"110":2,"111":2,"112":2,"113":2}}],["코드스페이스에서",{"2":{"89":1}}],["코드",{"2":{"2":1,"11":1,"47":3,"102":1,"103":1,"106":4,"107":1,"128":1,"129":1}}],["코드를",{"2":{"2":1,"50":1,"51":2,"57":1,"89":1,"103":1,"107":2}}],["코어팀이",{"2":{"124":1}}],["코어는",{"2":{"89":1,"109":1}}],["코어의",{"2":{"32":1}}],["코어가",{"2":{"15":1,"34":1,"110":1}}],["코어",{"0":{"23":1,"61":1},"1":{"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1},"2":{"0":1,"1":1,"12":1,"15":1,"17":1,"23":1,"32":1,"50":3,"55":1,"57":1,"61":1,"89":1,"103":1,"107":2,"117":1}}],["혹은",{"2":{"2":1,"8":1,"10":1,"17":1,"21":1,"22":9,"27":1,"32":1,"38":1,"43":1,"68":1,"69":2,"89":1,"94":1,"103":1}}],["원활하게",{"2":{"61":1}}],["원격",{"2":{"2":1}}],["원본",{"2":{"1":1}}],["bit",{"2":{"123":2}}],["bin에",{"2":{"107":1}}],["bin",{"0":{"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":2,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1},"2":{"55":1,"59":1,"87":1,"102":18,"103":1,"105":1,"106":3,"107":6,"109":2,"110":1,"111":2,"112":2,"113":2,"114":4,"115":1,"116":5,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1,"128":2}}],["bin와",{"2":{"2":1}}],["by",{"2":{"41":1}}],["branches",{"2":{"126":1}}],["branch",{"2":{"20":1,"41":3}}],["brazilian",{"2":{"14":1}}],["brew",{"2":{"18":1,"21":1,"22":12,"25":1,"68":2,"69":7}}],["breaking",{"2":{"7":2}}],["br",{"2":{"14":7}}],["build",{"2":{"7":1,"127":1}}],["before",{"2":{"127":1}}],["begins",{"2":{"41":1}}],["being",{"2":{"41":2}}],["be",{"2":{"6":2}}],["blame에서",{"2":{"4":1}}],["blame과",{"2":{"4":1}}],["blame",{"0":{"4":1},"2":{"4":10}}],["baz`",{"2":{"123":1}}],["baz",{"2":{"123":1}}],["bat",{"2":{"123":6}}],["bats",{"0":{"5":1,"6":1},"1":{"6":1},"2":{"1":3,"2":2,"4":1,"5":2,"6":7}}],["bar`",{"2":{"123":1}}],["bar",{"2":{"51":1,"123":1}}],["bar라는",{"2":{"51":1}}],["bash`",{"2":{"123":3}}],["bash1",{"2":{"119":1}}],["bashbin",{"2":{"114":1}}],["bashgit",{"2":{"111":1,"113":1}}],["bashasdf",{"2":{"75":1}}],["bashrc",{"2":{"22":2}}],["bashrc에서",{"2":{"69":3}}],["bashrc에",{"2":{"22":4}}],["bash로",{"2":{"22":2}}],["bash에",{"2":{"5":1}}],["bash를",{"2":{"1":1}}],["bash",{"2":{"1":2,"2":4,"5":1,"22":18,"52":1,"59":1,"69":14,"94":1,"100":1,"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":2,"119":1,"120":1,"121":1,"122":1,"123":8,"124":1}}],["그렇지",{"2":{"116":2}}],["그냥",{"2":{"113":1}}],["그러나",{"2":{"93":1}}],["그것의",{"2":{"40":1}}],["그리고",{"2":{"2":1,"10":1,"16":1,"33":1,"36":2,"39":1,"40":1,"43":1,"69":4,"92":1,"94":1,"106":1,"107":2}}],["그",{"2":{"2":1,"13":1,"22":2,"40":1,"49":1,"68":1,"69":3,"100":1,"106":1,"107":2,"114":2,"124":1,"125":1}}],["지시합니다",{"2":{"114":1}}],["지에",{"2":{"51":1}}],["지속",{"2":{"48":1}}],["지정되지",{"2":{"130":1}}],["지정하면",{"2":{"125":2}}],["지정하시고",{"2":{"2":1}}],["지정한",{"2":{"102":1,"116":4}}],["지정할",{"2":{"78":1}}],["지정된",{"2":{"43":1,"48":1,"87":1,"102":2,"106":3,"107":3,"117":1,"125":1}}],["지",{"2":{"34":1}}],["지원은",{"2":{"106":1}}],["지원되지",{"2":{"91":1}}],["지원되는",{"2":{"14":1,"45":1,"51":1,"83":1}}],["지원을",{"2":{"70":1,"91":1,"99":1}}],["지원됩니다",{"2":{"31":1,"83":1}}],["지원",{"0":{"21":1},"2":{"40":1}}],["지원합니다",{"2":{"14":1,"31":2}}],["지원하나요",{"0":{"91":1,"92":1}}],["지원하고",{"2":{"11":1}}],["지원하는",{"2":{"1":1,"43":1,"78":1,"89":1,"99":1}}],["지난",{"2":{"7":1,"48":1,"76":1}}],["경과하면",{"2":{"48":1}}],["경쟁하기",{"2":{"36":1}}],["경고",{"2":{"22":2,"28":1,"124":1,"129":1}}],["경고를",{"2":{"22":1}}],["경로가",{"2":{"128":1}}],["경로일",{"2":{"120":1}}],["경로라는",{"2":{"119":1}}],["경로이어야",{"2":{"114":1}}],["경로는",{"2":{"114":1}}],["경로를",{"2":{"87":2,"103":1,"114":1,"116":8,"123":1,"127":1}}],["경로여야",{"2":{"53":1,"55":1,"56":1}}],["경로들을",{"2":{"2":1}}],["경로",{"2":{"2":1,"43":1,"53":1,"58":1,"87":1,"102":2,"103":3,"106":2,"107":2,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":2,"116":2,"118":1,"120":1,"121":1,"122":1}}],["경로에",{"2":{"2":1,"107":1}}],["경우에만",{"2":{"124":1}}],["경우에는",{"2":{"105":1}}],["경우가",{"2":{"105":1,"127":1}}],["경우는",{"2":{"52":1,"69":1,"93":1}}],["경우",{"2":{"1":1,"4":1,"22":1,"45":1,"48":1,"49":1,"50":1,"51":1,"56":1,"67":1,"68":1,"69":1,"78":1,"83":1,"93":1,"94":1,"105":2,"106":3,"107":4,"109":3,"110":2,"111":2,"112":2,"113":2,"114":3,"115":2,"116":2,"118":2,"119":1,"123":2,"127":1,"128":1,"130":1}}],["변수에",{"2":{"129":1}}],["변수나",{"2":{"112":1}}],["변수의",{"2":{"103":1,"110":1,"111":1,"112":1,"113":1}}],["변수로",{"2":{"83":1}}],["변수들은",{"2":{"52":1}}],["변수들을",{"2":{"37":2,"42":1,"103":1}}],["변수가",{"2":{"50":1,"105":1,"107":2,"117":1,"119":1}}],["변수",{"0":{"52":1,"64":1,"103":1},"1":{"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"33":1,"44":1,"52":1,"59":1,"103":1,"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["변수를",{"2":{"2":1,"83":1,"88":1,"103":1,"128":1}}],["변경가능합니다",{"2":{"22":1}}],["변경하지",{"2":{"22":2}}],["변경되었습니다",{"2":{"22":2,"69":1}}],["변동사항을",{"2":{"7":1}}],["변화들을",{"2":{"2":1,"7":1}}],["포함되어",{"2":{"125":1}}],["포함해야합니다",{"2":{"106":1}}],["포함된",{"2":{"43":2,"114":2}}],["포함시킬",{"2":{"40":1}}],["포함합니다",{"2":{"11":1,"42":1}}],["포함",{"2":{"1":1}}],["스크립트로",{"2":{"107":1,"123":1}}],["스크립트에는",{"2":{"105":1,"117":1}}],["스크립트에서",{"2":{"103":2,"105":1,"106":1,"107":3,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["스크립트에",{"2":{"102":1,"103":1,"105":2}}],["스크립트가",{"2":{"100":1,"106":3,"107":2,"109":1,"110":1,"114":1,"119":2,"123":1}}],["스크립트는",{"2":{"87":1,"101":1,"106":2,"107":2,"109":2,"119":1,"120":1,"121":1}}],["스크립트의",{"2":{"40":1,"55":1,"102":1,"109":1,"111":1,"112":1,"113":1}}],["스크립트들이",{"2":{"99":1}}],["스크립트들로",{"2":{"36":1}}],["스크립트들은",{"2":{"22":1,"99":1}}],["스크립트들을",{"0":{"101":1},"2":{"11":1,"100":1}}],["스크립트와",{"2":{"22":2}}],["스크립트",{"0":{"102":1,"104":1,"108":1},"1":{"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1},"2":{"1":1,"2":1,"87":1,"102":1,"123":1}}],["스크립트를",{"2":{"1":1,"100":1,"102":1,"105":1,"106":3,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"122":1,"123":1}}],["셸에서",{"2":{"52":1}}],["셸에",{"2":{"37":1,"52":1,"87":1}}],["셸을",{"2":{"22":1}}],["셸이",{"0":{"94":1},"2":{"22":2,"69":1}}],["셸",{"2":{"1":2,"22":3,"34":1,"36":1,"40":2,"59":1,"65":1,"83":2,"94":1,"101":1}}],["pipeline",{"2":{"129":1}}],["pipeline을",{"2":{"12":1}}],["pkgbuild",{"2":{"68":1}}],["python",{"2":{"43":1,"84":1}}],["python이",{"2":{"29":1}}],["ps1",{"2":{"22":4}}],["ps1에",{"2":{"22":3}}],["p",{"2":{"22":4}}],["portable",{"2":{"101":1}}],["portuguese",{"2":{"14":1}}],["post",{"0":{"120":1,"121":1},"2":{"51":3,"102":2,"103":1,"120":3,"121":4,"122":2}}],["posix",{"2":{"1":1,"22":3}}],["powershell",{"2":{"22":7}}],["pt",{"2":{"14":6}}],["pruning에",{"2":{"75":1}}],["project",{"2":{"85":1}}],["proc",{"2":{"50":1}}],["provide",{"2":{"41":1}}],["provided",{"2":{"41":2}}],["profile",{"2":{"22":8,"94":1}}],["profile에서",{"2":{"69":3}}],["profile에",{"2":{"22":6}}],["prev",{"2":{"103":1,"121":1}}],["prepend=no",{"2":{"58":1}}],["prepend",{"0":{"58":1}}],["prepend를",{"2":{"22":1}}],["pre",{"0":{"122":1},"2":{"51":5,"102":1,"120":2,"121":2,"122":3}}],["prefix",{"2":{"22":12,"69":6}}],["pr을",{"2":{"12":1}}],["pr",{"2":{"12":2,"14":1}}],["print",{"2":{"41":2}}],["printing",{"2":{"6":1}}],["printed",{"2":{"6":2}}],["printf",{"2":{"6":2}}],["parsing할",{"2":{"119":1}}],["parse하여",{"2":{"119":1}}],["parse",{"0":{"119":1},"2":{"102":1,"119":1}}],["parser",{"2":{"1":1,"102":1}}],["particular",{"2":{"41":1}}],["path>",{"2":{"116":2,"127":1}}],["path로의",{"2":{"114":1}}],["path에",{"2":{"106":1,"107":1}}],["path에서",{"2":{"106":1}}],["paths",{"0":{"114":1},"2":{"102":1,"107":1,"114":1}}],["path의",{"2":{"58":3}}],["path",{"0":{"116":1},"2":{"22":13,"41":2,"43":1,"58":1,"87":3,"102":1,"103":3,"105":1,"106":5,"107":7,"109":2,"110":2,"111":2,"112":2,"113":2,"114":6,"115":2,"116":7,"117":1,"118":2,"119":2,"120":2,"121":2,"122":2,"128":1}}],["patch을",{"2":{"7":1}}],["pacman이나",{"2":{"60":1}}],["pacman",{"2":{"18":2,"21":1,"22":7,"68":1,"69":4}}],["packages",{"2":{"41":3}}],["package",{"2":{"10":1,"11":1,"41":15,"87":1,"119":1}}],["perf",{"2":{"7":1}}],["public",{"2":{"129":1}}],["push",{"2":{"126":1}}],["push하기",{"2":{"2":1}}],["pull",{"2":{"7":1,"126":1}}],["please를",{"2":{"7":1}}],["plugins",{"2":{"15":1,"41":6,"116":1,"123":5}}],["plugin",{"0":{"48":1,"49":1,"120":1,"121":1,"122":1},"2":{"1":3,"10":1,"15":1,"26":1,"41":12,"44":2,"48":4,"49":4,"51":6,"59":2,"71":4,"72":4,"73":1,"74":3,"75":2,"76":4,"87":2,"100":1,"102":3,"103":4,"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":2,"117":1,"118":1,"119":1,"120":11,"121":12,"122":10,"125":13,"126":4,"127":2,"130":2}}],["기재하도록",{"2":{"123":1}}],["기타",{"2":{"112":1}}],["기침",{"2":{"96":1}}],["기준으로",{"2":{"31":1}}],["기존의",{"0":{"31":1},"2":{"31":1,"33":1,"37":1}}],["기반으로",{"2":{"10":1,"109":1}}],["기본적으로",{"2":{"66":1,"107":1}}],["기본값은",{"2":{"76":1,"87":1,"125":1}}],["기본값",{"2":{"58":2,"115":1,"116":1}}],["기본값들을",{"2":{"44":1}}],["기본값들은",{"2":{"29":1,"43":1}}],["기본",{"2":{"7":1,"10":1,"13":1,"22":2,"44":1,"50":1,"52":1,"59":6,"69":1,"74":1,"100":1,"116":2}}],["기능은",{"2":{"124":2}}],["기능",{"2":{"105":1}}],["기능들과",{"2":{"2":1}}],["기능을",{"2":{"1":1,"37":1,"39":1,"48":1,"123":2}}],["기여자들의",{"2":{"98":1}}],["기여자들을",{"2":{"95":1}}],["기여자",{"0":{"98":1}}],["기여",{"2":{"0":1,"9":1,"12":1,"16":1}}],["있게",{"2":{"123":1}}],["있게합니다",{"2":{"28":1}}],["있지",{"2":{"92":1,"94":1}}],["있지만",{"2":{"22":1,"106":1}}],["있음",{"2":{"87":1,"120":1}}],["있다면",{"2":{"76":1}}],["있다고",{"2":{"40":1,"106":1,"123":1}}],["있을",{"2":{"69":3}}],["있으므로",{"2":{"69":2}}],["있으면",{"2":{"60":1}}],["있으며",{"2":{"33":1,"78":1}}],["있고",{"2":{"32":1,"51":1}}],["있어",{"2":{"25":1}}],["있는지",{"2":{"107":1,"119":1,"128":1}}],["있는데",{"2":{"69":1}}],["있는",{"2":{"1":1,"15":1,"33":1,"37":1,"45":1,"67":1,"69":13,"87":1,"93":1,"99":1,"102":1,"103":2,"105":2,"107":1,"110":1,"114":1,"123":2,"124":1,"127":1,"128":1}}],["있습니다shell",{"2":{"125":1}}],["있습니다",{"2":{"1":2,"4":1,"6":2,"8":1,"10":1,"12":2,"13":2,"18":2,"22":1,"25":1,"27":1,"29":1,"30":1,"32":3,"36":1,"37":1,"43":3,"45":1,"49":1,"51":1,"55":1,"56":1,"62":1,"66":2,"67":2,"68":1,"76":2,"83":1,"84":1,"87":1,"91":1,"93":1,"100":1,"105":1,"109":1,"112":1,"119":1,"123":2,"124":2,"125":1,"127":1,"128":1,"130":1}}],["수도",{"2":{"119":1}}],["수를",{"2":{"50":1}}],["수입니다",{"2":{"50":1,"57":1}}],["수행합니다",{"2":{"28":1,"83":1}}],["수동적으로",{"2":{"4":1}}],["수정들의",{"2":{"2":1}}],["수",{"2":{"1":2,"4":1,"6":2,"8":1,"12":1,"13":1,"18":2,"27":1,"28":1,"32":3,"33":1,"37":2,"40":1,"43":3,"45":1,"49":1,"50":1,"51":1,"55":1,"56":1,"66":2,"67":1,"69":1,"76":1,"78":1,"83":1,"84":1,"87":2,"91":1,"93":1,"103":3,"107":1,"109":1,"112":1,"120":1,"123":4,"124":2,"125":1,"128":1,"130":1}}],["손상시킬",{"2":{"1":1}}],["tail합니다",{"2":{"109":1}}],["tac을",{"2":{"105":1}}],["tap",{"2":{"6":1}}],["txt1",{"2":{"105":1}}],["txtlegacy",{"2":{"44":1}}],["txtmanage",{"2":{"41":1}}],["this",{"2":{"43":2}}],["that",{"2":{"41":2}}],["then",{"2":{"128":1}}],["they",{"2":{"41":1}}],["themeconfig",{"2":{"14":3}}],["the",{"2":{"6":1,"7":1,"41":28,"87":1}}],["travis",{"2":{"127":1}}],["travisci",{"0":{"127":1}}],["trash",{"2":{"49":1}}],["truffleruby+graalvm",{"2":{"109":1}}],["truffleruby",{"2":{"109":2}}],["tree를",{"2":{"39":1}}],["trim",{"2":{"22":2}}],["type=ref의",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["type=version의",{"2":{"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1}}],["type에",{"2":{"103":1}}],["type",{"2":{"7":1,"103":1,"106":1,"107":1,"109":1,"110":2,"111":2,"112":2,"113":2,"114":1,"115":1,"116":1,"118":1}}],["typescript",{"2":{"13":1}}],["types",{"2":{"7":1}}],["type>",{"2":{"7":1}}],["template",{"2":{"100":1}}],["textpre",{"2":{"51":1}}],["terminal",{"2":{"6":1}}],["tests",{"2":{"2":1,"6":3}}],["test",{"2":{"2":4,"4":1,"5":3,"6":3,"7":1,"83":1,"125":7,"126":6,"127":2}}],["test하세요",{"2":{"2":1}}],["token를",{"2":{"129":1}}],["token",{"0":{"129":1},"2":{"128":3}}],["toctou",{"2":{"107":1}}],["to",{"2":{"6":1,"22":2,"41":8,"58":1,"87":2,"107":1}}],["tool>",{"2":{"126":1,"127":2}}],["tools",{"2":{"114":2}}],["tool",{"0":{"43":1,"54":1},"2":{"1":1,"10":1,"17":1,"28":1,"29":2,"30":2,"33":1,"34":1,"41":4,"42":1,"43":9,"45":1,"54":3,"59":4,"69":14,"83":6,"85":3,"87":1,"100":2,"106":2,"107":3,"109":3,"114":2,"120":1,"121":1,"122":1,"125":4,"127":2}}],["t",{"2":{"6":2}}],["title",{"2":{"113":1}}],["time",{"2":{"107":1}}],["timgluz",{"2":{"1":1}}],["tip",{"2":{"2":1,"7":1,"43":1,"130":1}}],["awk",{"2":{"105":1}}],["another",{"2":{"43":1}}],["an",{"2":{"41":2}}],["and",{"2":{"22":1,"41":9}}],["at",{"2":{"41":1}}],["as",{"2":{"41":1,"123":5}}],["asdf와",{"2":{"89":1}}],["asdfrc의",{"2":{"76":1}}],["asdfrc을",{"2":{"59":1}}],["asdfrc가",{"2":{"53":1}}],["asdfrc는",{"2":{"44":1}}],["asdfrc",{"0":{"44":1},"1":{"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1},"2":{"44":1,"53":2,"59":7,"69":14}}],["asdfrc를",{"2":{"42":1}}],["asdfrc에서",{"2":{"118":1}}],["asdfrc에",{"2":{"31":1}}],["asdf로",{"2":{"40":1,"52":1}}],["asdf~",{"2":{"22":6,"69":6}}],["asdf의",{"2":{"10":1,"36":1,"42":1,"59":1,"88":1,"91":1,"120":1}}],["asdf는",{"2":{"4":1,"7":1,"12":1,"18":1,"22":1,"23":1,"27":1,"28":1,"31":1,"32":1,"33":2,"36":1,"37":1,"38":1,"39":1,"40":2,"68":1,"87":1,"93":1,"106":1,"114":1,"119":1,"123":1,"124":1,"130":1}}],["asdf에는",{"2":{"125":1}}],["asdf에서는",{"2":{"124":1}}],["asdf에서",{"2":{"41":1,"102":1,"109":1}}],["asdf에",{"2":{"2":1,"37":1,"43":1,"90":1,"93":1,"99":1,"119":1}}],["asdf가",{"2":{"1":1,"27":1,"28":1,"29":1,"34":1,"39":1,"43":1,"44":1,"56":1,"70":1,"89":1,"93":1,"114":1,"121":1,"122":1}}],["asdf를",{"0":{"40":1},"2":{"1":3,"22":2,"29":1,"32":1,"46":1,"59":1}}],["asdf",{"0":{"0":1,"19":1,"22":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"76":1,"88":1,"123":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"20":1,"21":1},"2":{"0":1,"1":9,"3":2,"8":3,"10":7,"11":1,"15":7,"16":1,"17":3,"20":3,"21":3,"22":109,"23":1,"24":1,"25":1,"26":2,"27":2,"28":1,"31":2,"32":3,"34":1,"37":1,"41":42,"43":4,"44":1,"46":1,"47":1,"48":4,"49":6,"50":1,"51":4,"52":2,"53":2,"54":1,"55":4,"56":4,"57":3,"58":6,"59":11,"60":3,"61":1,"65":1,"66":1,"67":3,"68":5,"69":118,"71":3,"72":5,"74":1,"75":1,"76":4,"78":1,"79":2,"80":2,"81":2,"82":2,"83":8,"84":2,"85":3,"86":1,"87":10,"88":1,"89":5,"93":1,"94":3,"95":1,"99":2,"100":4,"101":2,"103":11,"105":5,"106":14,"107":18,"109":16,"110":11,"111":9,"112":9,"113":9,"114":13,"115":9,"116":11,"117":3,"118":6,"119":1,"120":8,"121":9,"122":7,"123":11,"124":1,"125":9,"126":4,"127":6,"130":4}}],["authorization",{"2":{"128":1}}],["autoremove",{"2":{"69":1}}],["auto",{"2":{"44":1,"50":1,"59":1}}],["autoload",{"2":{"22":1,"69":1}}],["aur",{"2":{"21":2,"22":1,"52":1,"68":1}}],["api에",{"2":{"128":1}}],["api는",{"2":{"70":1}}],["api",{"0":{"128":1,"129":1},"1":{"129":1},"2":{"33":1,"128":2,"129":1}}],["append",{"2":{"22":4}}],["apt",{"2":{"18":1,"25":1}}],["aptitude",{"2":{"18":1}}],["are",{"2":{"41":1}}],["args",{"2":{"41":1,"51":1,"63":1,"115":1,"116":1}}],["arg",{"2":{"22":6,"69":6}}],["archlinux",{"2":{"21":1}}],["always",{"0":{"47":1},"2":{"44":1,"59":1}}],["almalinux",{"2":{"25":1}}],["alpine와",{"2":{"8":1}}],["all이나",{"2":{"128":1}}],["all의",{"2":{"109":1}}],["all",{"0":{"105":1},"2":{"2":1,"27":2,"41":9,"48":1,"49":1,"73":1,"74":1,"76":1,"81":4,"99":1,"102":1,"105":4,"109":2,"117":1}}],["a",{"2":{"7":1,"41":15,"43":2}}],["action을",{"2":{"126":1}}],["actions에서",{"2":{"92":1}}],["actions",{"0":{"16":1},"2":{"16":1,"126":2}}],["action",{"0":{"126":1},"2":{"7":1}}],["action에서",{"2":{"7":1}}],["amannn",{"2":{"7":1}}],["amp",{"0":{"7":1,"9":1,"12":1,"62":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1},"2":{"6":1,"9":1,"11":1,"18":1,"21":4,"22":24,"24":1,"28":1,"68":1,"69":14,"78":1,"92":1,"95":1,"105":1}}],["advanced",{"2":{"4":1}}],["add",{"0":{"120":1},"2":{"1":3,"10":1,"22":1,"26":1,"41":3,"48":2,"49":2,"51":2,"71":4,"76":1,"102":1,"120":6,"130":2}}],["설명서에",{"2":{"130":1}}],["설명서를",{"2":{"92":1}}],["설명이",{"2":{"110":1}}],["설명을",{"2":{"69":1,"102":1,"110":1}}],["설명되어",{"2":{"62":1,"69":2,"110":1}}],["설명하므로",{"2":{"60":1}}],["설명입니다",{"2":{"52":1}}],["설명",{"2":{"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"102":1,"103":1,"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":2,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["설치입니다",{"2":{"130":1}}],["설치가",{"2":{"107":1}}],["설치합니다",{"2":{"79":1,"106":1,"109":1}}],["설치한",{"2":{"68":1}}],["설치에",{"2":{"60":1}}],["설치됩니다",{"2":{"34":1,"43":1,"125":1}}],["설치되는",{"2":{"93":1}}],["설치되지",{"2":{"66":1}}],["설치되면",{"2":{"34":2}}],["설치되어",{"2":{"29":1,"51":1,"67":1,"119":1}}],["설치할",{"2":{"27":2,"66":1,"87":1}}],["설치해야합니다",{"2":{"25":1,"107":2}}],["설치를",{"2":{"23":1}}],["설치로",{"2":{"22":1}}],["설치방법을",{"2":{"22":2}}],["설치방법의",{"2":{"22":1}}],["설치될",{"2":{"18":1}}],["설치",{"0":{"18":1,"22":1,"23":1,"24":1,"26":1,"27":1,"62":1,"78":1,"79":1},"1":{"25":1,"26":1},"2":{"17":4,"22":1,"23":1,"24":1,"25":2,"47":2,"51":1,"52":1,"59":2,"66":2,"68":1,"87":1,"92":1,"93":1,"102":2,"103":1,"105":1,"106":1,"107":3,"109":2,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"118":1,"130":1}}],["설치는",{"2":{"17":1,"59":1}}],["설치하거나",{"2":{"112":1}}],["설치하는",{"2":{"56":1}}],["설치하려면",{"2":{"43":2}}],["설치하고",{"2":{"23":1}}],["설치하기",{"2":{"10":2}}],["설치하세요",{"2":{"1":2}}],["설치된",{"0":{"72":1,"80":1,"93":1,"94":1},"2":{"2":1,"36":1,"49":2,"87":3,"103":1,"110":1,"111":1,"112":1,"113":1,"117":1,"120":1,"121":1,"122":1,"125":1}}],["설정되지",{"2":{"119":1}}],["설정되게",{"2":{"88":1}}],["설정되어",{"2":{"76":1}}],["설정되어야",{"2":{"22":3}}],["설정의",{"0":{"59":1},"2":{"59":1}}],["설정합니다",{"2":{"46":1,"47":1,"48":1,"52":1,"83":1,"109":2}}],["설정될",{"2":{"43":1,"76":1}}],["설정된",{"2":{"34":1}}],["설정파일을",{"2":{"33":1}}],["설정파일들에",{"2":{"14":1}}],["설정해야합니다",{"2":{"29":1}}],["설정한",{"2":{"22":1}}],["설정하려는",{"2":{"83":1}}],["설정하면",{"2":{"57":1}}],["설정하고",{"2":{"30":1}}],["설정하지",{"2":{"28":1}}],["설정하는",{"2":{"22":2,"48":1}}],["설정하세요",{"2":{"22":1,"29":1,"54":1,"84":1}}],["설정됩니다",{"2":{"22":8,"52":1}}],["설정에",{"2":{"18":1,"22":1,"39":1,"40":1}}],["설정에서",{"2":{"3":1}}],["설정안에",{"2":{"14":1}}],["설정을",{"2":{"13":1,"22":2,"24":1,"44":1,"60":1,"69":1}}],["설정은",{"2":{"13":1,"22":2,"42":1,"52":1}}],["설정과",{"2":{"11":1,"34":1}}],["설정들은",{"2":{"14":1}}],["설정들의",{"2":{"13":1}}],["설정들",{"2":{"5":1}}],["설정할",{"2":{"4":1,"55":1,"56":1,"83":1,"84":1,"103":1,"107":1}}],["설정",{"0":{"1":1,"28":1,"42":1,"60":1,"62":1,"83":1,"127":1},"1":{"29":1,"30":1,"31":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1},"2":{"4":1,"13":2,"14":2,"17":2,"22":1,"31":2,"33":1,"43":1,"44":1,"53":2,"57":2,"59":6,"69":16,"76":3,"83":1,"84":1,"94":2,"102":1,"107":1,"112":1,"118":1}}],["직접",{"2":{"1":1,"22":1,"38":1,"43":1,"87":1,"130":1}}],["veggies",{"2":{"114":2}}],["version=1",{"2":{"83":1}}],["version과",{"2":{"83":1}}],["version이라는",{"2":{"83":1}}],["version`",{"2":{"41":1}}],["version>",{"2":{"41":13,"66":1,"78":1,"79":1,"80":1,"81":1,"82":1,"83":8,"86":1,"125":1}}],["version",{"0":{"45":1},"2":{"31":3,"36":1,"41":23,"43":3,"44":1,"45":2,"54":1,"59":1,"66":2,"87":2,"99":1,"102":1,"103":2,"105":1,"106":4,"107":4,"109":3,"110":4,"111":4,"112":4,"113":4,"114":4,"115":2,"116":2,"117":1,"118":4,"125":5,"126":1,"127":2}}],["versions는",{"2":{"67":1}}],["versions을",{"2":{"59":1}}],["versions가",{"2":{"54":1}}],["versions를",{"2":{"45":1}}],["versions은",{"2":{"29":1,"30":1}}],["versions",{"0":{"43":1,"54":1},"2":{"17":1,"28":1,"30":1,"33":1,"41":10,"42":1,"43":5,"54":2,"59":3,"67":3,"69":14,"83":2,"85":3}}],["versions에서",{"2":{"10":1,"29":1}}],["versions에",{"2":{"1":1,"34":1,"43":1,"83":2}}],["vlang",{"2":{"113":2}}],["v는",{"2":{"105":1}}],["v",{"2":{"101":1,"113":1}}],["vic",{"2":{"71":1,"97":1}}],["via",{"2":{"68":1}}],["vitepress는",{"2":{"14":1}}],["vitepress가",{"2":{"11":1}}],["vitepress",{"0":{"13":1},"2":{"11":1,"13":4,"14":3}}],["v1",{"2":{"43":1}}],["var",{"2":{"22":3,"69":3}}],["v0",{"2":{"20":1}}],["vuepress로부터",{"2":{"11":1}}],["vuepress를",{"2":{"11":1}}],["v2",{"2":{"11":1,"105":1,"126":1}}],["v8",{"2":{"10":1}}],["vscode",{"2":{"4":1}}],["vscode를",{"2":{"4":1}}],["vm",{"2":{"1":1,"3":1,"10":2,"20":1,"21":2,"22":9,"26":1,"41":2,"69":7,"72":1,"100":1,"110":1,"125":1,"126":2,"127":1,"130":1}}],["이상적입니다",{"2":{"110":1}}],["이상",{"2":{"105":1}}],["이상을",{"2":{"22":2,"69":1}}],["이룸",{"2":{"100":1}}],["이동했을",{"2":{"88":1}}],["이유로",{"2":{"88":1}}],["이때",{"2":{"66":1}}],["이러한",{"2":{"66":1,"93":1}}],["이외의",{"2":{"58":1}}],["이전",{"2":{"51":1,"103":1,"107":1,"121":1}}],["이전의",{"2":{"49":1,"106":1}}],["이름을",{"2":{"123":1}}],["이름으로",{"2":{"100":1}}],["이름이면",{"2":{"54":1}}],["이름과",{"2":{"54":1,"78":1,"87":1}}],["이름",{"2":{"51":1,"102":1}}],["이름의",{"2":{"14":1,"83":1}}],["이벤트가",{"2":{"49":1}}],["이벤트에서",{"2":{"48":1,"49":1}}],["이벤트",{"2":{"48":1,"76":1}}],["이벤트는",{"2":{"48":2,"49":1}}],["이후",{"2":{"48":2,"107":1}}],["이후에",{"2":{"22":2,"51":1}}],["이미",{"2":{"29":1,"49":1,"105":1,"107":1,"110":1}}],["이미지들을",{"2":{"8":2}}],["이미지",{"0":{"8":1}}],["이용가능하지",{"2":{"92":1}}],["이용가능하도록",{"2":{"87":1}}],["이용가능한",{"2":{"27":1,"41":1}}],["이용가능한지",{"2":{"27":1}}],["이용한",{"2":{"59":1}}],["이용",{"2":{"45":1}}],["이용해",{"2":{"29":1}}],["이용하세요",{"2":{"22":2}}],["이제",{"2":{"27":1,"32":1}}],["이를",{"2":{"22":1,"31":1,"87":1,"128":1}}],["이슈들",{"2":{"16":1}}],["이것을",{"2":{"11":1}}],["이것은",{"2":{"7":1,"40":1,"75":1,"125":1}}],["이는",{"2":{"11":2,"22":1,"31":1,"44":1,"60":1,"114":1,"116":1,"124":1}}],["이",{"2":{"1":1,"4":1,"7":2,"15":1,"22":1,"23":1,"30":1,"43":2,"45":1,"48":1,"57":1,"60":3,"69":1,"74":1,"87":2,"89":1,"99":1,"105":4,"106":5,"107":3,"109":4,"110":2,"111":2,"112":2,"113":2,"114":2,"115":1,"116":1,"117":2,"118":1,"119":4,"120":1,"121":1,"122":1,"123":3,"124":3,"129":1}}],["c",{"2":{"127":1}}],["cmd=",{"2":{"128":2}}],["cmd",{"2":{"103":1,"123":1}}],["credits",{"0":{"96":1}}],["cpuinfo",{"2":{"50":1}}],["cat하여",{"2":{"119":1}}],["catalina",{"2":{"22":2,"69":1}}],["call",{"2":{"116":1}}],["candidates",{"0":{"46":1},"2":{"44":1,"59":1}}],["cleaning",{"2":{"75":1}}],["cli",{"0":{"123":1},"2":{"33":1,"39":1,"66":1}}],["clone하고",{"2":{"100":1}}],["clone하세요",{"2":{"1":1}}],["clone한",{"2":{"2":1}}],["clone",{"2":{"1":4,"10":5,"20":1,"21":1,"49":1,"52":1,"127":1}}],["centos",{"2":{"25":1}}],["cd",{"2":{"21":1}}],["currently",{"2":{"41":1}}],["current",{"2":{"41":7,"85":4,"87":1}}],["current는",{"2":{"28":1}}],["curl",{"2":{"18":6,"25":2,"111":1,"128":1}}],["curl이",{"2":{"18":1}}],["custom",{"2":{"22":2}}],["customarguments",{"2":{"4":1}}],["ci를",{"2":{"127":1}}],["ci에서",{"2":{"125":1}}],["ci",{"2":{"7":1,"125":1,"129":1}}],["chrome의",{"2":{"10":1}}],["chore",{"2":{"7":1}}],["change",{"2":{"7":2}}],["check",{"0":{"48":1},"2":{"2":1,"44":1,"59":1,"76":1,"107":1}}],["cool",{"2":{"85":1}}],["container",{"2":{"89":1}}],["concurrency가",{"2":{"59":1}}],["concurrency=32",{"2":{"57":1}}],["concurrency",{"0":{"50":1,"57":1},"2":{"44":1,"50":1,"57":2,"59":2,"103":1,"107":1}}],["configuration",{"2":{"31":1}}],["config",{"0":{"53":1,"112":1},"2":{"4":1,"13":1,"14":2,"22":38,"44":1,"53":2,"55":1,"59":2,"69":13,"94":1,"102":1,"112":1}}],["code",{"2":{"11":1}}],["core에서",{"2":{"105":1,"106":1,"107":1,"109":1,"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"116":1,"117":1,"118":1,"119":1,"120":1,"121":1,"122":1}}],["core는",{"2":{"105":1}}],["core를",{"2":{"101":1}}],["coreutils",{"2":{"18":2}}],["core의",{"2":{"6":1}}],["core",{"2":{"1":1,"2":1,"5":1,"22":3}}],["compinit가",{"2":{"22":2}}],["compinit",{"2":{"22":5,"69":2}}],["completer~",{"2":{"22":3,"69":3}}],["completer",{"2":{"22":3,"69":3}}],["completion이",{"2":{"22":1}}],["completion",{"2":{"22":5,"69":5}}],["completions",{"2":{"22":8,"69":4}}],["comment",{"2":{"43":2}}],["commit",{"2":{"41":2}}],["community",{"2":{"15":1,"89":1}}],["command>",{"2":{"41":4,"63":1,"64":1,"67":1,"116":1,"127":1}}],["commands",{"2":{"2":1,"123":7}}],["command",{"2":{"2":1,"4":1,"41":3,"51":1,"115":3,"116":3,"123":10,"125":3,"126":1}}],["com",{"2":{"1":5,"10":3,"20":1,"26":1,"41":2,"71":1,"72":2,"113":1,"125":1,"127":1,"130":1}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/@localSearchIndexpt-br.DbNYDzTe.js b/assets/chunks/@localSearchIndexpt-br.DbNYDzTe.js new file mode 100644 index 00000000..56437734 --- /dev/null +++ b/assets/chunks/@localSearchIndexpt-br.DbNYDzTe.js @@ -0,0 +1 @@ +const e='{"documentCount":103,"nextId":103,"documentIds":{"0":"/pt-br/contribute/core.html#asdf","1":"/pt-br/contribute/core.html#configuracao-inicial","2":"/pt-br/contribute/core.html#desenvolvimento","3":"/pt-br/contribute/core.html#teste-de-bats","4":"/pt-br/contribute/core.html#pull-requests-releases-e-commits-convencionais","5":"/pt-br/contribute/core.html#imagens-docker","6":"/pt-br/contribute/documentation.html#docs-site","7":"/pt-br/contribute/documentation.html#configuracao-inicial","8":"/pt-br/contribute/documentation.html#desenvolvimento","9":"/pt-br/contribute/documentation.html#pull-requests-releases-e-commits-convencionais","10":"/pt-br/contribute/documentation.html#vuepress","11":"/pt-br/contribute/documentation.html#i18n","12":"/pt-br/contribute/first-party-plugins.html#first-party-plugins","13":"/pt-br/contribute/github-actions.html#github-actions","14":"/pt-br/guide/introduction.html#introducao","15":"/pt-br/guide/introduction.html#funcionamento","16":"/pt-br/guide/introduction.html#projetos-relacionados","17":"/pt-br/guide/introduction.html#nvm-n-rbenv-etc","18":"/pt-br/guide/introduction.html#direnv","19":"/pt-br/guide/introduction.html#homebrew","20":"/pt-br/guide/introduction.html#nixos","21":"/pt-br/guide/introduction.html#por-que-usar-o-asdf","22":"/pt-br/guide/getting-started.html#comecando","23":"/pt-br/guide/getting-started.html#_1-instalando-as-dependencias","24":"/pt-br/guide/getting-started.html#_2-download-asdf","25":"/pt-br/guide/getting-started.html#official-download","26":"/pt-br/guide/getting-started.html#community-supported-download-methods","27":"/pt-br/guide/getting-started.html#_3-adicionando-ao-seu-shell","28":"/pt-br/guide/getting-started.html#_4-instalando-um-plugin","29":"/pt-br/guide/getting-started.html#dependencias-dos-plugins","30":"/pt-br/guide/getting-started.html#instalando-o-plugin","31":"/pt-br/guide/getting-started.html#_5-instalando-uma-versao","32":"/pt-br/guide/getting-started.html#_6-definindo-uma-versao","33":"/pt-br/guide/getting-started.html#versoes-globais","34":"/pt-br/guide/getting-started.html#versoes-locais","35":"/pt-br/guide/getting-started.html#usando-arquivos-de-versao-existentes","36":"/pt-br/guide/getting-started.html#setup-finalizado","37":"/pt-br/manage/commands.html#all-commands","38":"/pt-br/manage/configuration.html#configuration","39":"/pt-br/manage/configuration.html#tool-versions","40":"/pt-br/manage/configuration.html#home-asdfrc","41":"/pt-br/manage/configuration.html#variaveis-de-ambiente","42":"/pt-br/manage/core.html#core","43":"/pt-br/manage/core.html#instalacao-e-configuracao","44":"/pt-br/manage/core.html#execute","45":"/pt-br/manage/core.html#variavel-de-ambiente","46":"/pt-br/manage/core.html#informacoes","47":"/pt-br/manage/core.html#reshim","48":"/pt-br/manage/core.html#versionamento-do-shim","49":"/pt-br/manage/core.html#atualizar","50":"/pt-br/manage/core.html#desinstalar","51":"/pt-br/manage/plugins.html#plugins","52":"/pt-br/manage/plugins.html#adicionar","53":"/pt-br/manage/plugins.html#listar-instalados","54":"/pt-br/manage/plugins.html#listar-todos-nomes-abreviados-no-repositorio","55":"/pt-br/manage/plugins.html#atualizar","56":"/pt-br/manage/plugins.html#remover","57":"/pt-br/manage/plugins.html#sincronizar-nome-abreviado-no-repositorio","58":"/pt-br/manage/versions.html#versoes","59":"/pt-br/manage/versions.html#instalar-versao","60":"/pt-br/manage/versions.html#instalar-ultima-versao-estavel","61":"/pt-br/manage/versions.html#listar-versoes-instaladas","62":"/pt-br/manage/versions.html#listar-todas-as-versoes-disponiveis","63":"/pt-br/manage/versions.html#mostrar-ultima-versao-estavel","64":"/pt-br/manage/versions.html#selecionar-versao-atual","65":"/pt-br/manage/versions.html#resposta-do-sistema-de-versao","66":"/pt-br/manage/versions.html#verificar-a-versao-atual","67":"/pt-br/manage/versions.html#desinstalar-versao","68":"/pt-br/manage/versions.html#shims","69":"/pt-br/manage/versions.html#ignorando-shims-do-asdf","70":"/pt-br/more/community-projects.html#community-projects","71":"/pt-br/more/faq.html#perguntas-frequentes","72":"/pt-br/more/faq.html#suporte-wsl1","73":"/pt-br/more/faq.html#suporte-wsl2","74":"/pt-br/more/faq.html#exectable-recem-instalado-nao-esta-funcionando","75":"/pt-br/more/faq.html#shell-nao-detecta-shims-recem-instalados","76":"/pt-br/more/thanks.html#creditos","77":"/pt-br/more/thanks.html#mantenedores","78":"/pt-br/more/thanks.html#contribuidores","79":"/pt-br/plugins/create.html#criar-um-plug-in","80":"/pt-br/plugins/create.html#o-que-ha-em-um-plug-in","81":"/pt-br/plugins/create.html#scripts-obrigatorios","82":"/pt-br/plugins/create.html#variaveis-de-ambiente","83":"/pt-br/plugins/create.html#bin-list-all","84":"/pt-br/plugins/create.html#bin-download","85":"/pt-br/plugins/create.html#bin-install","86":"/pt-br/plugins/create.html#scripts-opcional","87":"/pt-br/plugins/create.html#scripts-bin-help","88":"/pt-br/plugins/create.html#bin-list-bin-paths","89":"/pt-br/plugins/create.html#bin-exec-env","90":"/pt-br/plugins/create.html#bin-exec-path","91":"/pt-br/plugins/create.html#bin-uninstall","92":"/pt-br/plugins/create.html#bin-list-legacy-filenames","93":"/pt-br/plugins/create.html#bin-parse-legacy-file","94":"/pt-br/plugins/create.html#bin-post-plugin-add","95":"/pt-br/plugins/create.html#bin-pre-plugin-remove","96":"/pt-br/plugins/create.html#comandos-de-extensao-para-asdf-cli","97":"/pt-br/plugins/create.html#modelos-de-calcos-personalizados","98":"/pt-br/plugins/create.html#testando-plug-ins","99":"/pt-br/plugins/create.html#exemplo-github-action","100":"/pt-br/plugins/create.html#exemplo-de-configuracao-do-travisci","101":"/pt-br/plugins/create.html#limitacao-de-taxa-da-api-do-github","102":"/pt-br/plugins/create.html#enviando-plugins-para-o-repositorio-oficial-de-plugins"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,35],"1":[2,1,100],"2":[1,1,89],"3":[3,1,72],"4":[6,1,112],"5":[2,1,31],"6":[3,1,37],"7":[2,3,67],"8":[1,3,79],"9":[6,3,44],"10":[1,3,60],"11":[1,3,97],"12":[3,1,92],"13":[2,1,49],"14":[1,1,106],"15":[1,1,53],"16":[2,1,1],"17":[4,3,55],"18":[1,3,35],"19":[1,3,32],"20":[1,3,60],"21":[6,1,64],"22":[1,1,75],"23":[4,1,59],"24":[3,1,1],"25":[2,4,14],"26":[4,4,32],"27":[5,1,243],"28":[4,1,15],"29":[3,5,50],"30":[3,5,11],"31":[4,1,56],"32":[4,1,59],"33":[2,5,60],"34":[2,5,33],"35":[5,5,55],"36":[3,1,52],"37":[2,1,178],"38":[1,1,52],"39":[3,1,131],"40":[2,1,120],"41":[3,1,91],"42":[1,1,46],"43":[3,1,6],"44":[1,1,14],"45":[3,1,6],"46":[1,1,24],"47":[1,1,70],"48":[3,1,46],"49":[1,1,53],"50":[1,1,142],"51":[1,1,56],"52":[1,1,41],"53":[2,1,14],"54":[6,1,17],"55":[1,1,42],"56":[1,1,33],"57":[5,1,65],"58":[1,1,30],"59":[2,1,44],"60":[4,1,20],"61":[3,1,18],"62":[5,1,19],"63":[4,1,19],"64":[3,1,81],"65":[5,1,42],"66":[4,1,22],"67":[2,1,10],"68":[1,1,111],"69":[4,2,36],"70":[2,1,48],"71":[2,1,8],"72":[3,2,27],"73":[3,2,57],"74":[7,2,57],"75":[7,2,48],"76":[1,1,17],"77":[1,1,6],"78":[1,1,9],"79":[4,1,30],"80":[7,4,46],"81":[2,4,22],"82":[3,4,82],"83":[3,7,106],"84":[2,7,80],"85":[2,7,116],"86":[2,4,1],"87":[3,6,170],"88":[3,6,63],"89":[3,6,10],"90":[3,6,53],"91":[2,6,7],"92":[4,6,39],"93":[4,6,37],"94":[4,6,49],"95":[4,6,44],"96":[7,4,143],"97":[4,4,63],"98":[3,4,111],"99":[3,6,37],"100":[5,6,67],"101":[7,4,84],"102":[7,4,46]},"averageFieldLength":[2.902912621359222,2.4466019417475726,55.01941747572816],"storedFields":{"0":{"title":"asdf","titles":[]},"1":{"title":"Configuração inicial","titles":["asdf"]},"2":{"title":"Desenvolvimento","titles":["asdf"]},"3":{"title":"Teste de BATS","titles":["asdf"]},"4":{"title":"Pull Requests, Releases e Commits Convencionais","titles":["asdf"]},"5":{"title":"Imagens Docker","titles":["asdf"]},"6":{"title":"Docs & Site","titles":[]},"7":{"title":"Configuração inicial","titles":["Docs & Site"]},"8":{"title":"Desenvolvimento","titles":["Docs & Site"]},"9":{"title":"Pull Requests, Releases e Commits Convencionais","titles":["Docs & Site"]},"10":{"title":"Vuepress","titles":["Docs & Site"]},"11":{"title":"I18n","titles":["Docs & Site"]},"12":{"title":"First-Party Plugins","titles":[]},"13":{"title":"GitHub Actions","titles":[]},"14":{"title":"Introdução","titles":[]},"15":{"title":"Funcionamento","titles":["Introdução"]},"16":{"title":"Projetos relacionados","titles":["Introdução"]},"17":{"title":"nvm / n / rbenv etc","titles":["Introdução","Projetos relacionados"]},"18":{"title":"direnv","titles":["Introdução","Projetos relacionados"]},"19":{"title":"Homebrew","titles":["Introdução","Projetos relacionados"]},"20":{"title":"NixOS","titles":["Introdução","Projetos relacionados"]},"21":{"title":"Por que usar o asdf?","titles":["Introdução"]},"22":{"title":"Começando","titles":[]},"23":{"title":"1. Instalando as dependências","titles":["Começando"]},"24":{"title":"2. Download asdf","titles":["Começando"]},"25":{"title":"Official Download","titles":["Começando","2. Download asdf"]},"26":{"title":"Community Supported Download Methods","titles":["Começando","2. Download asdf"]},"27":{"title":"3. Adicionando ao seu shell","titles":["Começando"]},"28":{"title":"4. Instalando um plugin","titles":["Começando"]},"29":{"title":"Dependências dos plugins","titles":["Começando","4. Instalando um plugin"]},"30":{"title":"Instalando o plugin","titles":["Começando","4. Instalando um plugin"]},"31":{"title":"5. Instalando uma versão","titles":["Começando"]},"32":{"title":"6. Definindo uma versão","titles":["Começando"]},"33":{"title":"Versões globais","titles":["Começando","6. Definindo uma versão"]},"34":{"title":"Versões locais","titles":["Começando","6. Definindo uma versão"]},"35":{"title":"Usando arquivos de versão existentes","titles":["Começando","6. Definindo uma versão"]},"36":{"title":"Setup finalizado!","titles":["Começando"]},"37":{"title":"All Commands","titles":[]},"38":{"title":"Configuration","titles":[]},"39":{"title":".tool-versions","titles":["Configuration"]},"40":{"title":"$HOME/.asdfrc","titles":["Configuration"]},"41":{"title":"Variáveis de ambiente","titles":["Configuration"]},"42":{"title":"Core","titles":[]},"43":{"title":"Instalação e configuração","titles":["Core"]},"44":{"title":"Execute","titles":["Core"]},"45":{"title":"Variável de Ambiente","titles":["Core"]},"46":{"title":"Informações","titles":["Core"]},"47":{"title":"Reshim","titles":["Core"]},"48":{"title":"Versionamento do Shim","titles":["Core"]},"49":{"title":"Atualizar","titles":["Core"]},"50":{"title":"Desinstalar","titles":["Core"]},"51":{"title":"Plugins","titles":[]},"52":{"title":"Adicionar","titles":["Plugins"]},"53":{"title":"Listar Instalados","titles":["Plugins"]},"54":{"title":"Listar todos nomes abreviados no repositório","titles":["Plugins"]},"55":{"title":"Atualizar","titles":["Plugins"]},"56":{"title":"Remover","titles":["Plugins"]},"57":{"title":"Sincronizar nome abreviado no repositório","titles":["Plugins"]},"58":{"title":"Versões","titles":[]},"59":{"title":"Instalar Versão","titles":["Versões"]},"60":{"title":"Instalar última versão estável","titles":["Versões"]},"61":{"title":"Listar versões instaladas","titles":["Versões"]},"62":{"title":"Listar todas as versões disponíveis","titles":["Versões"]},"63":{"title":"Mostrar última versão estável","titles":["Versões"]},"64":{"title":"Selecionar versão atual","titles":["Versões"]},"65":{"title":"Resposta do sistema de versão","titles":["Versões"]},"66":{"title":"Verificar a versão atual","titles":["Versões"]},"67":{"title":"Desinstalar versão","titles":["Versões"]},"68":{"title":"Shims","titles":["Versões"]},"69":{"title":"Ignorando shims do asdf","titles":["Versões","Shims"]},"70":{"title":"Community Projects","titles":[]},"71":{"title":"Perguntas frequentes","titles":[]},"72":{"title":"Suporte WSL1?","titles":["Perguntas frequentes"]},"73":{"title":"Suporte WSL2?","titles":["Perguntas frequentes"]},"74":{"title":"Exectable recém-instalado não está funcionando?","titles":["Perguntas frequentes"]},"75":{"title":"Shell não detecta shims recém-instalados?","titles":["Perguntas frequentes"]},"76":{"title":"Créditos","titles":[]},"77":{"title":"Mantenedores","titles":["Créditos"]},"78":{"title":"Contribuidores","titles":["Créditos"]},"79":{"title":"Criar um plug-in","titles":[]},"80":{"title":"O que há em um plug-in","titles":["Criar um plug-in"]},"81":{"title":"Scripts obrigatórios","titles":["Criar um plug-in"]},"82":{"title":"Variavéis de Ambiente","titles":["Criar um plug-in"]},"83":{"title":"bin/list-all","titles":["Criar um plug-in","Variavéis de Ambiente"]},"84":{"title":"bin/download","titles":["Criar um plug-in","Variavéis de Ambiente"]},"85":{"title":"bin/install","titles":["Criar um plug-in","Variavéis de Ambiente"]},"86":{"title":"Scripts Opcional","titles":["Criar um plug-in"]},"87":{"title":"scripts bin/help","titles":["Criar um plug-in","Scripts Opcional"]},"88":{"title":"bin/list-bin-paths","titles":["Criar um plug-in","Scripts Opcional"]},"89":{"title":"bin/exec-env","titles":["Criar um plug-in","Scripts Opcional"]},"90":{"title":"bin/exec-path","titles":["Criar um plug-in","Scripts Opcional"]},"91":{"title":"bin/uninstall","titles":["Criar um plug-in","Scripts Opcional"]},"92":{"title":"bin/list-legacy-filenames","titles":["Criar um plug-in","Scripts Opcional"]},"93":{"title":"bin/parse-legacy-file","titles":["Criar um plug-in","Scripts Opcional"]},"94":{"title":"bin/post-plugin-add","titles":["Criar um plug-in","Scripts Opcional"]},"95":{"title":"bin/pre-plugin-remove","titles":["Criar um plug-in","Scripts Opcional"]},"96":{"title":"Comandos de extensão para asdf CLI.","titles":["Criar um plug-in"]},"97":{"title":"Modelos de calços personalizados","titles":["Criar um plug-in"]},"98":{"title":"Testando plug-ins","titles":["Criar um plug-in"]},"99":{"title":"Exemplo GitHub Action","titles":["Criar um plug-in","Testando plug-ins"]},"100":{"title":"Exemplo de configuração do TravisCI","titles":["Criar um plug-in","Testando plug-ins"]},"101":{"title":"Limitação de taxa da API do GitHub","titles":["Criar um plug-in"]},"102":{"title":"Enviando plugins para o repositório oficial de plugins","titles":["Criar um plug-in"]}},"dirtCount":0,"index":[["à",{"2":{"101":2}}],["às",{"2":{"3":1,"96":1}}],["🙏",{"2":{"78":1}}],["​​por",{"2":{"74":1}}],["kim",{"2":{"66":3}}],["keep",{"2":{"40":1}}],["916",{"2":{"55":1}}],["8",{"2":{"48":2,"85":1}}],["8837",{"2":{"27":2}}],["7",{"2":{"39":4,"85":1}}],["`$asdf",{"2":{"96":5}}],["`env`",{"2":{"37":1}}],["`asdf",{"2":{"37":1}}],["🎉",{"2":{"36":1,"50":1}}],["yml",{"2":{"100":1}}],["yamllanguage",{"2":{"100":1}}],["yamlsteps",{"2":{"99":1}}],["yarn",{"2":{"47":2,"74":3}}],["yes",{"2":{"35":1,"40":4}}],["your",{"2":{"1":1,"7":1,"23":2,"26":1}}],["you",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["6",{"0":{"32":1},"1":{"33":1,"34":1,"35":1},"2":{"66":1}}],["60",{"2":{"20":1,"40":1,"57":1}}],["4",{"0":{"28":1},"1":{"29":1,"30":1},"2":{"64":3,"83":1}}],["+",{"2":{"27":2}}],["|",{"2":{"27":11}}],["=s",{"2":{"50":2}}],["=",{"2":{"27":9,"35":1,"40":1,"50":6}}],["zero",{"2":{"84":1,"85":1}}],["zdotdir",{"2":{"27":1}}],["zshrc",{"2":{"27":5,"50":4,"75":1}}],["zsh",{"2":{"27":24,"50":6,"75":1}}],["zypper",{"2":{"23":2}}],["0",{"2":{"25":1,"33":1,"34":1,"39":3,"40":1,"48":4,"64":2,"83":3,"84":1,"85":3,"90":1}}],["000",{"2":{"20":1}}],["~",{"2":{"25":1,"27":49,"39":1,"41":3,"50":23,"68":1,"90":2,"92":1}}],["2014",{"2":{"76":1}}],["2",{"0":{"24":1},"1":{"25":1,"26":1},"2":{"39":6,"64":1,"73":1,"83":1}}],["11",{"2":{"66":1}}],["17",{"2":{"48":2,"59":1,"60":1,"61":1,"62":1,"63":1,"66":2,"67":1}}],["10",{"2":{"39":2}}],["16",{"2":{"33":1,"34":1,"48":2}}],["14",{"2":{"31":1,"48":4}}],["15",{"2":{"25":1,"39":4}}],["1",{"0":{"23":1},"2":{"40":1,"64":2,"72":1,"83":4,"90":1}}],["$releases",{"2":{"101":1}}],["$cmd",{"2":{"101":2}}],["$github",{"2":{"101":2}}],["$travis",{"2":{"100":1}}],["$e",{"2":{"50":4}}],["$env",{"2":{"27":2}}],["$pwd",{"2":{"34":2,"64":1}}],["$path",{"2":{"14":1,"27":1,"68":1,"75":1}}],["$nu",{"2":{"27":3}}],["$fpath",{"2":{"27":1,"50":1}}],["$",{"2":{"27":16,"37":1,"50":18,"64":2,"68":6,"94":4,"95":3,"96":4,"99":1}}],["$home",{"0":{"40":1},"2":{"27":8,"32":1,"33":2,"35":1,"39":1,"50":48,"64":1}}],["$asdf",{"2":{"2":1,"50":2,"68":1,"85":1,"96":2}}],["└─",{"2":{"11":4}}],["│",{"2":{"11":1}}],["├─",{"2":{"11":5}}],["5",{"0":{"31":1},"2":{"8":1,"33":1,"34":1,"39":1,"48":2,"66":1}}],["já",{"2":{"83":2,"85":1,"87":1}}],["j",{"2":{"82":1}}],["jthegedus",{"2":{"77":1}}],["java",{"2":{"53":3}}],["javascript",{"2":{"7":2,"8":1,"10":1}}],["janela",{"2":{"27":1}}],["join",{"2":{"27":4,"50":2}}],["json",{"2":{"7":1,"8":2}}],["js",{"2":{"7":2,"8":1,"10":5,"11":2,"12":1,"28":1,"31":1,"48":1,"51":1}}],["ões",{"2":{"7":1}}],["rvmrc",{"2":{"92":1}}],["rm",{"2":{"50":4}}],["rs",{"2":{"50":4}}],["rf",{"2":{"50":26}}],["rc",{"2":{"27":9,"50":3}}],["rbenv",{"0":{"17":1},"2":{"17":1,"35":1,"40":1}}],["roda",{"2":{"15":1}}],["root",{"2":{"11":1}}],["raiz",{"2":{"10":2,"11":1}}],["ramificação",{"2":{"4":1}}],["ruby",{"2":{"12":1,"35":1,"39":1,"40":2,"51":1,"92":1}}],["running",{"2":{"96":5}}],["runner",{"2":{"73":1}}],["runs",{"2":{"37":1}}],["run",{"2":{"8":2,"23":1}}],["ruptura",{"2":{"4":1}}],["registre",{"2":{"92":1}}],["registered",{"2":{"37":1}}],["retorne",{"2":{"90":1}}],["retorna",{"2":{"68":2,"98":1}}],["retornar",{"2":{"48":1}}],["retorno",{"2":{"68":1,"85":1,"87":5}}],["returned",{"2":{"37":1}}],["real",{"2":{"39":1}}],["readme",{"2":{"11":4,"69":1,"96":1}}],["remoção",{"2":{"50":2,"95":1}}],["removido",{"2":{"84":1,"95":1}}],["remova",{"2":{"50":27}}],["removendo",{"2":{"56":1}}],["remover",{"0":{"56":1},"2":{"50":14,"56":2}}],["remove",{"0":{"95":1},"2":{"37":3,"56":2,"95":4}}],["remoto",{"2":{"2":1}}],["rest",{"2":{"98":1}}],["resfriado",{"2":{"76":1}}],["resolve",{"2":{"96":1}}],["resolvendo",{"2":{"75":1}}],["resources",{"2":{"37":1}}],["ressaltar",{"2":{"73":1}}],["responsible",{"2":{"70":1}}],["resposta",{"0":{"65":1}}],["respositório",{"2":{"55":1}}],["reshim",{"0":{"47":1},"2":{"37":1,"47":2,"74":2,"75":1}}],["resultará",{"2":{"32":1}}],["resulta",{"2":{"31":1}}],["reservada",{"2":{"19":1}}],["reinicie",{"2":{"27":1}}],["required",{"2":{"23":1}}],["requires",{"2":{"23":1}}],["requests",{"0":{"4":1,"9":1}}],["request",{"2":{"2":1,"4":1,"98":1}}],["relativas",{"2":{"96":1}}],["relativo",{"2":{"90":1,"100":1}}],["relativos",{"2":{"88":1}}],["relate",{"2":{"70":1}}],["related",{"2":{"70":1}}],["relatório",{"2":{"46":1}}],["relaciona",{"2":{"20":1}}],["relacionados",{"0":{"16":1},"1":{"17":1,"18":1,"19":1,"20":1},"2":{"94":1,"95":1,"96":1}}],["relevantes",{"2":{"12":1,"87":1}}],["release",{"2":{"4":1,"37":1,"40":1,"49":1}}],["releases",{"0":{"4":1,"9":1}}],["ref>",{"2":{"37":1,"98":1}}],["ref",{"2":{"37":2,"39":2,"59":1,"82":2,"98":1}}],["refs",{"2":{"37":1}}],["refencia",{"2":{"35":1}}],["referências",{"2":{"11":1}}],["referência",{"2":{"10":1,"33":1,"59":1}}],["refactor",{"2":{"4":1}}],["replicáveis",{"2":{"20":1}}],["repository",{"2":{"37":1,"40":1,"57":1}}],["repositório",{"0":{"54":1,"57":1,"102":1},"2":{"1":1,"2":1,"12":1,"13":1,"14":1,"29":1,"34":1,"40":3,"52":2,"57":1,"80":1,"82":1,"98":1,"99":1,"100":1,"102":3}}],["repo",{"2":{"12":1,"37":3,"101":1}}],["representam",{"2":{"10":1}}],["representar",{"2":{"10":1}}],["revert",{"2":{"4":1}}],["revisão",{"2":{"2":1}}],["receberá",{"2":{"93":1}}],["recente",{"2":{"27":2,"40":2,"50":1,"83":1,"85":1}}],["recently",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["recém",{"0":{"74":1,"75":1}}],["reconstruir",{"2":{"49":1}}],["recomendável",{"2":{"83":1,"98":1}}],["recomendado",{"2":{"3":1,"49":1}}],["recommendation",{"2":{"52":1}}],["recommend",{"2":{"26":1}}],["recálculo",{"2":{"47":1}}],["recria",{"2":{"47":1}}],["recreate",{"2":{"37":1}}],["recurso",{"2":{"40":1,"96":2,"97":1}}],["recursos",{"2":{"2":1,"8":1}}],["últimos",{"2":{"57":1}}],["último",{"2":{"55":1,"83":1}}],["última",{"0":{"60":1,"63":1},"2":{"4":1,"31":1,"40":2,"60":1,"63":1}}],["única",{"2":{"14":1}}],["único",{"2":{"14":1,"21":1}}],["útil",{"2":{"1":1,"69":1,"82":1,"83":1,"98":1}}],["x",{"2":{"57":2}}],["x26",{"2":{"3":1,"27":2}}],["x3c",{"2":{"1":1,"4":3,"7":1,"37":38,"44":1,"45":1,"47":2,"48":1,"52":3,"55":1,"56":1,"59":2,"60":3,"61":3,"62":3,"63":3,"64":13,"65":1,"66":1,"67":2,"90":3,"98":4}}],[">>",{"2":{"27":15}}],[">",{"2":{"3":1,"4":1}}],["39cb398vb39",{"2":{"39":1}}],["3",{"0":{"27":1},"2":{"3":2,"8":1,"39":3,"48":2,"59":1,"66":2,"67":1,"83":1}}],["é",{"2":{"2":1,"3":1,"4":2,"8":2,"11":1,"12":1,"14":1,"15":2,"17":2,"19":2,"20":2,"21":2,"27":3,"33":1,"35":1,"37":1,"39":1,"40":4,"41":4,"42":1,"50":1,"52":1,"57":2,"59":1,"64":1,"68":3,"72":1,"73":2,"75":1,"80":1,"82":1,"83":5,"87":2,"96":2,"97":1,"98":4}}],["upgrade",{"2":{"49":2}}],["update",{"2":{"4":1,"37":8,"40":1,"49":2,"55":3}}],["utilitários",{"2":{"96":1}}],["utilizá",{"2":{"27":1}}],["utilizadas",{"2":{"32":1,"56":1}}],["utilização",{"2":{"27":1}}],["utilizando",{"2":{"27":3,"31":1}}],["utilizar",{"2":{"18":1}}],["utilize",{"2":{"27":2}}],["utilizem",{"2":{"21":1}}],["util",{"2":{"37":2,"45":1}}],["utils",{"2":{"37":1,"96":1}}],["unix",{"2":{"73":1}}],["unidade",{"2":{"73":2}}],["uninstall",{"0":{"91":1},"2":{"37":1,"50":5,"67":2,"80":1}}],["unitários",{"2":{"1":1}}],["uz",{"2":{"27":1,"50":1}}],["urls",{"2":{"37":3,"53":1}}],["url>",{"2":{"37":1,"52":1,"98":1}}],["url",{"2":{"11":1,"37":1,"52":2,"94":2,"102":1}}],["ubuntu",{"2":{"5":1,"87":1}}],["uma",{"0":{"31":1,"32":1},"1":{"33":1,"34":1,"35":1},"2":{"4":2,"11":1,"14":2,"15":1,"20":2,"21":1,"22":3,"27":3,"31":2,"32":4,"33":1,"39":4,"47":1,"56":1,"57":1,"59":1,"64":1,"73":2,"74":1,"82":1,"83":4,"85":1,"87":4,"88":3,"90":1,"91":2,"92":2,"99":1,"101":1}}],["um",{"0":{"28":1,"79":1,"80":1},"1":{"29":1,"30":1,"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1},"2":{"1":1,"2":1,"3":1,"5":1,"8":1,"9":2,"14":5,"15":2,"17":1,"19":1,"20":1,"21":2,"22":1,"27":6,"33":1,"34":2,"39":4,"40":1,"46":2,"47":1,"48":1,"49":3,"55":1,"56":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":2,"65":1,"68":2,"74":1,"80":2,"83":1,"84":1,"85":1,"87":7,"96":5,"97":5,"98":2,"100":2,"101":2,"102":1}}],["usá",{"2":{"98":1}}],["uso",{"2":{"39":1,"87":1}}],["using",{"2":{"26":1}}],["usuário",{"2":{"19":1,"38":1,"83":1}}],["usuários",{"2":{"8":1,"87":1,"92":1,"96":1,"102":1}}],["us",{"2":{"11":1}}],["usa",{"2":{"68":1,"74":1}}],["usado",{"2":{"56":1,"68":1,"93":1,"94":2,"95":1,"97":2}}],["usados",{"2":{"10":1,"40":1,"82":1}}],["usada",{"2":{"51":1}}],["usadas",{"2":{"39":1}}],["usamos",{"2":{"8":1}}],["usando",{"0":{"35":1},"2":{"4":1,"9":1,"14":1,"27":3,"49":1,"50":8,"73":1,"96":2,"102":1}}],["usará",{"2":{"40":1}}],["usar",{"0":{"21":1},"2":{"1":1,"3":1,"5":1,"39":2,"49":1,"59":1,"65":1,"96":1,"97":2,"100":1}}],["uses",{"2":{"99":1}}],["user",{"2":{"102":1}}],["users",{"2":{"66":3}}],["user>",{"2":{"1":1,"7":1}}],["used",{"2":{"12":1,"37":3}}],["use",{"2":{"2":1,"4":1,"26":1,"27":3,"39":2,"40":1,"41":1,"50":1,"55":1,"97":1}}],["quanto",{"2":{"35":1,"38":1}}],["quando",{"2":{"8":1,"15":2,"34":1,"40":1,"48":1,"68":1,"73":2,"80":1,"84":1,"85":2,"87":4,"96":1}}],["quaisquer",{"2":{"47":1,"87":1}}],["quais",{"2":{"31":1,"32":1,"51":1}}],["quality",{"2":{"70":1}}],["qualquer",{"2":{"21":1,"41":3,"68":1,"80":1,"84":1,"85":2,"87":2,"94":1,"95":1}}],["qual",{"2":{"14":1,"15":1,"59":1,"100":1}}],["quiser",{"2":{"2":1,"55":1,"64":1,"85":1,"87":1}}],["que",{"0":{"21":1,"80":1},"2":{"1":1,"3":1,"4":1,"8":1,"9":1,"10":1,"14":1,"15":2,"17":2,"20":2,"21":4,"22":1,"27":11,"32":3,"33":1,"39":5,"40":4,"41":3,"48":1,"49":1,"50":3,"60":1,"61":1,"62":1,"63":1,"68":3,"69":1,"73":1,"74":2,"82":1,"83":4,"84":1,"85":3,"87":8,"88":1,"90":1,"92":1,"94":2,"95":2,"96":6,"97":1,"98":4}}],["quebrariam",{"2":{"1":1}}],["quebrar",{"2":{"1":1}}],["quot",{"2":{"0":2,"6":2,"12":2,"13":2,"14":2,"22":2,"37":2,"38":2,"42":2,"51":2,"58":2,"79":2}}],["módulo",{"2":{"50":6}}],["método",{"2":{"49":3,"52":1,"57":1}}],["métodos",{"2":{"27":1}}],["modelo",{"2":{"97":1}}],["modelos",{"0":{"97":1},"2":{"97":1}}],["modificadas",{"2":{"39":1}}],["motivo",{"2":{"69":1}}],["mostrar",{"0":{"63":1},"2":{"63":1}}],["mostrará",{"2":{"32":1}}],["momento",{"2":{"32":1}}],["my",{"2":{"27":5,"99":1,"102":3}}],["muitos",{"2":{"42":1}}],["muitas",{"2":{"20":1,"48":1,"83":2}}],["mudado",{"2":{"57":1}}],["mudanças",{"2":{"27":1}}],["mudança",{"2":{"4":1}}],["mudou",{"2":{"27":2}}],["md",{"2":{"11":6,"74":1}}],["mínima",{"2":{"8":1}}],["mapeia",{"2":{"100":1}}],["make",{"2":{"82":1}}],["makepkg",{"2":{"26":1}}],["may",{"2":{"23":1}}],["master",{"2":{"37":1,"49":1}}],["mas",{"2":{"21":1,"27":1,"42":1,"57":1,"74":1,"87":2}}],["macos",{"2":{"19":1,"23":2,"27":4,"29":1,"50":3}}],["man",{"2":{"96":3}}],["mantenedores",{"0":{"77":1}}],["mantenha",{"2":{"40":1}}],["manipulado",{"2":{"68":1}}],["manipulação",{"2":{"14":1}}],["managed",{"2":{"70":1}}],["manage",{"2":{"37":1,"74":1}}],["manager",{"2":{"23":2}}],["manualmente",{"2":{"27":3,"49":1,"83":1}}],["manutenção",{"2":{"12":1}}],["maneira",{"2":{"14":1}}],["maintenance",{"2":{"12":1,"70":1}}],["mais",{"2":{"11":1,"18":1,"19":1,"20":2,"21":1,"27":3,"35":1,"40":2,"50":1,"51":1,"52":1,"57":1,"64":1,"69":1,"75":1,"83":2,"85":1,"87":1,"93":1,"102":1}}],["maiores",{"2":{"10":1}}],["markdown",{"2":{"8":1,"11":2}}],["major",{"2":{"4":1}}],["mit",{"2":{"76":1}}],["mix",{"2":{"64":1}}],["minutos",{"2":{"57":1}}],["min",{"2":{"40":1}}],["minor",{"2":{"4":1}}],["migração",{"2":{"35":1}}],["migrated",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["might",{"2":{"23":1}}],["meu",{"2":{"75":1}}],["method",{"2":{"26":2,"49":1}}],["methods",{"0":{"26":1}}],["meio",{"2":{"17":1,"47":1,"74":1}}],["mesma",{"2":{"14":1,"21":1}}],["mesmo",{"2":{"8":1,"11":2,"39":2,"59":1,"64":1,"85":1,"96":1}}],["mencioná",{"2":{"96":1}}],["mencionado",{"2":{"41":1,"85":1}}],["mencionados",{"2":{"11":1}}],["menos",{"2":{"41":1}}],["menu",{"2":{"11":1}}],["mensagem",{"2":{"4":2}}],["mensagens",{"2":{"4":1}}],["mecanismo",{"2":{"7":1}}],["melhoria",{"2":{"12":1}}],["melhor",{"2":{"2":1,"83":1}}],["máquina",{"2":{"1":1,"57":1}}],["ln",{"2":{"27":4}}],["lo",{"2":{"27":1,"33":1,"39":1,"96":1,"98":1,"101":1}}],["lookup",{"2":{"12":1}}],["longo",{"2":{"52":1}}],["long",{"2":{"12":1,"70":1}}],["locais",{"0":{"34":1},"2":{"11":1,"34":1}}],["localização",{"2":{"41":1}}],["localizados",{"2":{"11":1}}],["localidade",{"2":{"10":1,"11":2}}],["locales",{"2":{"11":2}}],["localmente",{"2":{"2":1}}],["local",{"2":{"1":1,"8":1,"22":1,"27":1,"34":1,"37":4,"39":1,"41":3,"57":1,"64":3,"65":4,"68":1}}],["last",{"2":{"40":1,"57":1}}],["lang",{"2":{"37":1,"64":1}}],["lançamentos",{"2":{"83":1}}],["lançamento",{"2":{"4":1,"9":1}}],["la",{"2":{"32":1}}],["latest",{"2":{"31":3,"33":1,"34":1,"37":15,"49":2,"60":4,"63":4,"64":3,"98":1}}],["later",{"2":{"23":1}}],["lateral",{"2":{"11":1}}],["leva",{"2":{"98":1}}],["legado",{"2":{"93":1}}],["legados",{"2":{"84":2}}],["legacy",{"0":{"92":1,"93":1},"2":{"35":1,"40":2,"92":1,"93":1}}],["leiam",{"2":{"40":1}}],["leia",{"2":{"10":1}}],["lendo",{"2":{"4":1}}],["lt",{"2":{"4":2,"9":1,"40":1,"47":2,"57":1,"65":1,"87":3,"88":3,"98":1}}],["luizm",{"2":{"1":2}}],["limitação",{"0":{"101":1},"2":{"101":1}}],["limite",{"2":{"61":1,"62":1}}],["lido",{"2":{"97":1}}],["lidar",{"2":{"51":1}}],["livre",{"2":{"87":2}}],["license",{"2":{"76":1}}],["libexec",{"2":{"27":6,"50":4}}],["lib",{"2":{"27":6,"50":3,"96":8}}],["liste",{"2":{"88":1}}],["listed",{"2":{"37":1,"70":1}}],["list",{"0":{"83":1,"88":1,"92":1},"2":{"2":1,"12":1,"23":1,"31":2,"37":9,"40":1,"53":4,"54":1,"57":1,"61":4,"62":4,"80":1,"81":1,"82":1,"83":1,"85":1,"101":2}}],["listado",{"2":{"102":1}}],["listados",{"2":{"87":1}}],["listada",{"2":{"83":1}}],["listadas",{"2":{"29":1}}],["listar",{"0":{"53":1,"54":1,"61":1,"62":1}}],["lista",{"2":{"1":1,"4":1,"31":1,"37":2,"42":1,"48":1,"54":1,"78":1,"81":1,"83":1,"87":2,"88":1,"92":1}}],["linguagens",{"2":{"39":1}}],["linguagem",{"2":{"20":1,"21":1,"80":1}}],["linhas",{"2":{"27":1,"50":14,"87":1}}],["linha",{"2":{"20":1,"27":13,"35":1,"39":1,"83":1,"87":2,"96":1}}],["linux",{"2":{"19":1,"23":4,"29":1,"72":1,"73":1,"98":1,"100":1}}],["lint",{"2":{"2":1}}],["links",{"2":{"87":2}}],["link",{"2":{"0":1,"6":1,"12":2,"13":1,"14":1,"22":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1,"87":3,"96":1}}],["like",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["funções",{"2":{"96":1}}],["função",{"2":{"83":1}}],["funcione",{"2":{"27":1,"85":1,"98":1}}],["funciona",{"2":{"84":1,"98":1}}],["funcionando",{"0":{"74":1}}],["funcionalidade",{"2":{"35":2}}],["funcionalidades",{"2":{"1":1}}],["funcionar",{"2":{"27":1,"72":1,"73":2}}],["funcionamento",{"0":{"15":1}}],["f",{"2":{"50":3}}],["frequentes",{"0":{"71":1},"1":{"72":1,"73":1,"74":1,"75":1}}],["from",{"2":{"37":1}}],["framework",{"2":{"27":9,"50":1,"75":1}}],["fpath=",{"2":{"27":1,"50":1}}],["fpath",{"2":{"27":3}}],["fluxos",{"2":{"42":1}}],["fluxo",{"2":{"14":1}}],["fi",{"2":{"101":1}}],["fiquem",{"2":{"83":1}}],["finalmente",{"2":{"68":1,"101":1}}],["final",{"2":{"68":1,"76":1}}],["finalizada",{"2":{"36":1}}],["finalizado",{"0":{"36":1}}],["fio",{"2":{"47":1}}],["filter",{"2":{"37":2}}],["filenames",{"0":{"92":1}}],["filename",{"2":{"41":1}}],["file",{"0":{"93":1},"2":{"35":1,"37":2,"40":2,"41":1,"92":1,"93":1,"96":1}}],["ficará",{"2":{"33":1,"34":1}}],["fish",{"2":{"27":19,"41":1,"50":16,"68":1,"75":2}}],["first",{"0":{"12":1}}],["fix",{"2":{"4":4}}],["fonte",{"2":{"40":2,"59":1,"81":1,"82":3,"84":3,"85":1}}],["foox",{"2":{"90":1}}],["foo",{"2":{"11":2,"59":2,"90":4,"96":11,"97":2}}],["foco",{"2":{"8":1}}],["foi",{"2":{"8":1,"17":1,"21":1,"27":1,"36":1,"47":1,"82":2,"94":2,"95":1}}],["forma",{"2":{"98":1}}],["formate",{"2":{"8":1}}],["formato",{"2":{"4":5,"9":1,"39":1,"64":1,"87":3}}],["format",{"2":{"2":1,"8":1}}],["formatado",{"2":{"40":1}}],["formatador",{"2":{"1":1}}],["formatar",{"2":{"2":1}}],["forem",{"2":{"87":1}}],["forneça",{"2":{"87":1}}],["fornecidos",{"2":{"68":1}}],["fornecido",{"2":{"68":1,"75":2}}],["fornece",{"2":{"96":1,"99":1}}],["fornecendo",{"2":{"96":1}}],["fornecem",{"2":{"48":1}}],["fornecer",{"2":{"5":1,"41":1,"96":2,"101":1}}],["force",{"2":{"50":5}}],["forçará",{"2":{"47":1}}],["foram",{"2":{"10":1,"15":1}}],["fora",{"2":{"8":1,"83":1}}],["fortemente",{"2":{"3":1}}],["for",{"2":{"2":1,"4":1,"12":1,"23":1,"32":1,"37":7,"40":1,"70":2,"72":1,"84":1,"85":2,"88":1,"93":1,"94":1,"97":1,"98":2,"100":1}}],["fork",{"2":{"1":2,"7":2}}],["febre",{"2":{"76":1}}],["feitas",{"2":{"56":1}}],["feito",{"2":{"21":1}}],["fetch",{"2":{"49":1}}],["feature",{"2":{"4":2}}],["feat",{"2":{"4":4}}],["ferramenta",{"2":{"1":1,"4":1,"7":1,"15":2,"17":1,"20":2,"21":3,"22":2,"31":1,"32":3,"35":1,"36":1,"39":5,"47":1,"56":1,"64":1,"65":2,"74":1,"80":2,"85":3,"87":4,"88":1,"90":1,"91":1,"98":2}}],["ferramentas",{"2":{"1":4,"5":1,"7":1,"14":3,"15":1,"17":3,"20":1,"21":1,"32":2,"33":1,"36":1,"39":1,"41":1,"47":1,"48":1,"51":2,"96":1}}],["facilmente",{"2":{"102":2}}],["facilitar",{"2":{"42":1,"102":1}}],["farão",{"2":{"39":1}}],["fará",{"2":{"27":1,"40":3,"84":1}}],["falhar",{"2":{"84":2,"85":1,"101":1}}],["falharão",{"2":{"32":1}}],["falta",{"2":{"32":1}}],["faltante",{"2":{"19":1}}],["familiar",{"2":{"27":1}}],["familiaridade",{"2":{"21":1}}],["faz",{"2":{"20":2,"39":1}}],["fazer",{"2":{"2":1,"46":1,"80":1,"101":1}}],["faça",{"2":{"9":1}}],["favor",{"2":{"2":1,"9":1,"97":1}}],["v",{"2":{"83":1}}],["válido",{"2":{"41":1}}],["várias",{"2":{"39":1}}],["v1",{"2":{"39":1,"99":1}}],["vêm",{"2":{"33":1}}],["valor",{"2":{"41":1,"87":1}}],["vamos",{"2":{"28":1,"31":1}}],["variavéis",{"0":{"82":1},"1":{"83":1,"84":1,"85":1}}],["variáveis",{"0":{"41":1},"2":{"14":1,"18":2,"38":1,"69":1,"82":2,"87":2}}],["variável",{"0":{"45":1},"2":{"2":1,"27":2,"64":2,"84":1,"85":1,"100":1,"101":1}}],["vars",{"2":{"80":1,"82":1}}],["varredura",{"2":{"32":1}}],["var",{"2":{"27":3,"50":3}}],["voltado",{"2":{"27":2}}],["você",{"2":{"1":2,"2":3,"3":1,"5":1,"14":1,"15":1,"21":1,"22":2,"27":8,"32":2,"33":1,"36":2,"41":4,"49":1,"55":1,"59":2,"64":2,"69":1,"74":1,"75":1,"80":1,"83":1,"85":1,"87":1,"98":2,"100":2,"102":1}}],["v0",{"2":{"25":1}}],["vídeo",{"2":{"22":1}}],["vinculada",{"2":{"73":1}}],["vinda",{"2":{"12":1}}],["vic",{"2":{"52":1,"77":1}}],["via",{"2":{"47":1,"49":1,"52":1,"57":1}}],["visa",{"2":{"20":1}}],["vida",{"2":{"12":1,"47":1}}],["vivendo",{"2":{"10":1}}],["v2",{"2":{"8":1}}],["vuepress",{"0":{"10":1},"2":{"8":1,"10":4,"11":3}}],["v8",{"2":{"7":1}}],["vm",{"2":{"1":1,"7":2,"25":1,"26":2,"27":9,"30":1,"37":2,"41":1,"50":7,"53":1,"87":1,"98":1,"99":2,"100":1,"102":1}}],["veggies",{"2":{"88":2}}],["vem",{"2":{"48":1}}],["vez",{"2":{"40":1,"85":1,"87":1,"97":1}}],["vezes",{"2":{"3":1,"40":1,"83":1}}],["verifique",{"2":{"69":1,"85":1,"98":1}}],["verificado",{"2":{"98":1}}],["verifica",{"2":{"85":1}}],["verificar",{"0":{"66":1},"2":{"100":1}}],["verificará",{"2":{"40":1}}],["verificação",{"2":{"32":1,"40":1}}],["verdadeiramente",{"2":{"20":1}}],["ver",{"2":{"13":1,"31":1,"36":1}}],["version=1",{"2":{"64":1}}],["versionamento",{"0":{"48":1},"2":{"80":1}}],["version`",{"2":{"37":1}}],["version>",{"2":{"37":13,"47":1,"59":1,"60":1,"61":1,"62":1,"63":1,"64":8,"67":1,"98":1}}],["version",{"2":{"35":3,"37":23,"40":3,"47":2,"64":2,"82":3,"87":1,"92":2,"98":4,"99":1,"100":2}}],["versions",{"0":{"39":1},"2":{"1":1,"7":1,"14":1,"15":1,"22":1,"32":1,"33":2,"34":2,"37":10,"38":1,"39":9,"41":3,"48":4,"50":14,"64":4,"66":3,"68":1}}],["versão",{"0":{"31":1,"32":1,"35":1,"59":1,"60":1,"63":1,"64":1,"65":1,"66":1,"67":1},"1":{"33":1,"34":1,"35":1},"2":{"4":2,"7":1,"14":3,"15":2,"17":1,"21":1,"22":3,"31":3,"32":2,"33":1,"35":2,"39":4,"40":3,"44":1,"47":1,"60":1,"63":1,"64":8,"65":3,"68":2,"81":2,"82":1,"83":2,"84":1,"85":5,"88":1,"90":1,"91":1,"93":1,"98":1}}],["versões",{"0":{"33":1,"34":1,"58":1,"61":1,"62":1},"1":{"59":1,"60":1,"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1},"2":{"1":1,"14":1,"17":1,"20":1,"21":1,"31":3,"32":1,"33":1,"34":1,"36":2,"39":3,"41":1,"48":2,"55":1,"56":1,"61":1,"62":1,"65":1,"81":1,"83":7}}],["veja",{"2":{"10":1,"12":1,"18":1,"19":1,"20":1,"27":2,"35":1,"51":1,"54":1,"64":1,"74":1,"78":1,"94":1,"95":1}}],["ve",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["bom",{"2":{"96":1}}],["bottom",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"37":1,"38":1,"42":1,"51":1,"58":1,"75":1,"79":1}}],["bibliotecas",{"2":{"96":1}}],["bit",{"2":{"96":1}}],["bits",{"2":{"96":1}}],["binário",{"2":{"40":2,"81":1,"82":2,"84":3}}],["binários",{"2":{"39":2,"89":1}}],["bin",{"0":{"83":1,"84":1,"85":1,"87":1,"88":2,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1},"2":{"2":1,"68":1,"81":3,"82":5,"84":1,"85":5,"87":5,"88":2,"90":4,"101":1}}],["by",{"2":{"12":1,"37":1,"66":3}}],["buscar",{"2":{"55":1}}],["bug",{"2":{"46":1}}],["bugs",{"2":{"2":1}}],["build",{"2":{"4":1,"100":1}}],["before",{"2":{"100":1}}],["begins",{"2":{"37":1}}],["being",{"2":{"37":2}}],["bem",{"2":{"12":1,"17":1,"40":1,"84":1,"85":2}}],["be",{"2":{"3":2,"23":1}}],["baz`",{"2":{"96":1}}],["baz",{"2":{"96":1}}],["bar`",{"2":{"96":1}}],["bar",{"2":{"96":1}}],["barra",{"2":{"11":2}}],["bat",{"2":{"96":6}}],["bats",{"0":{"3":1},"2":{"1":3,"2":3,"3":8}}],["baixar",{"2":{"84":1}}],["baixado",{"2":{"40":2,"82":2,"84":1,"85":1}}],["baixe",{"2":{"81":1,"85":1}}],["bastante",{"2":{"42":1}}],["basicamente",{"2":{"8":1}}],["baseado",{"2":{"43":1}}],["baseada",{"2":{"35":1}}],["base",{"2":{"5":1,"18":1}}],["bash`",{"2":{"96":3}}],["bashasdf",{"2":{"56":1}}],["bashrc",{"2":{"27":6,"50":3}}],["bash",{"2":{"1":3,"2":3,"27":19,"50":14,"75":1,"96":9,"97":1}}],["brew",{"2":{"23":1,"26":1,"27":12,"29":1,"49":2,"50":6}}],["breaking",{"2":{"4":1}}],["brazilian",{"2":{"11":1}}],["branch",{"2":{"1":1,"7":1,"25":1,"37":3,"39":1,"55":1,"59":1,"82":1,"98":2}}],["br",{"2":{"11":6}}],["bruta",{"2":{"1":1}}],["c",{"2":{"100":1}}],["certifique",{"2":{"96":1,"101":1}}],["cmd=",{"2":{"101":2}}],["cmd",{"2":{"96":1}}],["cd",{"2":{"26":1}}],["curto",{"2":{"87":1,"102":1}}],["curtos",{"2":{"54":1}}],["currently",{"2":{"37":1}}],["current",{"2":{"32":1,"37":7,"66":4,"68":1}}],["curl",{"2":{"23":7,"29":1,"101":1}}],["customizada",{"2":{"27":2}}],["cubra",{"2":{"2":1}}],["calço",{"2":{"97":1}}],["calços",{"0":{"97":1},"2":{"47":1,"97":1}}],["call",{"2":{"90":1}}],["callback",{"2":{"68":1}}],["candidates",{"2":{"40":1}}],["caso",{"2":{"40":1,"50":2,"73":1,"74":1,"82":2,"83":1,"87":1,"90":1,"101":1}}],["camando",{"2":{"39":2}}],["caminhos",{"2":{"2":1,"88":2}}],["caminho",{"2":{"2":2,"68":2,"82":2,"84":1,"85":1,"88":1,"90":4,"93":1,"94":1,"95":1,"96":1,"100":2}}],["cat",{"2":{"93":1}}],["categorias",{"2":{"36":1}}],["catalina",{"2":{"27":2,"50":1}}],["cada",{"2":{"11":1,"12":1,"14":1,"15":1,"17":1,"20":1,"22":1,"29":1,"35":1,"36":1,"50":1,"68":1,"83":1,"87":1}}],["capturadas",{"2":{"11":1}}],["classificação",{"2":{"83":1}}],["classificar",{"2":{"83":2}}],["classe",{"2":{"11":1}}],["cli",{"0":{"96":1},"2":{"47":1}}],["clonou",{"2":{"2":1}}],["clone",{"2":{"1":5,"7":5,"25":1,"26":1,"100":1}}],["créditos",{"0":{"76":1},"1":{"77":1,"78":1}}],["crie",{"2":{"64":1,"101":1}}],["criou",{"2":{"12":1}}],["criando",{"2":{"51":1}}],["criam",{"2":{"17":1}}],["criados",{"2":{"15":1,"47":1,"74":1}}],["criado",{"2":{"7":1,"17":1,"68":1}}],["criará",{"2":{"85":1,"88":1}}],["criar",{"0":{"79":1},"1":{"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1},"2":{"2":1,"9":1,"21":1,"74":2,"88":1,"96":1}}],["create",{"2":{"4":3}}],["check",{"2":{"40":1,"57":1}}],["checar",{"2":{"29":1}}],["chrome",{"2":{"7":1}}],["chore",{"2":{"4":1}}],["chamado",{"2":{"27":1,"96":1,"97":1}}],["chamados",{"2":{"27":1}}],["chamadas",{"2":{"68":1}}],["chamada",{"2":{"4":1,"27":2,"85":1,"87":5,"101":1}}],["chaves",{"2":{"11":1}}],["change",{"2":{"4":2}}],["changelog",{"2":{"4":1}}],["ciclo",{"2":{"47":1}}],["ci",{"2":{"4":1,"98":2,"101":1}}],["código",{"2":{"2":2,"8":1,"40":2,"59":1,"81":1,"82":3,"84":3,"85":1,"101":1}}],["copiará",{"2":{"97":1}}],["copyright",{"2":{"76":1}}],["coberta",{"2":{"87":1}}],["coisa",{"2":{"80":1}}],["cool",{"2":{"66":1}}],["costumizado",{"2":{"39":1}}],["colocar",{"2":{"84":1,"85":1}}],["colocado",{"2":{"27":1,"84":2}}],["coleção",{"2":{"20":1}}],["collaborative",{"2":{"12":1,"70":1}}],["codespaces",{"2":{"70":1}}],["code",{"2":{"8":1,"70":1}}],["corrigir",{"2":{"96":1}}],["correta",{"2":{"83":1}}],["corretamente",{"2":{"72":1,"73":1,"98":1}}],["correções",{"2":{"2":1,"41":1}}],["coreutils",{"2":{"23":2}}],["core",{"0":{"42":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1},"2":{"1":1,"2":1,"3":2,"12":1,"27":3,"70":2,"74":1}}],["comuns",{"2":{"71":1}}],["comunidade",{"2":{"12":1}}],["começa",{"2":{"68":1}}],["começando",{"0":{"22":1},"1":{"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"34":1,"35":1,"36":1}}],["combinações",{"2":{"27":1}}],["comando",{"2":{"20":1,"27":13,"31":1,"33":1,"36":1,"37":1,"40":2,"44":1,"46":1,"48":1,"49":1,"50":18,"64":1,"74":1,"83":1,"96":3,"98":2,"102":1}}],["comandos",{"0":{"96":1},"2":{"2":1,"17":1,"36":1,"37":1,"42":1,"57":1,"68":1,"80":1,"85":1,"96":2}}],["complementos",{"2":{"50":9}}],["completo",{"2":{"96":1}}],["completer~",{"2":{"27":3,"50":3}}],["completer",{"2":{"27":3,"50":3}}],["completion",{"2":{"27":6,"50":5}}],["completions",{"2":{"27":8,"50":4}}],["completar",{"2":{"27":15}}],["completa",{"2":{"4":1}}],["compilar",{"2":{"82":1,"87":1}}],["compilada",{"2":{"39":1}}],["compilação",{"2":{"39":1,"59":1,"85":1,"101":1}}],["compi",{"2":{"39":1}}],["compinit",{"2":{"27":7,"50":2}}],["comportamento",{"2":{"18":1}}],["competir",{"2":{"17":1}}],["compactado",{"2":{"84":1}}],["compartilhe",{"2":{"46":1}}],["compartilháveis",{"2":{"38":1}}],["compartilhar",{"2":{"14":1}}],["compatíveis",{"2":{"1":1}}],["community",{"0":{"26":1,"70":1},"2":{"12":2,"70":3}}],["commit",{"2":{"4":1,"9":1,"37":2,"39":1,"49":1,"55":1,"59":1,"82":1,"98":1}}],["commits",{"0":{"4":1,"9":1},"2":{"9":1}}],["command>",{"2":{"37":4,"44":1,"45":1,"48":1,"90":1}}],["commands",{"0":{"37":1},"2":{"2":1,"23":1,"96":7}}],["command",{"2":{"2":1,"23":1,"26":1,"37":3,"96":10,"98":1,"99":1}}],["como",{"2":{"3":1,"5":1,"17":1,"27":2,"40":5,"47":3,"48":1,"51":1,"56":1,"68":3,"83":2,"87":1,"93":1,"96":3,"97":1,"101":2}}],["com",{"2":{"1":9,"3":2,"4":1,"7":6,"8":3,"9":1,"10":2,"11":2,"14":2,"17":1,"18":2,"21":2,"25":1,"27":3,"30":1,"31":1,"33":1,"37":2,"38":1,"39":2,"40":3,"48":2,"50":6,"51":1,"52":1,"53":2,"56":1,"57":1,"60":1,"61":1,"62":1,"63":1,"65":1,"68":1,"80":1,"83":1,"84":2,"85":4,"88":1,"90":1,"92":1,"97":1,"98":2,"100":2,"101":1,"102":1}}],["condicionalmente",{"2":{"90":1}}],["concurrency",{"2":{"82":1}}],["concluir",{"2":{"27":6}}],["conforme",{"2":{"41":1,"65":1}}],["confiar",{"2":{"83":1}}],["configure",{"2":{"89":1}}],["configurado",{"2":{"27":11}}],["configurada",{"2":{"15":1}}],["configuration",{"0":{"38":1},"1":{"39":1,"40":1,"41":1},"2":{"23":1}}],["configurar",{"2":{"15":1,"28":1,"80":1}}],["configurações",{"2":{"10":1,"11":2,"20":1,"39":1,"40":2,"50":11,"101":1}}],["configuração",{"0":{"1":1,"7":1,"43":1,"100":1},"2":{"8":1,"10":5,"11":2,"14":2,"17":1,"21":1,"22":1,"27":3,"35":3,"36":1,"38":1,"50":6,"57":1,"64":1,"73":1,"75":1,"87":1}}],["config",{"2":{"10":1,"11":2,"27":38,"41":1,"50":13,"75":1,"87":1}}],["confirmação",{"2":{"4":4}}],["confirmar",{"2":{"2":1,"8":1}}],["conversas",{"2":{"13":1}}],["convencional",{"2":{"4":2,"9":1}}],["convencionais",{"0":{"4":1,"9":1},"2":{"4":1,"9":1}}],["considerados",{"2":{"98":1}}],["consideradas",{"2":{"85":1}}],["considerar",{"2":{"85":1}}],["consigo",{"2":{"74":1}}],["conseguir",{"2":{"27":1}}],["construir",{"2":{"8":1,"20":1}}],["consulte",{"2":{"2":1,"12":1,"13":1}}],["contêm",{"2":{"88":1}}],["container",{"2":{"70":2}}],["contido",{"2":{"68":1,"84":1}}],["contidas",{"2":{"14":1}}],["contida",{"2":{"10":1}}],["contendo",{"2":{"20":1}}],["conteúdo",{"2":{"11":1}}],["contém",{"2":{"8":1,"98":1}}],["contínuo",{"2":{"5":1}}],["contrário",{"2":{"82":1,"90":1,"101":1}}],["contribuidores",{"0":{"78":1},"2":{"78":1}}],["contribuição",{"2":{"0":1,"6":1,"9":1,"13":1}}],["controle",{"2":{"2":1}}],["conjunto",{"2":{"3":1,"8":1,"11":1,"73":1,"87":1}}],["eventualmente",{"2":{"84":1}}],["eu",{"2":{"76":1}}],["either",{"2":{"65":1}}],["etapas",{"2":{"49":1}}],["etc",{"0":{"17":1},"2":{"27":3,"50":2,"51":1,"68":1,"75":2}}],["efeito",{"2":{"27":1}}],["echo",{"2":{"27":7}}],["erro",{"2":{"32":1}}],["erlang",{"2":{"12":1,"52":1,"55":1,"56":1,"59":1,"60":2,"61":2,"62":2,"63":2,"66":2,"67":1}}],["era",{"2":{"8":1}}],["ela",{"2":{"101":1}}],["elas",{"2":{"29":1}}],["elm",{"2":{"52":2}}],["else",{"2":{"50":2}}],["ele",{"2":{"39":1,"40":3,"47":1,"52":1,"75":1,"98":1}}],["eles",{"2":{"10":1,"36":2,"87":1,"88":1,"96":2}}],["elv",{"2":{"27":18,"50":6}}],["elvish",{"2":{"27":18,"41":1,"50":9}}],["elimina",{"2":{"17":1}}],["elixir",{"2":{"12":1,"39":1,"51":1,"64":4,"97":2}}],["equipes",{"2":{"21":1}}],["equipe",{"2":{"12":1}}],["esses",{"2":{"80":1}}],["esse",{"2":{"40":1,"41":1,"49":1,"50":1,"57":1,"68":1,"73":1,"87":1,"96":1,"97":1}}],["essa",{"2":{"35":2,"85":2,"98":1}}],["essas",{"2":{"4":1,"5":1,"10":1,"17":1,"82":2}}],["esperam",{"2":{"96":1}}],["específico",{"2":{"55":1}}],["específicas",{"2":{"38":1}}],["específica",{"2":{"31":1,"64":1,"91":1,"98":1}}],["especificando",{"2":{"102":1}}],["especificado",{"2":{"68":1,"88":1,"90":2,"98":2}}],["especificadas",{"2":{"40":1}}],["especificada",{"2":{"32":1,"39":1,"81":2,"88":1,"90":1}}],["especifica",{"2":{"59":1}}],["especificar",{"2":{"59":1}}],["especificações",{"2":{"10":1}}],["especial",{"2":{"3":1,"87":1}}],["espaços",{"2":{"88":1,"92":1}}],["espaço",{"2":{"39":1,"83":1}}],["escolhida",{"2":{"73":1}}],["escolhido",{"2":{"8":1}}],["escolha",{"2":{"19":1,"83":1}}],["escreve",{"2":{"64":2}}],["escrever",{"2":{"3":1,"8":1}}],["escritas",{"2":{"17":1}}],["esforço",{"2":{"5":1}}],["estiverem",{"2":{"83":1}}],["estiver",{"2":{"27":2,"34":1,"39":1,"41":1,"73":1,"84":2,"85":3,"96":1}}],["esta",{"2":{"15":1,"17":1,"21":1,"27":2,"37":1,"55":1,"83":1,"87":1}}],["estarão",{"2":{"82":2}}],["estar",{"2":{"11":1,"39":1,"75":1,"87":5}}],["esteja",{"2":{"27":2,"50":2,"87":1}}],["estejam",{"2":{"14":1}}],["este",{"2":{"4":2,"47":1,"50":6,"68":1,"82":1,"84":4,"85":1,"87":4,"88":1,"92":1,"97":1}}],["estável",{"0":{"60":1,"63":1},"2":{"60":1,"63":1}}],["estática",{"2":{"1":1}}],["está",{"0":{"74":1},"2":{"1":1,"3":1,"4":1,"9":1,"10":1,"15":1,"27":4,"68":1,"75":1,"84":1,"85":1,"87":1,"96":1,"97":1,"100":1}}],["estão",{"2":{"1":1,"10":1,"14":1,"29":1,"36":1,"55":1,"71":1,"83":1,"87":1}}],["extensões",{"2":{"96":1}}],["extensão",{"0":{"96":1},"2":{"96":2}}],["extraídas",{"2":{"83":1}}],["extraídos",{"2":{"10":1}}],["exceto",{"2":{"82":1}}],["excluído",{"2":{"40":1}}],["expanda",{"2":{"27":1}}],["exportadas",{"2":{"11":1}}],["exhaustive",{"2":{"23":1}}],["exatas",{"2":{"20":1,"31":1}}],["exatamente",{"2":{"14":1,"21":1}}],["example",{"2":{"90":1}}],["examples",{"2":{"4":1}}],["examinar",{"2":{"3":1}}],["exibida",{"2":{"87":1}}],["existência",{"2":{"85":1}}],["existem",{"2":{"27":1}}],["existe",{"2":{"18":1,"47":1}}],["existentes",{"0":{"35":1},"2":{"13":1,"18":1}}],["existente",{"2":{"3":1}}],["exige",{"2":{"31":1}}],["exigem",{"2":{"29":1}}],["exigirá",{"2":{"11":1,"74":1}}],["exectable",{"0":{"74":1}}],["exec",{"0":{"89":1,"90":1},"2":{"37":1,"44":1,"68":5,"90":2}}],["execution",{"2":{"37":1}}],["executável",{"2":{"47":1,"68":1,"90":3,"96":2,"97":3}}],["executáveis",{"2":{"15":2,"17":1,"47":2,"48":1,"74":2,"80":1,"88":2,"96":3}}],["executá",{"2":{"32":1}}],["executes",{"2":{"37":1}}],["execute",{"0":{"44":1},"2":{"15":1,"34":1,"39":2,"50":14}}],["executavél",{"2":{"68":1}}],["executam",{"2":{"68":1}}],["executable",{"2":{"37":1,"90":1}}],["executadas",{"2":{"32":1}}],["executados",{"2":{"80":2,"85":1,"96":1}}],["executado",{"2":{"15":1,"40":1,"68":3,"98":1,"100":1}}],["executa",{"2":{"32":2,"44":1,"64":1}}],["executar",{"2":{"5":1,"64":1,"73":1,"74":1,"89":1,"94":1,"95":1,"96":1,"98":1}}],["execução",{"2":{"3":1,"7":1,"31":1,"68":2,"96":1}}],["exemplo",{"0":{"99":1,"100":1},"2":{"3":1,"14":1,"29":1,"33":1,"35":1,"39":1,"40":1,"41":1,"47":1,"48":1,"64":1,"83":1,"87":1,"88":1,"96":2,"98":1,"100":1,"102":2}}],["encontrar",{"2":{"96":1}}],["encontrado",{"2":{"93":1}}],["encontrada",{"2":{"9":1}}],["enquanto",{"2":{"74":1,"97":1}}],["enviando",{"0":{"102":1}}],["enviar",{"2":{"2":1}}],["environment",{"2":{"37":1}}],["env",{"0":{"89":1},"2":{"37":1,"45":1,"68":1,"80":1,"82":1,"89":1,"99":1}}],["envolve",{"2":{"22":1}}],["entretanto",{"2":{"18":1}}],["entrar",{"2":{"69":1}}],["entra",{"2":{"11":1}}],["então",{"2":{"1":1,"32":1,"75":1,"82":1}}],["en",{"2":{"11":2}}],["english",{"2":{"11":1}}],["embutido",{"2":{"49":1}}],["em",{"0":{"80":1},"2":{"1":2,"2":1,"3":1,"7":1,"8":1,"9":1,"10":2,"11":3,"17":1,"27":1,"32":2,"33":1,"36":1,"37":1,"39":5,"40":1,"41":1,"50":17,"57":3,"64":3,"65":1,"68":4,"78":1,"83":3,"85":3,"88":2,"92":1,"94":1,"95":1,"97":1,"98":2,"101":2}}],["e",{"0":{"4":1,"9":1,"43":1},"2":{"1":2,"2":4,"3":1,"4":1,"5":1,"6":1,"7":1,"10":2,"11":2,"12":1,"13":1,"14":3,"15":2,"17":3,"19":1,"20":4,"21":2,"22":1,"27":13,"28":1,"32":1,"33":1,"38":1,"39":6,"40":1,"41":2,"46":1,"48":2,"49":1,"50":12,"55":1,"57":1,"59":2,"68":4,"73":2,"75":1,"76":1,"80":1,"84":3,"85":4,"87":5,"88":2,"94":1,"96":1,"98":2,"101":1,"102":1}}],["edite",{"2":{"39":1}}],["edit",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"27":3,"37":1,"38":1,"42":1,"50":3,"51":1,"58":1,"79":1}}],["g",{"2":{"47":1,"74":1}}],["given",{"2":{"37":1}}],["gitref",{"2":{"98":1}}],["git",{"2":{"1":8,"7":5,"14":1,"23":7,"25":1,"26":3,"27":8,"30":1,"34":1,"37":6,"49":2,"50":5,"52":3,"53":2,"80":1,"82":1,"98":3,"100":2,"102":1}}],["github",{"0":{"13":1,"99":1,"101":1},"2":{"1":7,"4":1,"7":5,"12":1,"25":1,"30":1,"37":2,"39":1,"52":1,"53":2,"70":2,"73":1,"78":1,"98":1,"99":4,"100":1,"101":2,"102":1}}],["guiá",{"2":{"33":1}}],["guia",{"2":{"0":1,"6":1,"9":1,"43":1,"50":2}}],["globais",{"0":{"33":1},"2":{"33":1,"39":1}}],["global",{"2":{"22":1,"33":2,"37":4,"39":1,"47":1,"64":5,"65":2,"68":1}}],["ganchos",{"2":{"94":1,"95":1}}],["gawk",{"2":{"29":2}}],["garanta",{"2":{"27":2}}],["garante",{"2":{"21":1}}],["garantir",{"2":{"14":1,"98":1}}],["gpg",{"2":{"29":2}}],["gostaria",{"2":{"22":1}}],["gostaríamos",{"2":{"8":1}}],["grande",{"2":{"17":1}}],["get",{"2":{"29":1,"87":1}}],["generator",{"2":{"8":1}}],["gerais",{"2":{"87":1}}],["geral",{"2":{"87":1}}],["geralmente",{"2":{"34":1}}],["gerar",{"2":{"4":1,"87":4}}],["gerência",{"2":{"20":1}}],["gerencia",{"2":{"18":1,"19":2,"20":1,"32":1}}],["gerenciamento",{"2":{"17":1,"20":1,"33":1}}],["gerenciada",{"2":{"39":1,"74":1,"87":1}}],["gerenciadas",{"2":{"7":1,"33":1}}],["gerenciados",{"2":{"33":1}}],["gerenciadores",{"2":{"14":1,"35":1,"40":1}}],["gerenciador",{"2":{"14":1,"17":1,"19":3,"20":1,"21":1,"50":9,"65":1}}],["gerenciar",{"2":{"1":2,"15":1,"21":1,"22":1,"36":1,"74":1}}],["gt",{"2":{"3":1,"4":2,"9":1,"40":1,"47":2,"50":2,"57":1,"65":1,"87":3,"88":3,"98":1}}],["número",{"2":{"82":2}}],["núcleos",{"2":{"82":1}}],["núcleo",{"2":{"1":1,"22":1,"36":1,"42":1}}],["npm",{"2":{"47":2,"48":2,"74":1}}],["nós",{"2":{"31":1}}],["n$env",{"2":{"27":3}}],["nunca",{"2":{"101":1}}],["nu",{"2":{"27":9}}],["nushell",{"2":{"27":6}}],["nsource",{"2":{"27":1}}],["nix",{"2":{"20":1}}],["nixos",{"0":{"20":1},"2":{"20":3}}],["nvmrc",{"2":{"35":1}}],["nvm",{"0":{"17":1},"2":{"17":1}}],["nas",{"2":{"73":1,"101":1}}],["name>",{"2":{"37":19,"47":1,"52":2,"55":1,"56":1,"59":1,"60":2,"61":2,"62":2,"63":2,"64":5,"65":1,"66":1,"67":1,"98":1}}],["name",{"2":{"12":1,"37":1,"57":1,"65":1,"94":2,"95":2,"98":1,"99":1}}],["navegação",{"2":{"11":1}}],["navbar",{"2":{"10":2,"11":5}}],["na",{"2":{"4":1,"9":1,"10":1,"11":1,"12":1,"21":1,"27":1,"31":2,"39":1,"41":1,"55":1,"64":3,"65":1,"83":2,"84":1,"87":1}}],["n",{"0":{"17":1},"2":{"3":2,"17":1,"27":16,"101":1}}],["neko",{"2":{"96":1}}],["nem",{"2":{"87":1}}],["nenhum",{"2":{"84":1,"87":1}}],["nenhuma",{"2":{"57":1,"87":1}}],["nesse",{"2":{"39":1,"83":1,"98":1}}],["neste",{"2":{"17":1,"74":1}}],["nested",{"2":{"11":2}}],["nexport",{"2":{"27":1}}],["necessária",{"2":{"80":1}}],["necessário",{"2":{"27":1,"64":1,"97":1}}],["necessários",{"2":{"2":1,"8":1,"87":1,"98":1}}],["necessidades",{"2":{"100":1}}],["necessidade",{"2":{"17":1,"74":1}}],["necessitava",{"2":{"14":1}}],["new",{"2":{"0":1,"4":4,"6":1,"12":1,"13":1,"14":1,"22":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["não",{"0":{"74":1,"75":1},"2":{"1":1,"8":2,"18":1,"19":2,"20":3,"21":2,"27":3,"32":1,"33":1,"39":1,"41":1,"47":2,"50":1,"56":1,"57":1,"72":3,"73":2,"74":1,"75":2,"83":3,"84":1,"85":2,"87":3,"88":1,"93":1,"96":1}}],["normalmente",{"2":{"41":1,"98":1}}],["non",{"2":{"23":1}}],["novas",{"2":{"96":1}}],["nova",{"2":{"27":1}}],["novamente",{"2":{"20":1}}],["novo",{"2":{"27":2,"49":1,"101":1}}],["novos",{"2":{"2":2,"47":1,"96":1}}],["nomes",{"0":{"54":1},"2":{"41":1,"54":1,"92":1}}],["nome",{"0":{"57":1},"2":{"11":1,"40":1,"41":2,"52":2,"57":1,"59":1,"68":1,"96":1}}],["nosso",{"2":{"49":1}}],["nos",{"2":{"11":1,"57":1}}],["node",{"2":{"7":2,"12":1,"28":1,"31":1,"35":1,"48":3,"51":1,"66":1,"98":1,"100":2}}],["nodejs",{"2":{"7":2,"28":1,"29":1,"30":2,"31":3,"33":2,"34":2,"35":1,"36":1,"39":1,"47":2,"48":7,"53":3,"66":1,"98":3,"100":2}}],["notifique",{"2":{"74":1}}],["note",{"2":{"23":1,"70":1}}],["notas",{"2":{"100":1}}],["nota",{"2":{"21":1,"31":1,"92":1}}],["not",{"2":{"3":1,"70":2}}],["no",{"0":{"54":1,"57":1},"2":{"1":1,"3":1,"7":2,"9":2,"11":1,"14":2,"15":2,"18":1,"29":1,"32":2,"34":2,"35":1,"39":7,"40":6,"43":1,"55":1,"59":1,"68":10,"69":1,"73":1,"75":1,"78":1,"82":2,"83":1,"84":4,"85":4,"87":2,"89":1,"96":1,"97":2,"98":3,"99":1,"100":1,"102":1}}],["ic",{"2":{"100":1}}],["idealmente",{"2":{"87":1}}],["identifique",{"2":{"15":1}}],["ignorar",{"2":{"69":1}}],["ignorando",{"0":{"69":1}}],["ignore",{"2":{"41":1}}],["irá",{"2":{"27":2,"33":1,"55":1,"56":1,"93":1}}],["isntalar",{"2":{"39":1}}],["is",{"2":{"23":1}}],["isso",{"2":{"3":1,"4":1,"8":2,"11":1,"20":1,"29":1,"41":2,"46":1,"47":1,"56":1,"83":1,"85":1,"88":1,"90":1,"92":1,"93":1,"94":1,"95":1,"97":1,"101":1}}],["i18n",{"0":{"11":1},"2":{"11":1}}],["impossível",{"2":{"97":1}}],["importante",{"2":{"73":1}}],["importa",{"2":{"50":3}}],["implementado",{"2":{"93":1}}],["impresso",{"2":{"87":1}}],["imprimem",{"2":{"87":1}}],["imprime",{"2":{"83":1}}],["imprimirá",{"2":{"87":1}}],["imprimir",{"2":{"46":1,"83":1,"87":1,"88":1,"90":1,"92":1}}],["imprimindo",{"2":{"3":1}}],["imprima",{"2":{"3":1}}],["impactar",{"2":{"27":1}}],["imagens",{"0":{"5":1},"2":{"5":2}}],["início",{"2":{"85":1}}],["invocados",{"2":{"96":1}}],["inversa",{"2":{"83":1}}],["invés",{"2":{"68":1}}],["index",{"2":{"54":1}}],["independente",{"2":{"52":1}}],["individualmente",{"2":{"11":1}}],["indicar",{"2":{"33":1}}],["indica",{"2":{"4":1}}],["informação",{"2":{"87":1}}],["informações",{"0":{"46":1},"2":{"4":1,"46":1,"87":2}}],["information",{"2":{"37":1}}],["info",{"2":{"37":1,"46":1}}],["ins",{"0":{"98":1},"1":{"99":1,"100":1},"2":{"40":1,"74":1}}],["inside",{"2":{"37":1}}],["instruirá",{"2":{"88":1}}],["instruções",{"2":{"27":5,"50":2,"73":1,"102":1}}],["instancia",{"2":{"68":1}}],["instalável",{"2":{"102":1}}],["instaláveis",{"2":{"81":1}}],["instalou",{"2":{"49":1}}],["instalações",{"2":{"41":1,"56":1}}],["instalação",{"0":{"43":1},"2":{"22":2,"27":4,"29":2,"31":1,"40":1,"47":2,"49":1,"74":1,"85":7,"88":2,"94":1}}],["instala",{"2":{"41":1,"68":1,"81":1}}],["instalando",{"0":{"23":1,"28":1,"30":1,"31":1},"1":{"29":1,"30":1},"2":{"41":1,"47":1}}],["instaladas",{"0":{"61":1},"2":{"48":1}}],["instalada",{"2":{"15":1,"39":1,"85":2,"98":2}}],["instalados",{"0":{"53":1,"75":1},"2":{"15":2,"17":1,"74":1,"87":1}}],["instalado",{"0":{"74":1},"2":{"2":1,"27":1,"47":1,"68":5,"82":2,"85":1,"94":1,"95":1}}],["instalará",{"2":{"84":1}}],["instalar",{"0":{"59":1,"60":1},"2":{"15":1,"22":4,"28":1,"29":2,"31":2,"39":1,"41":1,"74":1,"85":1,"87":1,"102":1}}],["installs",{"2":{"90":1}}],["installed",{"2":{"37":5}}],["install",{"0":{"85":1},"2":{"1":1,"7":2,"23":6,"26":1,"29":2,"31":1,"37":10,"39":2,"40":2,"47":1,"59":2,"60":4,"80":1,"81":1,"82":6,"84":1,"85":6,"87":2,"88":3,"90":1}}],["instale",{"2":{"1":1,"7":2,"60":1}}],["inicie",{"2":{"61":1,"62":1,"63":1,"65":1}}],["inicia",{"2":{"60":1}}],["iniciar",{"2":{"8":1}}],["inicial",{"0":{"1":1,"7":1},"2":{"36":1}}],["initialise",{"2":{"27":1}}],["in",{"0":{"79":1,"80":1},"1":{"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1},"2":{"23":1,"37":3,"47":1,"70":1,"87":2,"90":1,"94":1,"95":1,"96":3,"97":1,"98":3,"101":1}}],["intruções",{"2":{"50":1}}],["introdução",{"0":{"14":1},"1":{"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1},"2":{"43":1}}],["into",{"2":{"27":2}}],["intenção",{"2":{"72":1}}],["integrar",{"2":{"18":1}}],["interface",{"2":{"14":1,"96":1}}],["interesse",{"2":{"13":1}}],["internacionalização",{"2":{"11":1}}],["interpretador",{"2":{"1":1}}],["incluir",{"2":{"84":1}}],["inclui",{"2":{"1":1,"21":1}}],["if",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"37":2,"38":1,"42":1,"51":1,"58":1,"79":1,"101":1}}],["publique",{"2":{"101":1}}],["public",{"2":{"101":1}}],["pull",{"0":{"4":1,"9":1},"2":{"2":1,"4":4,"98":1}}],["pós",{"2":{"94":1}}],["pkgbuild",{"2":{"49":1}}],["página",{"2":{"35":1,"83":1}}],["python",{"2":{"33":1,"39":3,"65":1}}],["ps1",{"2":{"27":8}}],["p",{"2":{"27":4}}],["pessoal",{"2":{"101":1}}],["pequena",{"2":{"42":1}}],["pela",{"2":{"27":1}}],["pelos",{"2":{"68":1}}],["pelo",{"2":{"13":1,"27":2,"33":2,"39":1,"52":1,"64":1,"68":4,"82":1,"85":1,"90":1,"93":1}}],["personalize",{"2":{"100":1}}],["personalizados",{"0":{"97":1},"2":{"97":1}}],["personalizado",{"2":{"85":1}}],["personalizada",{"2":{"39":1}}],["personalizações",{"2":{"38":1}}],["perguntas",{"0":{"71":1},"1":{"72":1,"73":1,"74":1,"75":1},"2":{"71":1}}],["período",{"2":{"57":1}}],["periodicamente",{"2":{"57":1}}],["permite",{"2":{"90":1,"97":1}}],["permitem",{"2":{"47":1}}],["permitindo",{"2":{"15":1}}],["permitirá",{"2":{"3":1}}],["perf",{"2":{"4":1}}],["pt",{"2":{"11":6}}],["pipeline",{"2":{"9":1}}],["plug",{"0":{"79":1,"80":1,"98":1},"1":{"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":2,"100":2,"101":1,"102":1},"2":{"40":1,"47":1,"74":1,"87":2,"90":1,"94":1,"95":1,"96":3,"97":1,"98":3,"101":1}}],["plugin",{"0":{"28":1,"30":1,"94":1,"95":1},"1":{"29":1,"30":1},"2":{"1":3,"7":1,"12":1,"14":1,"15":1,"18":1,"21":1,"22":1,"27":5,"28":1,"29":1,"30":1,"31":1,"35":1,"37":12,"40":3,"50":1,"51":1,"52":4,"53":4,"54":1,"55":3,"56":4,"57":3,"59":1,"68":6,"80":1,"85":1,"87":2,"90":1,"92":1,"94":9,"95":8,"96":1,"97":1,"98":10,"99":2,"100":3,"102":7}}],["plugins",{"0":{"12":1,"29":1,"51":1,"102":2},"1":{"52":1,"53":1,"54":1,"55":1,"56":1,"57":1},"2":{"1":1,"7":1,"12":6,"15":1,"17":1,"21":1,"29":1,"36":1,"37":6,"39":1,"40":2,"41":1,"47":1,"48":1,"51":2,"52":2,"54":2,"55":1,"70":1,"84":3,"90":1,"96":9,"99":1,"102":5}}],["please",{"2":{"4":1}}],["powershell",{"2":{"27":7}}],["popular",{"2":{"12":1}}],["post",{"0":{"94":1},"2":{"94":2,"95":2}}],["possíveis",{"2":{"87":1}}],["possível",{"2":{"8":1,"21":1,"83":2,"84":1,"85":1,"87":2,"96":1}}],["possa",{"2":{"32":1,"87":1}}],["possui",{"2":{"29":1,"36":1}}],["possuem",{"2":{"15":1}}],["possibilidade",{"2":{"18":1}}],["posix",{"2":{"1":1,"27":3}}],["porque",{"2":{"97":1}}],["portuguese",{"2":{"11":1}}],["por",{"0":{"21":1},"2":{"2":1,"9":1,"10":1,"11":1,"14":1,"15":1,"21":1,"29":2,"33":1,"35":1,"39":3,"40":7,"41":1,"47":4,"50":1,"57":1,"69":1,"74":1,"83":2,"85":1,"87":3,"88":1,"92":1,"96":1,"97":2,"98":1,"100":1,"102":2}}],["pois",{"2":{"1":1,"8":1,"29":1,"52":1,"83":1,"87":2}}],["poderá",{"2":{"83":1,"84":1}}],["podemos",{"2":{"31":2,"98":1}}],["podem",{"2":{"15":1,"27":1,"39":3,"72":1,"85":1,"87":1,"96":2,"101":1}}],["podendo",{"2":{"14":1}}],["pode",{"2":{"1":2,"2":1,"3":1,"5":1,"14":1,"22":1,"27":4,"36":2,"41":4,"42":1,"48":1,"56":1,"57":2,"59":1,"64":1,"68":2,"69":1,"80":1,"82":1,"85":1,"87":3,"93":1,"94":1,"95":1,"98":1,"102":2}}],["pré",{"2":{"95":1}}],["próxima",{"2":{"83":1}}],["própria",{"2":{"20":1,"83":1}}],["próprio",{"2":{"1":1,"33":1,"96":1}}],["pre",{"0":{"95":1},"2":{"94":2,"95":2}}],["presença",{"2":{"85":1}}],["presentes",{"2":{"87":1}}],["presente",{"2":{"32":1,"39":1,"84":2,"87":2}}],["preenchido",{"2":{"85":1}}],["pretendemos",{"2":{"73":1}}],["precisamos",{"2":{"29":1}}],["precisam",{"2":{"27":1,"50":2}}],["precisa",{"2":{"27":1,"33":1,"68":1,"75":1}}],["precisará",{"2":{"59":1,"100":1}}],["precisar",{"2":{"1":1,"27":1,"83":1}}],["prefira",{"2":{"52":1}}],["prefix",{"2":{"27":12,"50":6}}],["preferências",{"2":{"49":1}}],["preferred",{"2":{"26":1}}],["primeiros",{"2":{"98":1}}],["primeiro",{"2":{"29":1,"93":1}}],["primeiras",{"2":{"83":1}}],["primeira",{"2":{"11":1}}],["primarily",{"2":{"23":1}}],["print",{"2":{"37":2}}],["printed",{"2":{"3":2}}],["printf",{"2":{"3":2}}],["principal",{"2":{"0":1,"9":1,"12":1,"87":1}}],["pr",{"2":{"9":3}}],["procurará",{"2":{"88":1}}],["processo",{"2":{"85":1}}],["prompt",{"2":{"83":1}}],["problema",{"2":{"75":1,"96":1}}],["problemas",{"2":{"13":1}}],["programa",{"2":{"68":3}}],["programação",{"2":{"20":1}}],["pronto",{"2":{"50":1}}],["pronta",{"2":{"39":1}}],["provável",{"2":{"75":1}}],["provide",{"2":{"37":1}}],["provided",{"2":{"37":2,"99":1}}],["provenientes",{"2":{"35":1}}],["provê",{"2":{"14":1}}],["profile",{"2":{"27":14,"50":3,"75":1}}],["profissional",{"2":{"12":1}}],["projeto",{"2":{"14":1,"34":1,"36":1,"64":1,"69":1}}],["projetos",{"0":{"16":1},"1":{"17":1,"18":1,"19":1,"20":1},"2":{"5":1,"36":1}}],["projects",{"0":{"70":1},"2":{"70":2}}],["project",{"2":{"12":1,"66":1,"70":1}}],["produção",{"2":{"5":1}}],["padrões",{"2":{"33":1}}],["padrão",{"2":{"1":1,"4":1,"7":1,"10":1,"27":2,"33":1,"40":4,"41":5,"47":1,"50":1,"55":1,"57":1,"68":1,"85":1,"90":1,"97":2,"98":2}}],["palavra",{"2":{"31":1}}],["path>",{"2":{"90":2}}],["paths",{"0":{"88":1},"2":{"85":1}}],["path",{"0":{"90":1},"2":{"27":8,"37":2,"39":3,"68":4,"82":3,"84":3,"85":6,"88":3,"90":2,"94":1,"95":1,"101":1}}],["patch",{"2":{"4":1}}],["passar",{"2":{"100":1}}],["passado",{"2":{"82":1,"88":1}}],["passando",{"2":{"68":1}}],["passe",{"2":{"39":1}}],["passos",{"2":{"36":1,"50":1}}],["passo",{"2":{"22":2}}],["pasta",{"2":{"11":1}}],["pacote",{"2":{"27":2,"47":1,"55":1,"68":8,"89":1}}],["pacotes",{"2":{"19":5,"20":5,"21":1,"50":9,"87":1}}],["pacman",{"2":{"23":2,"26":1,"27":7,"49":1,"50":4}}],["packages",{"2":{"37":3}}],["package",{"2":{"7":1,"8":1,"23":2,"37":15}}],["parse",{"0":{"93":1},"2":{"93":1}}],["parágrafo",{"2":{"87":1}}],["parece",{"2":{"39":1,"73":1}}],["particular",{"2":{"37":1}}],["partir",{"2":{"27":2}}],["party",{"0":{"12":1}}],["para",{"0":{"96":1,"102":1},"2":{"1":5,"2":4,"4":2,"5":3,"7":1,"8":4,"9":1,"10":4,"11":3,"12":3,"13":1,"14":2,"15":2,"17":4,"18":2,"19":2,"20":1,"21":4,"22":1,"27":26,"28":1,"29":1,"31":1,"32":2,"33":3,"34":1,"35":3,"36":3,"39":9,"40":2,"41":5,"44":1,"46":1,"47":4,"48":1,"49":2,"50":15,"51":2,"54":1,"56":1,"64":5,"65":2,"68":3,"69":1,"72":1,"73":2,"74":3,"80":3,"81":1,"82":7,"83":1,"84":2,"85":2,"87":8,"88":3,"89":1,"90":1,"92":1,"93":2,"94":1,"95":1,"96":5,"97":1,"98":4,"99":1,"100":2,"101":3,"102":3}}],["page",{"2":{"0":3,"6":3,"12":3,"13":3,"14":3,"22":3,"37":3,"38":3,"42":3,"51":3,"58":3,"79":3}}],["pages",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["dylibs",{"2":{"96":1}}],["d",{"2":{"27":2,"50":2}}],["dnf",{"2":{"23":2}}],["driven",{"2":{"12":1,"70":1}}],["dar",{"2":{"80":1}}],["danhper",{"2":{"77":1}}],["data",{"2":{"31":1,"41":1,"50":11,"68":1,"96":5}}],["das",{"2":{"11":1,"14":2,"20":1,"27":1,"32":2,"41":1,"48":1,"55":1}}],["da",{"0":{"101":1},"2":{"4":3,"7":1,"11":1,"12":1,"15":1,"20":3,"22":1,"27":9,"31":2,"35":1,"39":2,"40":3,"64":1,"65":1,"68":1,"74":1,"82":1,"83":2,"85":4,"88":1,"90":1,"98":1}}],["duração",{"2":{"40":2}}],["duration",{"2":{"40":1,"57":1}}],["durante",{"2":{"1":1,"3":1,"27":1,"47":1,"85":1}}],["during",{"2":{"3":2}}],["dinâmicas",{"2":{"96":1}}],["disso",{"2":{"96":1}}],["distribuição",{"2":{"73":1}}],["disponibilizado",{"2":{"68":1}}],["disponíveis",{"0":{"62":1},"2":{"31":1,"37":1,"82":2,"96":1}}],["disponível",{"2":{"8":1,"31":1,"73":1,"87":1}}],["disparam",{"2":{"57":1}}],["display",{"2":{"37":4}}],["divididos",{"2":{"36":1}}],["diversas",{"2":{"21":1,"27":1}}],["diversos",{"2":{"14":1,"36":1}}],["diferente",{"2":{"49":1,"84":1,"85":1,"87":1}}],["diferentes",{"2":{"14":1,"17":1,"18":1,"51":1}}],["diferencial",{"2":{"17":1}}],["difícil",{"2":{"3":1}}],["diária",{"2":{"12":1}}],["dirmngr",{"2":{"29":1}}],["dir=",{"2":{"27":3}}],["direnv",{"0":{"18":1},"2":{"18":3,"69":1}}],["diretamente",{"2":{"39":1,"68":1}}],["diretrizes",{"2":{"13":1}}],["diretórios",{"2":{"88":1}}],["diretório",{"2":{"2":2,"18":1,"32":3,"34":2,"39":5,"40":1,"41":2,"50":9,"68":4,"69":1,"73":1,"82":1,"84":2,"85":3,"88":1,"96":1,"100":1}}],["dir",{"2":{"2":1,"27":4,"41":2,"50":12,"68":1,"96":6,"100":1}}],["download",{"0":{"24":1,"25":1,"26":1,"84":1},"1":{"25":1,"26":1},"2":{"39":3,"40":1,"59":1,"81":1,"82":4,"84":7,"85":2}}],["dos",{"0":{"29":1},"2":{"20":1,"41":1,"76":1,"87":1}}],["dois",{"2":{"10":1,"48":1,"68":1,"98":1}}],["docker",{"0":{"5":1},"2":{"5":1}}],["documentation",{"2":{"4":1,"37":1}}],["documentado",{"2":{"3":1}}],["documentação",{"2":{"2":1,"3":1,"6":1,"8":1,"9":2,"10":2,"11":1,"14":1,"18":1,"19":1,"20":1,"57":1,"74":1,"87":2}}],["docsify",{"2":{"8":2}}],["docs",{"0":{"6":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1},"2":{"0":1,"4":3,"6":1,"7":3,"9":2,"10":3,"11":2,"12":1,"13":1,"14":1,"22":1,"37":2,"38":1,"42":1,"51":1,"58":1,"79":1}}],["do",{"0":{"48":1,"65":1,"69":1,"100":1,"101":1},"2":{"1":1,"2":2,"3":2,"4":1,"6":1,"7":3,"8":1,"9":1,"10":3,"11":1,"12":1,"14":1,"17":1,"18":2,"19":2,"20":1,"21":3,"22":3,"27":25,"28":1,"31":1,"32":1,"33":1,"35":1,"36":4,"37":1,"38":2,"40":3,"41":2,"42":1,"46":1,"47":2,"49":1,"50":25,"51":1,"52":2,"57":2,"59":1,"64":2,"65":2,"68":11,"69":2,"70":1,"72":1,"73":1,"74":1,"82":1,"83":2,"85":2,"87":2,"90":1,"93":1,"95":1,"96":4,"98":3,"99":1,"100":1,"101":4,"102":1}}],["deasdf",{"2":{"75":1}}],["dentro",{"2":{"52":1}}],["declara",{"2":{"39":1}}],["debug",{"2":{"37":1}}],["debian",{"2":{"29":1}}],["default",{"2":{"37":3,"41":1,"98":1}}],["definam",{"2":{"96":1}}],["defina",{"2":{"33":1,"41":1}}],["definidos",{"2":{"87":1,"96":1}}],["definido",{"2":{"40":5,"41":3,"85":2,"96":1}}],["definida",{"2":{"39":1}}],["definidas",{"2":{"34":1,"39":2,"69":1,"87":1}}],["definindo",{"0":{"32":1},"1":{"33":1,"34":1,"35":1}}],["definições",{"2":{"14":1}}],["definir",{"2":{"2":1,"22":1,"41":1,"75":1,"80":1,"82":1}}],["define",{"2":{"11":1,"40":1}}],["definem",{"2":{"4":1}}],["demonstração",{"2":{"28":1}}],["dela",{"2":{"32":1}}],["delas",{"2":{"21":1}}],["deles",{"2":{"14":1,"15":1}}],["detecta",{"0":{"75":1}}],["determinar",{"2":{"68":1,"85":1,"93":1}}],["determinado",{"2":{"57":1,"61":1,"62":1,"63":1}}],["determinadas",{"2":{"4":1,"15":1}}],["detalhes",{"2":{"11":1,"18":1,"19":1,"20":1,"64":1,"69":1}}],["detalhada",{"2":{"9":1}}],["devido",{"2":{"75":1,"101":1}}],["devolver",{"2":{"33":1}}],["dev",{"2":{"8":1,"70":2}}],["devem",{"2":{"68":1,"84":1,"87":2,"88":1}}],["devemos",{"2":{"29":1}}],["deve",{"2":{"4":1,"11":1,"27":6,"40":1,"41":2,"73":2,"82":2,"83":3,"84":5,"85":4,"87":10,"88":1,"90":1,"92":1,"97":1}}],["deps",{"2":{"87":2}}],["depois",{"2":{"27":2,"75":2,"94":1}}],["dependência",{"2":{"73":1,"87":1}}],["dependências",{"0":{"23":1,"29":1},"2":{"7":1,"19":1,"20":2,"22":1,"29":2,"87":2}}],["depending",{"2":{"23":1}}],["depender",{"2":{"101":1}}],["dependencia",{"2":{"29":1}}],["dependencias",{"2":{"19":1}}],["depende",{"2":{"9":1,"49":1}}],["depuração",{"2":{"3":2,"46":1}}],["desse",{"2":{"96":1}}],["desses",{"2":{"12":1,"87":1}}],["descompactado",{"2":{"84":1}}],["descrição",{"2":{"87":1}}],["descrito",{"2":{"41":1,"65":1}}],["descritor",{"2":{"3":1}}],["description",{"2":{"9":1}}],["description>",{"2":{"4":1}}],["desmarcar",{"2":{"80":1}}],["desinstala",{"2":{"91":1}}],["desinstalar",{"0":{"50":1,"67":1},"2":{"50":1,"59":1}}],["desinstale",{"2":{"50":12}}],["desta",{"2":{"22":1,"31":1}}],["destes",{"2":{"15":1,"19":1,"20":1}}],["deste",{"2":{"1":1,"22":1}}],["desde",{"2":{"4":1,"32":1}}],["desenvolvidas",{"2":{"55":1}}],["desenvolvimento",{"0":{"2":1,"8":1},"2":{"1":3,"5":1,"7":1,"8":2,"14":1,"39":1}}],["desenvolver",{"2":{"1":1}}],["desejado",{"2":{"34":1}}],["deseja",{"2":{"1":1,"41":1,"69":2}}],["de",{"0":{"3":1,"35":1,"41":1,"45":1,"65":1,"82":1,"96":1,"97":1,"100":1,"101":1,"102":1},"1":{"83":1,"84":1,"85":1},"2":{"0":1,"1":6,"2":5,"3":4,"4":10,"5":3,"6":1,"7":2,"8":5,"9":5,"10":2,"11":7,"13":2,"14":10,"17":7,"18":3,"19":3,"20":8,"21":5,"22":2,"27":8,"29":1,"31":1,"33":2,"35":8,"36":1,"37":1,"38":1,"39":6,"40":4,"41":3,"42":2,"43":1,"46":2,"47":6,"49":2,"50":28,"52":2,"54":2,"55":1,"56":2,"57":1,"64":5,"65":2,"69":1,"72":1,"73":3,"74":4,"75":4,"78":1,"80":1,"82":3,"83":4,"84":4,"85":8,"87":22,"88":4,"91":1,"92":2,"94":1,"95":1,"96":8,"97":4,"100":4,"101":5,"102":3}}],["overview",{"2":{"87":2}}],["oasdf",{"2":{"74":1}}],["own",{"2":{"70":1}}],["ocorre",{"2":{"32":1,"57":1}}],["ohmyzsh",{"2":{"27":4}}],["oh",{"2":{"27":5,"75":1}}],["opção",{"2":{"92":1,"100":1}}],["opções",{"2":{"35":1,"57":1}}],["operacional",{"2":{"87":4}}],["operacionais",{"2":{"27":1,"33":1}}],["opcionais",{"2":{"87":2}}],["opcional",{"0":{"86":1},"1":{"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1},"2":{"85":1,"87":1}}],["opt",{"2":{"27":9,"41":1,"50":3}}],["optionally",{"2":{"37":3}}],["optional",{"2":{"4":2,"37":1}}],["one",{"2":{"37":1}}],["on",{"2":{"23":1,"37":4,"49":1}}],["onde",{"2":{"2":1,"29":1,"41":1,"82":3,"96":1}}],["obtenha",{"2":{"90":1}}],["obter",{"2":{"10":1,"49":1}}],["obrigatória",{"2":{"87":1}}],["obrigatórios",{"0":{"81":1}}],["obrigado",{"2":{"13":1}}],["observe",{"2":{"68":1,"83":1,"87":1}}],["observação",{"2":{"68":1}}],["observar",{"2":{"32":1}}],["objetos",{"2":{"10":2}}],["osx",{"2":{"83":1,"98":1,"100":1}}],["os",{"2":{"1":1,"2":2,"3":1,"5":1,"7":1,"8":2,"10":2,"11":1,"13":1,"15":1,"17":1,"18":1,"23":1,"27":1,"33":1,"37":2,"38":1,"39":1,"40":2,"41":2,"47":2,"48":1,"50":18,"52":1,"64":1,"68":2,"80":1,"82":1,"84":1,"85":1,"87":2,"88":3,"89":1,"94":1,"95":1,"96":4,"98":2,"100":1}}],["origem",{"2":{"94":1}}],["originado",{"2":{"96":2}}],["origin",{"2":{"55":1}}],["ordem",{"2":{"83":2}}],["org",{"2":{"26":1}}],["organisation",{"2":{"12":1}}],["or",{"2":{"1":1,"7":1,"26":1,"37":6,"65":1,"70":2}}],["o",{"0":{"21":1,"30":1,"80":1,"102":1},"2":{"1":4,"2":5,"3":3,"4":8,"7":1,"8":8,"9":2,"10":1,"11":4,"12":1,"13":1,"14":5,"15":3,"17":3,"18":3,"19":4,"20":6,"21":4,"22":3,"27":39,"28":1,"29":1,"31":2,"32":2,"33":3,"35":2,"36":2,"37":1,"39":7,"40":9,"41":8,"44":1,"47":1,"48":1,"50":29,"52":1,"55":1,"56":2,"57":2,"59":2,"64":3,"65":2,"68":12,"69":2,"73":5,"74":3,"76":1,"80":1,"81":1,"82":11,"83":1,"84":13,"85":8,"87":10,"88":3,"89":1,"90":5,"93":6,"94":4,"95":3,"96":7,"97":3,"98":8,"99":1,"100":3,"101":2,"102":1}}],["output",{"2":{"37":1,"90":1}}],["outra",{"2":{"80":1}}],["outras",{"2":{"21":1}}],["outro",{"2":{"41":1,"100":1}}],["outros",{"2":{"35":1,"36":1,"39":1,"40":1,"85":2,"87":2}}],["ou",{"2":{"1":2,"2":1,"5":1,"7":1,"8":1,"19":1,"27":10,"31":1,"32":1,"36":1,"39":3,"40":2,"41":1,"49":1,"50":2,"52":1,"57":1,"59":1,"64":1,"65":1,"68":1,"69":1,"75":1,"80":3,"81":1,"82":4,"83":1,"84":3,"87":4,"96":2,"98":1}}],["our",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["official",{"0":{"25":1},"2":{"26":1}}],["oficialmente",{"2":{"72":1}}],["oficial",{"0":{"102":1},"2":{"10":1,"11":1,"72":1,"102":1}}],["oferecer",{"2":{"8":1}}],["of",{"2":{"0":1,"6":1,"12":2,"13":1,"14":1,"22":1,"23":1,"37":10,"38":1,"42":1,"51":1,"58":1,"70":1,"79":1}}],["só",{"2":{"84":1,"92":1}}],["src",{"2":{"39":1}}],["same",{"2":{"96":5}}],["sair",{"2":{"84":2,"85":2}}],["sabedoria",{"2":{"97":1}}],["sabe",{"2":{"51":1}}],["save",{"2":{"27":3}}],["saídas",{"2":{"3":1}}],["saída",{"2":{"3":1,"83":1,"84":1,"85":1,"87":5,"88":1}}],["specified",{"2":{"37":1}}],["specific",{"2":{"2":1,"37":2}}],["specifying",{"2":{"37":1}}],["spack",{"2":{"23":2}}],["ssg",{"2":{"8":1}}],["stdout",{"2":{"87":1}}],["status",{"2":{"84":2,"85":2}}],["static",{"2":{"8":1}}],["stable",{"2":{"37":5,"49":1}}],["stratus3d",{"2":{"77":1}}],["string",{"2":{"27":2,"37":1,"50":2,"83":1,"88":1,"90":1,"92":1}}],["str",{"2":{"27":2}}],["steps",{"2":{"23":1}}],["style",{"2":{"4":1}}],["script",{"2":{"21":1,"27":2,"68":2,"82":4,"84":8,"85":7,"87":9,"88":1,"93":1,"94":1,"95":1,"100":3}}],["scripts",{"0":{"81":1,"86":1,"87":1},"1":{"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1},"2":{"1":2,"2":3,"8":1,"17":1,"27":1,"68":1,"80":2,"82":1,"87":4,"96":2}}],["scope",{"2":{"4":1}}],["sort",{"2":{"83":1}}],["sourcing",{"2":{"75":1}}],["source",{"2":{"27":3,"68":2,"94":1}}],["sobre",{"2":{"71":1,"74":1,"87":1}}],["so",{"2":{"29":1,"46":1}}],["solução",{"2":{"21":1}}],["solicitação",{"2":{"4":3}}],["somente",{"2":{"8":1,"31":1,"39":1}}],["some",{"2":{"0":1,"3":3,"4":3,"6":1,"12":1,"13":1,"14":1,"22":1,"23":1,"37":1,"38":1,"42":1,"51":1,"58":1,"70":1,"79":1}}],["s",{"2":{"3":2,"7":1,"23":1,"27":5,"101":1}}],["sincronização",{"2":{"57":2}}],["sincronizado",{"2":{"57":1}}],["sincronizar",{"0":{"57":1}}],["sinalizadores",{"2":{"87":1}}],["sinalizador",{"2":{"3":1}}],["siga",{"2":{"27":2,"36":1,"49":1,"50":4,"102":1}}],["si",{"2":{"26":1,"68":1,"98":1}}],["sistemas",{"2":{"27":1,"33":1}}],["sistema",{"0":{"65":1},"2":{"17":1,"20":1,"21":2,"27":1,"33":2,"39":1,"65":2,"68":2,"87":4}}],["sim",{"2":{"21":1,"87":1}}],["similar",{"2":{"17":1}}],["simplicidade",{"2":{"21":1}}],["simplificar",{"2":{"10":1,"14":1}}],["simplificando",{"2":{"3":1}}],["simplesmente",{"2":{"36":1,"93":1}}],["simples",{"2":{"14":1,"68":1}}],["sidebar",{"2":{"10":2,"11":5}}],["sites",{"2":{"7":1}}],["site",{"0":{"6":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1},"2":{"6":1,"8":2,"10":2,"83":1}}],["são",{"2":{"2":1,"4":1,"5":1,"7":1,"11":1,"17":1,"29":1,"33":2,"34":1,"47":1,"48":1,"51":1,"68":1,"80":2,"85":1,"87":2,"96":2,"98":2}}],["sucedido",{"2":{"84":1}}],["sucedidas",{"2":{"85":1}}],["sucedida",{"2":{"40":1,"85":1}}],["suficiente",{"2":{"83":1}}],["sujeiras",{"2":{"56":1}}],["subcomando",{"2":{"96":1}}],["subsistema",{"2":{"73":1}}],["subsystem",{"2":{"72":1}}],["substituem",{"2":{"96":1}}],["substitua",{"2":{"90":1}}],["substituto",{"2":{"8":1}}],["substituir",{"2":{"8":1,"41":1}}],["subdiretórios",{"2":{"39":1}}],["suponha",{"2":{"85":1,"96":1}}],["suportado",{"2":{"64":1,"72":1,"83":1}}],["suportados",{"2":{"11":1}}],["suportar",{"2":{"51":1,"84":1}}],["suportam",{"2":{"39":1,"40":1}}],["suporta",{"2":{"35":2,"59":1}}],["suporte",{"0":{"72":1,"73":1},"2":{"1":1,"8":1,"11":1,"21":1,"72":1,"73":1,"80":1,"84":1}}],["supporting",{"2":{"70":1}}],["supported",{"0":{"26":1}}],["sudo",{"2":{"23":1}}],["suspenso",{"2":{"11":1}}],["suas",{"2":{"1":1,"2":1,"49":1,"69":1,"96":1,"100":1}}],["sua",{"2":{"1":1,"10":1,"11":1,"12":1,"20":1,"27":1,"32":1,"52":1,"64":1,"83":1,"87":2}}],["system",{"2":{"1":1,"23":1,"39":2,"65":4}}],["show",{"2":{"37":3}}],["short",{"2":{"12":1}}],["shortname",{"2":{"12":1,"54":1}}],["sh",{"2":{"27":17,"41":1,"50":17,"68":3,"75":1,"100":1}}],["shim",{"0":{"48":1},"2":{"15":1,"37":3,"44":1,"47":1,"48":4,"68":2,"74":1,"90":2,"97":1}}],["shims",{"0":{"68":1,"69":1,"75":1},"1":{"69":1},"2":{"2":1,"14":1,"15":1,"17":1,"37":1,"47":2,"48":1,"68":4,"69":1,"74":3,"85":1,"88":2,"97":1}}],["shfmt",{"2":{"1":4,"2":1}}],["shellcmd=",{"2":{"101":1}}],["shellcheck",{"2":{"1":3,"2":2}}],["shell$",{"2":{"96":1}}],["shellfoo",{"2":{"96":1}}],["shellusage",{"2":{"90":1}}],["shelluse",{"2":{"50":3}}],["shellbin",{"2":{"88":1}}],["shellbrew",{"2":{"50":5}}],["shell1",{"2":{"83":1}}],["shellif",{"2":{"50":2}}],["shellpacman",{"2":{"50":4}}],["shellrm",{"2":{"50":25}}],["shell➜",{"2":{"48":2}}],["shellexport",{"2":{"27":2}}],["shellecho",{"2":{"27":8}}],["shellmkdir",{"2":{"27":4}}],["shellgit",{"2":{"25":1}}],["shellsource",{"2":{"27":2,"50":3}}],["shells",{"2":{"18":1,"27":1}}],["shelldocs",{"2":{"11":1}}],["shellnpm",{"2":{"7":1,"8":2}}],["shellasdf",{"2":{"1":2,"7":2,"30":1,"31":1,"33":1,"34":1,"44":1,"45":1,"46":1,"47":1,"48":1,"52":2,"53":2,"54":1,"55":2,"59":1,"60":2,"61":2,"62":2,"63":2,"64":2,"65":1,"66":1,"67":1,"98":2}}],["shell",{"0":{"27":1,"75":1},"2":{"1":3,"2":1,"3":1,"7":1,"15":1,"17":1,"21":2,"22":1,"27":20,"37":3,"46":1,"50":9,"64":4,"65":2,"68":2,"75":1,"92":1}}],["secure",{"2":{"101":1}}],["security",{"2":{"70":1}}],["secrets",{"2":{"99":1}}],["sendo",{"2":{"55":1,"83":1,"87":1,"96":1,"97":1}}],["separando",{"2":{"39":1}}],["separada",{"2":{"88":1}}],["separadas",{"2":{"11":1,"83":1}}],["separados",{"2":{"10":1,"92":1}}],["sessão",{"2":{"27":1}}],["sejam",{"2":{"69":1}}],["seja",{"2":{"27":1,"57":1,"87":1,"95":1}}],["setter",{"2":{"92":1}}],["setup",{"0":{"36":1}}],["set",{"2":{"27":3,"37":7,"50":3,"65":1,"66":3}}],["seção",{"2":{"27":1,"33":1,"41":1,"64":1}}],["search",{"2":{"12":1}}],["selecione",{"2":{"64":1,"65":1}}],["selecionar",{"0":{"64":1},"2":{"64":2,"65":2}}],["selectlanguagename",{"2":{"11":2}}],["seleção",{"2":{"11":1,"64":1}}],["seguida",{"2":{"101":1}}],["seguindo",{"2":{"27":2}}],["seguinte",{"2":{"27":12,"35":1,"39":1,"57":1,"64":1,"83":1,"98":1,"101":1}}],["seguintes",{"2":{"2":1,"27":3,"82":1}}],["seguir",{"2":{"4":1}}],["segue",{"2":{"4":1}}],["seus",{"2":{"5":2,"19":1,"36":1,"39":1,"50":6,"96":1,"99":1,"101":1,"102":1}}],["seu",{"0":{"27":1},"2":{"2":3,"4":1,"13":1,"14":1,"15":1,"17":1,"21":2,"22":1,"27":21,"32":1,"34":1,"35":1,"36":1,"39":1,"40":1,"50":24,"55":1,"57":1,"64":1,"69":1,"75":4,"85":1,"87":1,"92":1,"93":1,"96":2,"97":1,"98":3,"101":3,"102":2}}],["semântica",{"2":{"40":1}}],["semelhantes",{"2":{"36":1}}],["sempre",{"2":{"12":1,"21":1,"39":1,"40":1,"87":1}}],["semantic",{"2":{"4":1}}],["semver",{"2":{"4":4}}],["sem",{"2":{"2":1,"39":2,"84":1}}],["seria",{"2":{"83":1,"88":1,"98":1}}],["serão",{"2":{"39":1,"87":1,"96":1}}],["serem",{"2":{"32":2,"82":1}}],["será",{"2":{"21":1,"27":1,"34":1,"39":1,"40":1,"82":3,"84":1,"96":1,"98":1}}],["servidor",{"2":{"8":1}}],["servidores",{"2":{"5":1}}],["ser",{"2":{"1":1,"3":1,"14":1,"15":1,"21":2,"27":14,"39":2,"40":1,"41":4,"56":1,"57":2,"68":3,"69":1,"73":1,"75":1,"82":2,"83":2,"84":2,"85":1,"87":5,"88":1,"93":1,"94":1,"95":1,"97":2,"98":1}}],["se",{"2":{"1":1,"2":1,"4":1,"27":7,"32":1,"36":1,"39":1,"40":5,"41":2,"49":1,"50":1,"55":1,"57":1,"59":1,"64":2,"69":1,"75":2,"82":1,"83":4,"84":5,"85":7,"87":1,"88":1,"92":1,"93":1,"94":1,"96":4,"97":2,"98":3,"100":1,"101":2}}],["see",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["têm",{"2":{"74":1}}],["tudo",{"2":{"50":1}}],["txtmanage",{"2":{"37":1}}],["tão",{"2":{"31":1}}],["três",{"2":{"36":1}}],["trim",{"2":{"27":2}}],["travis",{"2":{"100":1,"101":1}}],["travisci",{"0":{"100":1}}],["trabalho",{"2":{"42":1,"73":1}}],["trabalhar",{"2":{"14":1}}],["translate",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["taxa",{"0":{"101":1},"2":{"101":1}}],["tac",{"2":{"83":1}}],["tais",{"2":{"51":1}}],["talvez",{"2":{"50":1}}],["tanto",{"2":{"35":1,"38":1}}],["tag",{"2":{"31":1,"39":1,"59":1,"82":1,"98":1}}],["também",{"2":{"22":1,"39":1,"59":1,"68":1,"87":1,"94":1,"95":1,"97":1,"100":1}}],["tap",{"2":{"3":1}}],["type",{"2":{"4":1,"82":2,"87":1}}],["types",{"2":{"4":1}}],["type>",{"2":{"4":1}}],["títulos",{"2":{"9":1,"87":1}}],["título",{"2":{"4":3,"9":1,"11":1,"87":1}}],["t",{"2":{"3":2}}],["title",{"2":{"87":1}}],["time",{"2":{"14":1}}],["timgluz",{"2":{"1":1}}],["tiverem",{"2":{"8":1,"96":1}}],["tipo",{"2":{"9":1}}],["tip",{"2":{"2":1,"4":1}}],["tendo",{"2":{"96":1}}],["tenham",{"2":{"27":1}}],["tenha",{"2":{"27":2,"85":1,"96":1}}],["tela",{"2":{"83":1}}],["texto",{"2":{"37":1,"60":1,"61":1,"62":1,"63":1,"87":2}}],["terão",{"2":{"82":1}}],["ter",{"2":{"27":2,"75":1,"102":1}}],["terminais",{"2":{"85":1}}],["terminal",{"2":{"3":1,"27":1}}],["term",{"2":{"12":1,"70":1}}],["temos",{"2":{"31":1,"72":1}}],["tem",{"2":{"11":1,"49":1,"94":1,"95":1,"100":1}}],["tema",{"2":{"10":1}}],["tempos",{"2":{"76":1}}],["tempo",{"2":{"7":1}}],["temporariamente",{"2":{"2":1}}],["testando",{"0":{"98":1},"1":{"99":1,"100":1}}],["testar",{"2":{"2":2,"98":3,"99":1}}],["teste",{"0":{"3":1},"2":{"3":1,"98":1,"100":1}}],["testes",{"2":{"1":1,"2":2,"3":2,"64":1,"73":1,"101":1}}],["tests",{"2":{"2":1,"3":3}}],["test",{"2":{"2":4,"3":3,"4":1,"64":1,"98":4,"99":2,"100":3}}],["testing",{"2":{"1":1}}],["those",{"2":{"70":1}}],["that",{"2":{"37":2}}],["then",{"2":{"101":1}}],["their",{"2":{"70":1}}],["they",{"2":{"37":1,"70":1}}],["these",{"2":{"23":1,"70":1}}],["themeconfig",{"2":{"11":1}}],["the",{"2":{"0":3,"4":1,"6":3,"12":3,"13":3,"14":3,"22":3,"26":1,"37":31,"38":3,"42":3,"51":3,"58":3,"70":1,"79":3}}],["this",{"2":{"0":2,"6":2,"12":2,"13":2,"14":2,"22":2,"37":2,"38":2,"42":2,"51":2,"58":2,"79":2}}],["token",{"2":{"99":2,"101":7}}],["totalmente",{"2":{"85":1}}],["tosse",{"2":{"76":1}}],["toda",{"2":{"54":1}}],["todas",{"0":{"62":1},"2":{"14":2,"39":1,"40":1,"56":1,"81":1,"96":1}}],["todos",{"0":{"54":1},"2":{"14":1,"36":1,"37":1,"50":14,"82":1,"84":1,"87":1}}],["topic",{"2":{"12":1}}],["torna",{"2":{"4":1,"97":1}}],["tools",{"2":{"23":1,"70":1,"88":2}}],["tool",{"0":{"39":1},"2":{"1":1,"7":1,"14":1,"15":1,"22":1,"32":1,"33":2,"34":2,"37":4,"38":1,"39":9,"41":3,"50":14,"64":5,"66":3,"68":1,"98":1,"99":1}}],["to",{"2":{"0":1,"6":1,"12":2,"13":1,"14":1,"22":1,"23":1,"27":1,"37":9,"38":1,"42":1,"51":1,"58":1,"70":2,"79":1}}],["h",{"2":{"101":1}}],["há",{"0":{"80":1}}],["haxe",{"2":{"96":3}}],["habilitaram",{"2":{"92":1}}],["hashnuke",{"2":{"76":1,"77":1}}],["halcyon",{"2":{"53":1}}],["hospedados",{"2":{"99":1}}],["host",{"2":{"73":1}}],["houver",{"2":{"57":1,"75":1,"83":1,"97":1}}],["home",{"2":{"27":2,"40":1,"50":1}}],["homebrew",{"0":{"19":1},"2":{"19":2,"23":1,"26":1,"27":12,"49":1,"50":7}}],["hrs",{"2":{"40":1}}],["head",{"2":{"37":1,"49":2}}],["here",{"2":{"23":1,"70":2}}],["helper",{"2":{"26":1}}],["help",{"0":{"87":1},"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"36":1,"37":3,"38":1,"42":1,"51":1,"58":1,"79":1,"87":5,"96":3,"98":1}}],["html",{"2":{"8":1}}],["https",{"2":{"1":5,"7":3,"25":1,"26":1,"30":1,"37":2,"52":1,"53":2,"98":1,"100":1,"102":1}}],["highly",{"2":{"26":1}}],["histórico",{"2":{"4":1}}],["hi",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["wsl",{"2":{"73":1}}],["wsl2",{"0":{"73":1},"2":{"73":3}}],["wsl1",{"0":{"72":1},"2":{"72":2}}],["which",{"2":{"37":1,"68":2}}],["where",{"2":{"37":1,"68":2}}],["warning",{"2":{"32":1}}],["windows",{"2":{"72":1,"73":2}}],["with",{"2":{"4":1,"27":1,"37":3,"65":1,"99":1}}],["will",{"2":{"3":2,"4":3}}],["would",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["website",{"2":{"4":2}}],["we",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"26":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["afaik",{"2":{"97":1}}],["ação",{"2":{"94":1,"95":1,"99":1}}],["ações",{"2":{"13":1,"29":1,"73":1}}],["agir",{"2":{"82":1}}],["agora",{"2":{"31":1,"36":1,"96":1}}],["aqueles",{"2":{"74":1}}],["aqui",{"2":{"1":1,"71":1,"100":1}}],["aessado",{"2":{"68":1}}],["absolutamente",{"2":{"97":1}}],["abreviados",{"0":{"54":1}}],["abreviado",{"0":{"57":1},"2":{"52":2,"57":1}}],["abrange",{"2":{"38":1}}],["abrir",{"2":{"27":1}}],["abaixo",{"2":{"12":1,"27":3,"39":1,"87":1}}],["ainda",{"2":{"27":2,"36":1,"47":1,"93":1}}],["aviso",{"2":{"27":1}}],["armazena",{"2":{"41":1}}],["are",{"2":{"37":1,"70":2}}],["argumento",{"2":{"93":1}}],["argumentos",{"2":{"39":2,"98":2}}],["args",{"2":{"37":1,"44":1}}],["arg",{"2":{"27":6,"50":6}}],["archlinux",{"2":{"26":1}}],["arquivos",{"0":{"35":1},"2":{"8":1,"10":1,"11":2,"14":1,"17":1,"35":2,"38":1,"40":1,"41":2,"50":14,"84":1,"85":1,"88":1,"92":2}}],["arquivo",{"2":{"3":1,"10":1,"14":2,"15":1,"22":1,"32":1,"34":1,"35":1,"39":6,"40":3,"41":2,"64":2,"68":1,"75":1,"84":1,"85":1,"93":3,"96":1,"97":3,"100":1}}],["apareça",{"2":{"83":1}}],["apagar",{"2":{"56":1}}],["apontar",{"2":{"82":1}}],["apenas",{"2":{"55":1,"73":1,"84":2,"85":1,"87":2,"96":2,"97":3,"98":1,"101":1}}],["api",{"0":{"101":1},"2":{"51":1,"99":1,"101":4}}],["append",{"2":{"27":4}}],["apt",{"2":{"23":1,"29":1,"87":1}}],["aptitude",{"2":{"23":1}}],["após",{"2":{"15":1,"29":1,"40":1}}],["aplica",{"2":{"92":1}}],["aplicativos",{"2":{"5":1}}],["aplicado",{"2":{"4":1}}],["ajudar",{"2":{"68":1}}],["ajuda",{"2":{"12":1,"68":1,"87":4}}],["aos",{"2":{"82":1}}],["ao",{"0":{"27":1},"2":{"9":1,"18":1,"19":1,"22":1,"27":32,"32":2,"35":1,"40":1,"46":1,"59":1,"68":1,"69":1,"73":1,"75":1,"80":1,"82":1,"87":4,"88":1,"94":2,"95":1,"96":1,"100":1,"101":1,"102":1}}],["amostra",{"2":{"100":1}}],["ambientes",{"2":{"20":1}}],["ambiente",{"0":{"41":1,"45":1,"82":1},"1":{"83":1,"84":1,"85":1},"2":{"14":1,"18":2,"38":1,"64":2,"68":2,"69":1,"80":1,"82":2,"84":1,"85":1,"87":1,"98":1,"101":1}}],["amannn",{"2":{"4":1}}],["ampliado",{"2":{"14":1}}],["amp",{"0":{"6":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1},"2":{"3":1,"23":1,"26":4,"27":23,"50":14}}],["acessá",{"2":{"101":1}}],["acesso",{"2":{"82":1,"94":1,"95":1,"101":2}}],["aceleram",{"2":{"2":1}}],["acabei",{"2":{"74":1}}],["achar",{"2":{"50":1}}],["acustomar",{"2":{"36":1}}],["acordo",{"2":{"27":1,"100":1}}],["acompanhar",{"2":{"22":1}}],["acima",{"2":{"11":1,"41":3}}],["actions",{"0":{"13":1},"2":{"99":2}}],["action",{"0":{"99":1},"2":{"4":2}}],["authorization",{"2":{"101":1}}],["autorização",{"2":{"101":1}}],["autores",{"2":{"96":1}}],["autoload",{"2":{"27":1,"50":1}}],["auto",{"2":{"27":15}}],["automatically",{"2":{"23":1,"99":1}}],["automaticamente",{"2":{"4":1,"27":7,"69":1,"74":1}}],["automatizado",{"2":{"9":1}}],["automatizada",{"2":{"4":1}}],["automated",{"2":{"1":1}}],["auxiliar",{"2":{"46":1,"68":1}}],["aur",{"2":{"26":2,"27":1,"41":1,"49":1}}],["aumenta",{"2":{"18":1}}],["aumentar",{"2":{"4":1}}],["além",{"2":{"96":1,"97":1}}],["altamente",{"2":{"98":1}}],["alta",{"2":{"76":1}}],["alternativa",{"2":{"64":1,"83":1}}],["alterações",{"2":{"2":2,"9":1}}],["always",{"2":{"40":1}}],["algo",{"2":{"20":1,"83":1,"98":1,"101":2}}],["alguma",{"2":{"21":1,"50":1}}],["algumas",{"2":{"5":1,"29":2,"47":1,"71":1}}],["algum",{"2":{"15":1,"41":1,"69":1,"94":1}}],["alguns",{"2":{"10":1,"12":1,"29":1,"33":1,"72":1,"80":1}}],["alpine",{"2":{"5":1}}],["all",{"0":{"37":1,"83":1},"2":{"2":1,"31":2,"37":9,"40":1,"54":1,"55":1,"57":1,"62":4,"80":1,"81":1,"82":1,"83":1,"101":2}}],["analisar",{"2":{"93":1}}],["analisador",{"2":{"1":1}}],["an",{"2":{"37":2}}],["anterior",{"2":{"85":1}}],["antes",{"2":{"2":2,"3":1,"8":1,"41":1,"95":1}}],["antiga",{"2":{"14":1}}],["anexar",{"2":{"2":1}}],["análise",{"2":{"1":1}}],["and",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"27":1,"37":10,"38":1,"42":1,"51":1,"58":1,"79":1}}],["a",{"0":{"66":1},"2":{"1":2,"2":2,"3":5,"4":8,"7":1,"8":1,"10":6,"11":1,"12":3,"14":2,"17":1,"18":2,"19":2,"20":1,"21":3,"22":2,"23":1,"27":17,"29":1,"31":3,"32":4,"33":1,"35":3,"36":1,"37":16,"38":1,"39":4,"40":3,"41":1,"42":1,"44":1,"47":4,"51":1,"54":1,"57":1,"60":1,"64":6,"65":1,"68":3,"70":2,"72":1,"73":1,"74":3,"80":1,"81":2,"82":1,"83":3,"84":1,"85":7,"87":7,"88":3,"90":1,"92":2,"93":1,"96":2,"98":3,"100":1}}],["adaptar",{"2":{"87":2}}],["adaptados",{"2":{"87":1}}],["adaptadas",{"2":{"87":1}}],["adição",{"2":{"27":3}}],["adicionado",{"2":{"94":1}}],["adicionais",{"2":{"82":2,"92":1}}],["adicionando",{"0":{"27":1}}],["adicionar",{"0":{"52":1},"2":{"22":1,"27":2,"72":1,"102":1}}],["adicione",{"2":{"1":1,"2":1,"7":1,"27":23,"35":1,"40":1,"52":1,"101":2}}],["adeque",{"2":{"27":1}}],["adequadamente",{"2":{"27":1}}],["adequada",{"2":{"21":1,"27":1}}],["add",{"0":{"94":1},"2":{"1":3,"7":1,"30":1,"37":3,"40":1,"52":4,"57":1,"94":4,"102":2}}],["added",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"37":1,"38":1,"42":1,"51":1,"58":1,"79":1}}],["aspectos",{"2":{"72":1}}],["assumirá",{"2":{"84":1}}],["associado",{"2":{"12":1}}],["assim",{"2":{"11":1,"33":1,"34":1,"39":1,"40":1}}],["as",{"0":{"23":1,"62":1},"2":{"1":3,"7":2,"10":1,"11":1,"14":2,"20":1,"22":1,"27":8,"29":1,"37":1,"38":1,"39":4,"40":2,"46":1,"49":1,"50":15,"56":1,"57":1,"61":1,"62":1,"70":1,"73":1,"81":1,"83":5,"87":4,"96":6,"102":1}}],["asdfrc",{"0":{"40":1},"2":{"35":1,"38":1,"40":1,"41":1,"50":14,"57":1,"92":1}}],["asdf~",{"2":{"27":6,"50":6}}],["asdf",{"0":{"0":1,"21":1,"24":1,"69":1,"96":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"25":1,"26":1},"2":{"0":1,"1":13,"2":1,"4":1,"5":3,"7":8,"8":1,"9":1,"12":7,"13":1,"14":2,"15":2,"17":2,"18":3,"19":1,"20":2,"21":3,"22":3,"23":1,"25":3,"26":3,"27":109,"28":1,"29":1,"30":2,"31":3,"32":3,"33":2,"35":3,"36":5,"37":43,"38":1,"39":6,"40":8,"41":14,"42":1,"46":1,"47":1,"48":3,"49":6,"50":118,"51":1,"52":3,"53":5,"55":1,"56":1,"57":3,"59":1,"60":2,"61":2,"62":2,"63":2,"64":8,"65":2,"66":3,"67":1,"68":12,"69":2,"70":7,"71":1,"72":1,"74":3,"75":2,"82":7,"84":5,"85":9,"87":6,"88":2,"90":2,"93":2,"94":7,"95":6,"96":11,"97":2,"98":6,"99":3,"100":7,"102":5}}],["atalhos",{"2":{"68":1}}],["atalho",{"2":{"56":1}}],["ativar",{"2":{"35":1}}],["ativado",{"2":{"8":1}}],["até",{"2":{"32":1,"76":1,"96":1}}],["atualmente",{"2":{"73":1}}],["atualize",{"2":{"40":1}}],["atualizações",{"2":{"55":1}}],["atualização",{"2":{"40":1,"49":1,"55":1}}],["atualiza",{"2":{"39":1}}],["atualizar",{"0":{"49":1,"55":1},"2":{"27":1,"40":1,"55":1}}],["atualizará",{"2":{"27":6,"40":1}}],["atualizado",{"2":{"27":3,"57":1}}],["atual",{"0":{"64":1,"66":1},"2":{"18":1,"31":1,"32":2,"34":1,"44":1,"47":1,"64":2,"65":1,"68":1,"73":1,"87":2}}],["através",{"2":{"14":1,"20":2,"21":1,"22":2,"27":16,"28":1,"31":1,"32":1,"33":1,"36":1,"41":1}}],["at",{"2":{"0":1,"6":1,"12":1,"13":1,"14":1,"22":1,"37":2,"38":1,"42":1,"51":1,"58":1,"79":1}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/@localSearchIndexroot.Cvu0aAJF.js b/assets/chunks/@localSearchIndexroot.Cvu0aAJF.js new file mode 100644 index 00000000..09cf6cc6 --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.Cvu0aAJF.js @@ -0,0 +1 @@ +const e='{"documentCount":149,"nextId":149,"documentIds":{"0":"/contribute/core.html#asdf","1":"/contribute/core.html#initial-setup","2":"/contribute/core.html#development","3":"/contribute/core.html#gitignore","4":"/contribute/core.html#git-blame-ignore-revs","5":"/contribute/core.html#bats-testing","6":"/contribute/core.html#bats-tips","7":"/contribute/core.html#pull-requests-releases-conventional-commits","8":"/contribute/core.html#docker-images","9":"/contribute/documentation.html#docs-site","10":"/contribute/documentation.html#initial-setup","11":"/contribute/documentation.html#development","12":"/contribute/documentation.html#pull-requests-releases-conventional-commits","13":"/contribute/documentation.html#vitepress","14":"/contribute/documentation.html#i18n","15":"/contribute/first-party-plugins.html#first-party-plugins","16":"/contribute/github-actions.html#github-actions","17":"/guide/getting-started.html#getting-started","18":"/guide/getting-started.html#_1-install-dependencies","19":"/guide/getting-started.html#_2-download-asdf","20":"/guide/getting-started.html#official-download","21":"/guide/getting-started.html#community-supported-download-methods","22":"/guide/getting-started.html#_3-install-asdf","23":"/guide/getting-started.html#core-installation-complete","24":"/guide/getting-started.html#_4-install-a-plugin","25":"/guide/getting-started.html#plugin-dependencies","26":"/guide/getting-started.html#install-the-plugin","27":"/guide/getting-started.html#_5-install-a-version","28":"/guide/getting-started.html#_6-set-a-version","29":"/guide/getting-started.html#global","30":"/guide/getting-started.html#local","31":"/guide/getting-started.html#using-existing-tool-version-files","32":"/guide/getting-started.html#guide-complete","33":"/guide/introduction.html#introduction","34":"/guide/introduction.html#how-it-works","35":"/guide/introduction.html#related-projects","36":"/guide/introduction.html#nvm-n-rbenv-etc","37":"/guide/introduction.html#direnv","38":"/guide/introduction.html#homebrew","39":"/guide/introduction.html#nixos","40":"/guide/introduction.html#why-use-asdf","41":"/guide/upgrading-from-v0-15-to-v0-16.html#upgrading-from-version-0-15-x-to-0-16-0","42":"/guide/upgrading-from-v0-15-to-v0-16.html#breaking-changes","43":"/guide/upgrading-from-v0-15-to-v0-16.html#download-is-now-a-required-callback-for-plugins","44":"/guide/upgrading-from-v0-15-to-v0-16.html#hyphenated-commands-have-been-removed","45":"/guide/upgrading-from-v0-15-to-v0-16.html#asdf-global-and-asdf-local-commands-have-been-removed","46":"/guide/upgrading-from-v0-15-to-v0-16.html#asdf-update-command-has-been-removed","47":"/guide/upgrading-from-v0-15-to-v0-16.html#asdf-shell-command-has-been-removed","48":"/guide/upgrading-from-v0-15-to-v0-16.html#asdf-current-has-changed","49":"/guide/upgrading-from-v0-15-to-v0-16.html#plugin-extension-commands-must-now-be-prefixed-with-cmd","50":"/guide/upgrading-from-v0-15-to-v0-16.html#extension-commands-have-been-redesigned","51":"/guide/upgrading-from-v0-15-to-v0-16.html#executables-shims-resolve-to-must-runnable-by-syscall-exec","52":"/guide/upgrading-from-v0-15-to-v0-16.html#custom-shim-templates-are-no-longer-supported","53":"/guide/upgrading-from-v0-15-to-v0-16.html#installation","54":"/guide/upgrading-from-v0-15-to-v0-16.html#upgrading-without-losing-data","55":"/guide/upgrading-from-v0-15-to-v0-16.html#_1-download-the-appropriate-asdf-binary-for-your-operating-system-architecture","56":"/guide/upgrading-from-v0-15-to-v0-16.html#_2-set-asdf-data-dir","57":"/guide/upgrading-from-v0-15-to-v0-16.html#_3-add-asdf-data-dir-shims-to-the-front-of-your-path","58":"/guide/upgrading-from-v0-15-to-v0-16.html#testing","59":"/manage/commands.html#all-commands","60":"/manage/configuration.html#configuration","61":"/manage/configuration.html#tool-versions","62":"/manage/configuration.html#asdfrc","63":"/manage/configuration.html#legacy-version-file","64":"/manage/configuration.html#use-release-candidates","65":"/manage/configuration.html#always-keep-download","66":"/manage/configuration.html#plugin-repository-last-check-duration","67":"/manage/configuration.html#disable-plugin-short-name-repository","68":"/manage/configuration.html#concurrency","69":"/manage/configuration.html#plugin-hooks","70":"/manage/configuration.html#environment-variables","71":"/manage/configuration.html#asdf-config-file","72":"/manage/configuration.html#asdf-default-tool-versions-filename","73":"/manage/configuration.html#asdf-dir","74":"/manage/configuration.html#asdf-data-dir","75":"/manage/configuration.html#asdf-concurrency","76":"/manage/configuration.html#asdf-force-prepend","77":"/manage/configuration.html#full-configuration-example","78":"/manage/configuration.html#internal-configuration","79":"/manage/core.html#core","80":"/manage/core.html#installation-setup","81":"/manage/core.html#exec","82":"/manage/core.html#env","83":"/manage/core.html#info","84":"/manage/core.html#reshim","85":"/manage/core.html#shim-versions","86":"/manage/core.html#update","87":"/manage/core.html#uninstall","88":"/manage/plugins.html#plugins","89":"/manage/plugins.html#add","90":"/manage/plugins.html#list-installed","91":"/manage/plugins.html#list-all-in-short-name-repository","92":"/manage/plugins.html#update","93":"/manage/plugins.html#remove","94":"/manage/plugins.html#syncing-the-asdf-short-name-repository","95":"/manage/versions.html#versions","96":"/manage/versions.html#install-version","97":"/manage/versions.html#install-latest-stable-version","98":"/manage/versions.html#list-installed-versions","99":"/manage/versions.html#list-all-available-versions","100":"/manage/versions.html#show-latest-stable-version","101":"/manage/versions.html#set-current-version","102":"/manage/versions.html#fallback-to-system-version","103":"/manage/versions.html#view-current-version","104":"/manage/versions.html#uninstall-version","105":"/manage/versions.html#shims","106":"/manage/versions.html#by-passing-asdf-shims","107":"/more/community-projects.html#community-projects","108":"/more/faq.html#faq","109":"/more/faq.html#wsl1-support","110":"/more/faq.html#wsl2-support","111":"/more/faq.html#newly-installed-executable-not-running","112":"/more/faq.html#shell-not-detecting-newly-installed-shims","113":"/more/thanks.html#thanks","114":"/more/thanks.html#credits","115":"/more/thanks.html#maintainers","116":"/more/thanks.html#contributors","117":"/plugins/create.html#create-a-plugin","118":"/plugins/create.html#quickstart","119":"/plugins/create.html#golden-rules-for-plugin-scripts","120":"/plugins/create.html#scripts-overview","121":"/plugins/create.html#environment-variables-overview","122":"/plugins/create.html#required-scripts","123":"/plugins/create.html#bin-list-all","124":"/plugins/create.html#bin-download","125":"/plugins/create.html#bin-install","126":"/plugins/create.html#optional-scripts","127":"/plugins/create.html#bin-latest-stable","128":"/plugins/create.html#bin-help-overview","129":"/plugins/create.html#bin-help-deps","130":"/plugins/create.html#bin-help-config","131":"/plugins/create.html#bin-help-links","132":"/plugins/create.html#bin-list-bin-paths","133":"/plugins/create.html#bin-exec-env","134":"/plugins/create.html#bin-exec-path","135":"/plugins/create.html#bin-uninstall","136":"/plugins/create.html#bin-list-legacy-filenames","137":"/plugins/create.html#bin-parse-legacy-file","138":"/plugins/create.html#bin-post-plugin-add","139":"/plugins/create.html#bin-post-plugin-update","140":"/plugins/create.html#bin-pre-plugin-remove","141":"/plugins/create.html#extension-commands-for-asdf-cli","142":"/plugins/create.html#custom-shim-templates","143":"/plugins/create.html#testing","144":"/plugins/create.html#github-action","145":"/plugins/create.html#travisci-config","146":"/plugins/create.html#api-rate-limiting","147":"/plugins/create.html#github-api-token","148":"/plugins/create.html#plugin-shortname-index"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,5],"1":[2,1,94],"2":[1,1,86],"3":[1,2,40],"4":[5,2,60],"5":[2,1,21],"6":[2,3,54],"7":[6,1,102],"8":[2,1,33],"9":[3,1,6],"10":[2,3,59],"11":[1,3,83],"12":[6,3,39],"13":[1,3,61],"14":[1,3,97],"15":[3,1,61],"16":[2,1,18],"17":[2,1,29],"18":[3,2,59],"19":[3,2,1],"20":[2,5,14],"21":[4,5,32],"22":[3,2,257],"23":[4,2,30],"24":[4,2,16],"25":[2,6,48],"26":[3,6,11],"27":[4,2,47],"28":[4,2,48],"29":[1,6,54],"30":[1,6,36],"31":[5,6,51],"32":[3,2,51],"33":[1,1,75],"34":[3,1,48],"35":[2,1,1],"36":[4,3,55],"37":[1,3,38],"38":[1,3,41],"39":[1,3,60],"40":[4,1,57],"41":[8,1,40],"42":[2,8,1],"43":[8,10,22],"44":[5,10,31],"45":[8,10,61],"46":[6,10,44],"47":[6,10,48],"48":[4,10,55],"49":[9,10,26],"50":[5,10,103],"51":[9,10,82],"52":[7,10,63],"53":[1,8,75],"54":[4,9,23],"55":[12,12,32],"56":[5,12,36],"57":[12,12,29],"58":[1,9,45],"59":[2,1,147],"60":[1,1,21],"61":[3,1,125],"62":[2,1,55],"63":[3,2,35],"64":[3,2,21],"65":[3,2,23],"66":[5,2,80],"67":[5,2,75],"68":[1,2,41],"69":[2,2,73],"70":[2,1,44],"71":[3,3,31],"72":[5,3,38],"73":[2,3,33],"74":[3,3,41],"75":[2,3,28],"76":[3,3,46],"77":[3,1,84],"78":[2,1,51],"79":[1,1,14],"80":[3,1,7],"81":[1,1,13],"82":[1,1,6],"83":[1,1,22],"84":[1,1,62],"85":[2,1,45],"86":[1,1,53],"87":[1,1,141],"88":[1,1,25],"89":[1,1,39],"90":[2,1,14],"91":[6,1,16],"92":[1,1,40],"93":[1,1,30],"94":[6,1,70],"95":[1,1,1],"96":[2,1,44],"97":[4,1,19],"98":[3,1,19],"99":[4,1,20],"100":[4,1,18],"101":[3,1,79],"102":[4,1,38],"103":[3,1,20],"104":[2,1,10],"105":[1,1,112],"106":[4,2,36],"107":[2,1,49],"108":[1,1,8],"109":[3,1,25],"110":[3,1,54],"111":[6,1,50],"112":[7,1,47],"113":[1,1,10],"114":[1,1,16],"115":[1,1,6],"116":[1,1,9],"117":[3,1,35],"118":[1,3,49],"119":[5,4,30],"120":[2,3,99],"121":[3,3,87],"122":[2,3,1],"123":[3,5,127],"124":[2,5,125],"125":[2,5,148],"126":[2,3,1],"127":[3,5,137],"128":[3,5,110],"129":[3,5,93],"130":[3,5,100],"131":[3,5,102],"132":[3,5,94],"133":[3,5,73],"134":[3,5,105],"135":[2,5,73],"136":[4,5,84],"137":[4,5,104],"138":[4,5,56],"139":[4,5,54],"140":[4,5,46],"141":[5,3,122],"142":[3,3,64],"143":[1,3,88],"144":[2,4,51],"145":[2,4,54],"146":[3,3,56],"147":[3,6,34],"148":[3,3,47]},"averageFieldLength":[3.0671140939597317,3.2684563758389262,51.82550335570468],"storedFields":{"0":{"title":"asdf","titles":[]},"1":{"title":"Initial Setup","titles":["asdf"]},"2":{"title":"Development","titles":["asdf"]},"3":{"title":"Gitignore","titles":["asdf","Development"]},"4":{"title":".git-blame-ignore-revs","titles":["asdf","Development"]},"5":{"title":"Bats Testing","titles":["asdf"]},"6":{"title":"Bats Tips","titles":["asdf","Bats Testing"]},"7":{"title":"Pull Requests, Releases & Conventional Commits","titles":["asdf"]},"8":{"title":"Docker Images","titles":["asdf"]},"9":{"title":"Docs & Site","titles":[]},"10":{"title":"Initial Setup","titles":["Docs & Site"]},"11":{"title":"Development","titles":["Docs & Site"]},"12":{"title":"Pull Requests, Releases & Conventional Commits","titles":["Docs & Site"]},"13":{"title":"Vitepress","titles":["Docs & Site"]},"14":{"title":"I18n","titles":["Docs & Site"]},"15":{"title":"First-Party Plugins","titles":[]},"16":{"title":"GitHub Actions","titles":[]},"17":{"title":"Getting Started","titles":[]},"18":{"title":"1. Install Dependencies","titles":["Getting Started"]},"19":{"title":"2. Download asdf","titles":["Getting Started"]},"20":{"title":"Official Download","titles":["Getting Started","2. Download asdf"]},"21":{"title":"Community Supported Download Methods","titles":["Getting Started","2. Download asdf"]},"22":{"title":"3. Install asdf","titles":["Getting Started"]},"23":{"title":"Core Installation Complete!","titles":["Getting Started"]},"24":{"title":"4. Install a Plugin","titles":["Getting Started"]},"25":{"title":"Plugin Dependencies","titles":["Getting Started","4. Install a Plugin"]},"26":{"title":"Install the Plugin","titles":["Getting Started","4. Install a Plugin"]},"27":{"title":"5. Install a Version","titles":["Getting Started"]},"28":{"title":"6. Set a Version","titles":["Getting Started"]},"29":{"title":"Global","titles":["Getting Started","6. Set a Version"]},"30":{"title":"Local","titles":["Getting Started","6. Set a Version"]},"31":{"title":"Using Existing Tool Version Files","titles":["Getting Started","6. Set a Version"]},"32":{"title":"Guide Complete!","titles":["Getting Started"]},"33":{"title":"Introduction","titles":[]},"34":{"title":"How It Works","titles":["Introduction"]},"35":{"title":"Related Projects","titles":["Introduction"]},"36":{"title":"nvm / n / rbenv etc","titles":["Introduction","Related Projects"]},"37":{"title":"direnv","titles":["Introduction","Related Projects"]},"38":{"title":"Homebrew","titles":["Introduction","Related Projects"]},"39":{"title":"NixOS","titles":["Introduction","Related Projects"]},"40":{"title":"Why use asdf?","titles":["Introduction"]},"41":{"title":"Upgrading From Version 0.15.x to 0.16.0","titles":[]},"42":{"title":"Breaking Changes","titles":["Upgrading From Version 0.15.x to 0.16.0"]},"43":{"title":"download is now a required callback for plugins","titles":["Upgrading From Version 0.15.x to 0.16.0","Breaking Changes"]},"44":{"title":"Hyphenated commands have been removed","titles":["Upgrading From Version 0.15.x to 0.16.0","Breaking Changes"]},"45":{"title":"asdf global and asdf local commands have been removed","titles":["Upgrading From Version 0.15.x to 0.16.0","Breaking Changes"]},"46":{"title":"asdf update command has been removed","titles":["Upgrading From Version 0.15.x to 0.16.0","Breaking Changes"]},"47":{"title":"asdf shell command has been removed","titles":["Upgrading From Version 0.15.x to 0.16.0","Breaking Changes"]},"48":{"title":"asdf current has changed","titles":["Upgrading From Version 0.15.x to 0.16.0","Breaking Changes"]},"49":{"title":"Plugin extension commands must now be prefixed with cmd","titles":["Upgrading From Version 0.15.x to 0.16.0","Breaking Changes"]},"50":{"title":"Extension commands have been redesigned","titles":["Upgrading From Version 0.15.x to 0.16.0","Breaking Changes"]},"51":{"title":"Executables Shims Resolve to Must Runnable by syscall.Exec","titles":["Upgrading From Version 0.15.x to 0.16.0","Breaking Changes"]},"52":{"title":"Custom shim templates are no longer supported","titles":["Upgrading From Version 0.15.x to 0.16.0","Breaking Changes"]},"53":{"title":"Installation","titles":["Upgrading From Version 0.15.x to 0.16.0"]},"54":{"title":"Upgrading Without Losing Data","titles":["Upgrading From Version 0.15.x to 0.16.0","Installation"]},"55":{"title":"1. Download the appropriate asdf binary for your operating system & architecture","titles":["Upgrading From Version 0.15.x to 0.16.0","Installation","Upgrading Without Losing Data"]},"56":{"title":"2. Set ASDF_DATA_DIR","titles":["Upgrading From Version 0.15.x to 0.16.0","Installation","Upgrading Without Losing Data"]},"57":{"title":"3. Add $ASDF_DATA_DIR/shims to the front of your `$PATH","titles":["Upgrading From Version 0.15.x to 0.16.0","Installation","Upgrading Without Losing Data"]},"58":{"title":"Testing","titles":["Upgrading From Version 0.15.x to 0.16.0","Installation"]},"59":{"title":"All Commands","titles":[]},"60":{"title":"Configuration","titles":[]},"61":{"title":".tool-versions","titles":["Configuration"]},"62":{"title":".asdfrc","titles":["Configuration"]},"63":{"title":"legacy_version_file","titles":["Configuration",".asdfrc"]},"64":{"title":"use_release_candidates","titles":["Configuration",".asdfrc"]},"65":{"title":"always_keep_download","titles":["Configuration",".asdfrc"]},"66":{"title":"plugin_repository_last_check_duration","titles":["Configuration",".asdfrc"]},"67":{"title":"disable_plugin_short_name_repository","titles":["Configuration",".asdfrc"]},"68":{"title":"concurrency","titles":["Configuration",".asdfrc"]},"69":{"title":"Plugin Hooks","titles":["Configuration",".asdfrc"]},"70":{"title":"Environment Variables","titles":["Configuration"]},"71":{"title":"ASDF_CONFIG_FILE","titles":["Configuration","Environment Variables"]},"72":{"title":"ASDF_DEFAULT_TOOL_VERSIONS_FILENAME","titles":["Configuration","Environment Variables"]},"73":{"title":"ASDF_DIR","titles":["Configuration","Environment Variables"]},"74":{"title":"ASDF_DATA_DIR","titles":["Configuration","Environment Variables"]},"75":{"title":"ASDF_CONCURRENCY","titles":["Configuration","Environment Variables"]},"76":{"title":"ASDF_FORCE_PREPEND","titles":["Configuration","Environment Variables"]},"77":{"title":"Full Configuration Example","titles":["Configuration"]},"78":{"title":"Internal Configuration","titles":["Configuration"]},"79":{"title":"Core","titles":[]},"80":{"title":"Installation & Setup","titles":["Core"]},"81":{"title":"Exec","titles":["Core"]},"82":{"title":"Env","titles":["Core"]},"83":{"title":"Info","titles":["Core"]},"84":{"title":"Reshim","titles":["Core"]},"85":{"title":"Shim-versions","titles":["Core"]},"86":{"title":"Update","titles":["Core"]},"87":{"title":"Uninstall","titles":["Core"]},"88":{"title":"Plugins","titles":[]},"89":{"title":"Add","titles":["Plugins"]},"90":{"title":"List Installed","titles":["Plugins"]},"91":{"title":"List All in Short-name Repository","titles":["Plugins"]},"92":{"title":"Update","titles":["Plugins"]},"93":{"title":"Remove","titles":["Plugins"]},"94":{"title":"Syncing the asdf Short-name Repository","titles":["Plugins"]},"95":{"title":"Versions","titles":[]},"96":{"title":"Install Version","titles":["Versions"]},"97":{"title":"Install Latest Stable Version","titles":["Versions"]},"98":{"title":"List Installed Versions","titles":["Versions"]},"99":{"title":"List All Available Versions","titles":["Versions"]},"100":{"title":"Show Latest Stable Version","titles":["Versions"]},"101":{"title":"Set Current Version","titles":["Versions"]},"102":{"title":"Fallback to System Version","titles":["Versions"]},"103":{"title":"View Current Version","titles":["Versions"]},"104":{"title":"Uninstall Version","titles":["Versions"]},"105":{"title":"Shims","titles":["Versions"]},"106":{"title":"By-passing asdf shims","titles":["Versions","Shims"]},"107":{"title":"Community Projects","titles":[]},"108":{"title":"FAQ","titles":[]},"109":{"title":"WSL1 support?","titles":["FAQ"]},"110":{"title":"WSL2 support?","titles":["FAQ"]},"111":{"title":"Newly installed executable not running?","titles":["FAQ"]},"112":{"title":"Shell not detecting newly installed shims?","titles":["FAQ"]},"113":{"title":"Thanks","titles":[]},"114":{"title":"Credits","titles":["Thanks"]},"115":{"title":"Maintainers","titles":["Thanks"]},"116":{"title":"Contributors","titles":["Thanks"]},"117":{"title":"Create a Plugin","titles":[]},"118":{"title":"Quickstart","titles":["Create a Plugin"]},"119":{"title":"Golden Rules for Plugin Scripts","titles":["Create a Plugin","Quickstart"]},"120":{"title":"Scripts Overview","titles":["Create a Plugin"]},"121":{"title":"Environment Variables Overview","titles":["Create a Plugin"]},"122":{"title":"Required Scripts","titles":["Create a Plugin"]},"123":{"title":"bin/list-all","titles":["Create a Plugin","Required Scripts"]},"124":{"title":"bin/download","titles":["Create a Plugin","Required Scripts"]},"125":{"title":"bin/install","titles":["Create a Plugin","Required Scripts"]},"126":{"title":"Optional Scripts","titles":["Create a Plugin"]},"127":{"title":"bin/latest-stable","titles":["Create a Plugin","Optional Scripts"]},"128":{"title":"bin/help.overview","titles":["Create a Plugin","Optional Scripts"]},"129":{"title":"bin/help.deps","titles":["Create a Plugin","Optional Scripts"]},"130":{"title":"bin/help.config","titles":["Create a Plugin","Optional Scripts"]},"131":{"title":"bin/help.links","titles":["Create a Plugin","Optional Scripts"]},"132":{"title":"bin/list-bin-paths","titles":["Create a Plugin","Optional Scripts"]},"133":{"title":"bin/exec-env","titles":["Create a Plugin","Optional Scripts"]},"134":{"title":"bin/exec-path","titles":["Create a Plugin","Optional Scripts"]},"135":{"title":"bin/uninstall","titles":["Create a Plugin","Optional Scripts"]},"136":{"title":"bin/list-legacy-filenames","titles":["Create a Plugin","Optional Scripts"]},"137":{"title":"bin/parse-legacy-file","titles":["Create a Plugin","Optional Scripts"]},"138":{"title":"bin/post-plugin-add","titles":["Create a Plugin","Optional Scripts"]},"139":{"title":"bin/post-plugin-update","titles":["Create a Plugin","Optional Scripts"]},"140":{"title":"bin/pre-plugin-remove","titles":["Create a Plugin","Optional Scripts"]},"141":{"title":"Extension Commands for asdf CLI","titles":["Create a Plugin"]},"142":{"title":"Custom Shim Templates","titles":["Create a Plugin"]},"143":{"title":"Testing","titles":["Create a Plugin"]},"144":{"title":"GitHub Action","titles":["Create a Plugin","Testing"]},"145":{"title":"TravisCI Config","titles":["Create a Plugin","Testing"]},"146":{"title":"API Rate Limiting","titles":["Create a Plugin"]},"147":{"title":"GITHUB_API_TOKEN","titles":["Create a Plugin","API Rate Limiting"]},"148":{"title":"Plugin Shortname Index","titles":["Create a Plugin"]}},"dirtCount":0,"index":[["\\thttps",{"2":{"131":2}}],["🙏",{"2":{"116":1}}],["916",{"2":{"92":1}}],["999999999",{"2":{"66":1}}],["kim",{"2":{"103":3}}],["knows",{"2":{"88":1}}],["keep",{"0":{"65":1},"2":{"38":1,"62":1,"65":2,"77":1,"119":1}}],["keyword",{"2":{"61":1}}],["keys",{"2":{"14":1}}],["keyrings",{"2":{"3":1}}],["8",{"2":{"85":2,"125":1,"127":1}}],["8837",{"2":{"22":2}}],["7",{"2":{"61":4,"125":1,"127":1}}],["`env`",{"2":{"59":1}}],["`asdf",{"2":{"59":1}}],["`",{"2":{"55":1}}],["`$path",{"0":{"57":1},"2":{"53":1}}],["`$asdf",{"2":{"50":6,"141":5}}],["query",{"2":{"127":2}}],["questions",{"2":{"108":1}}],["quickstart",{"0":{"118":1},"1":{"119":1}}],["quicly",{"2":{"11":1}}],["quality",{"2":{"107":1}}],["quot",{"2":{"45":6,"58":2,"76":2,"124":2,"132":8,"136":2}}],["60",{"2":{"39":1,"62":1,"66":1,"77":1,"94":1}}],["6",{"0":{"28":1},"1":{"29":1,"30":1,"31":1},"2":{"103":1}}],["4",{"0":{"24":1},"1":{"25":1,"26":1},"2":{"101":3,"123":1}}],["🎉",{"2":{"23":1,"32":1,"87":1}}],["+",{"2":{"22":2}}],["|",{"2":{"22":11}}],["yml",{"2":{"145":1}}],["yamllanguage",{"2":{"145":1}}],["yamlname",{"2":{"144":1}}],["yaml",{"2":{"144":1}}],["yarn",{"2":{"84":3,"111":3}}],["yes",{"2":{"31":1,"63":1,"64":1,"65":1,"67":1,"76":3,"94":1}}],["yet",{"2":{"22":2,"84":1}}],["yum",{"2":{"25":1}}],["you",{"2":{"1":2,"2":5,"6":1,"8":1,"17":1,"22":6,"23":1,"28":3,"29":2,"32":2,"33":1,"34":1,"40":2,"46":1,"53":1,"54":1,"58":5,"61":1,"72":2,"86":2,"87":1,"92":1,"96":2,"101":2,"102":1,"106":1,"110":1,"111":1,"112":2,"113":1,"145":1,"148":1}}],["your",{"0":{"55":1,"57":1},"2":{"1":3,"2":4,"3":2,"7":1,"8":2,"10":1,"16":1,"18":2,"21":1,"22":21,"28":1,"30":2,"31":1,"32":2,"33":2,"34":1,"36":1,"38":1,"40":1,"41":1,"45":1,"46":1,"50":1,"53":4,"54":1,"55":1,"56":1,"57":2,"58":2,"70":2,"86":1,"87":24,"94":2,"106":2,"112":4,"118":2,"119":1,"141":2,"143":2,"144":1,"145":1,"147":3,"148":1}}],["=s",{"2":{"87":2}}],["=",{"2":{"22":9,"31":1,"62":6,"69":1,"87":6,"123":1}}],["$releases",{"2":{"146":1}}],["$relative",{"2":{"134":1}}],["$github",{"2":{"146":2}}],["$travis",{"2":{"145":1}}],["$file",{"2":{"137":1}}],["$fpath",{"2":{"22":1,"87":1}}],["$cmd",{"2":{"134":1,"146":2}}],["$install",{"2":{"134":1}}],["$query",{"2":{"127":1}}],["$e",{"2":{"87":4}}],["$env",{"2":{"22":2}}],["$1",{"2":{"69":2}}],["$pwd",{"2":{"30":2,"101":1}}],["$path",{"2":{"22":1,"33":1,"53":1,"55":2,"57":1,"105":1,"112":1}}],["$nu",{"2":{"22":3}}],["$",{"2":{"22":16,"50":6,"59":1,"62":1,"69":1,"87":17,"101":2,"105":4,"123":1,"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":5,"133":1,"134":1,"135":1,"136":2,"137":1,"138":3,"139":3,"140":3,"141":4,"144":1}}],["$home",{"2":{"22":8,"28":1,"29":2,"31":1,"55":3,"61":1,"71":1,"74":1,"77":7,"87":49,"101":1}}],["$asdf",{"0":{"57":1},"2":{"2":1,"53":1,"57":2,"67":1,"78":1,"87":2,"105":1,"125":1,"141":1}}],["000",{"2":{"39":1}}],["0",{"0":{"41":3},"1":{"42":3,"43":3,"44":3,"45":3,"46":3,"47":3,"48":3,"49":3,"50":3,"51":3,"52":3,"53":3,"54":3,"55":3,"56":3,"57":3,"58":3},"2":{"20":1,"29":1,"30":1,"41":4,"44":4,"46":4,"51":3,"53":4,"58":6,"61":4,"66":1,"85":4,"101":2,"123":4,"124":5,"125":7,"127":1,"128":1,"129":1,"130":1,"131":1,"134":1,"135":2}}],["~",{"2":{"20":1,"22":49,"61":1,"87":23,"105":1,"134":2}}],["22",{"2":{"127":1}}],["2014",{"2":{"114":1}}],["2",{"0":{"19":1,"56":1},"1":{"20":1,"21":1},"2":{"57":1,"61":7,"101":1,"110":1,"123":1,"127":4,"137":1}}],["zero",{"2":{"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1}}],["zdotdir",{"2":{"22":1}}],["zshrc",{"2":{"22":5,"55":1,"56":1,"87":4,"112":1}}],["zsh",{"2":{"22":25,"56":1,"87":6,"112":1}}],["zypper",{"2":{"18":2}}],["zh",{"2":{"14":4}}],["18",{"2":{"123":3,"124":2,"125":2,"135":2}}],["11",{"2":{"103":1}}],["17",{"2":{"85":2,"96":1,"97":1,"98":1,"99":1,"100":1,"103":2,"104":1}}],["10",{"2":{"61":3}}],["16",{"0":{"41":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"29":1,"30":1,"85":2}}],["14",{"2":{"27":1,"85":4}}],["15",{"0":{"41":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"20":1,"41":2,"44":2,"46":2,"51":2,"53":2,"58":3,"61":5,"135":2}}],["1",{"0":{"18":1,"55":1},"2":{"66":1,"68":1,"101":2,"109":1,"123":4,"127":1,"134":1}}],["└─",{"2":{"14":4}}],["│",{"2":{"14":1}}],["├─",{"2":{"14":5}}],["简体中文",{"2":{"14":1}}],["5",{"0":{"27":1},"2":{"11":1,"29":1,"30":1,"61":2,"85":2,"103":1}}],["jruby",{"2":{"127":1}}],["j",{"2":{"121":1,"125":1}}],["jthegedus",{"2":{"115":1}}],["java",{"2":{"90":3}}],["javascript",{"2":{"10":2,"11":1,"137":1}}],["jobs",{"2":{"144":1}}],["john",{"2":{"71":1,"73":1,"74":1}}],["join",{"2":{"22":4,"87":2}}],["just",{"2":{"27":1,"28":1,"40":1,"53":1,"92":1,"101":1,"111":1,"131":1,"141":1}}],["js",{"2":{"10":2,"11":1,"13":5,"14":3,"15":1,"24":1,"27":1,"85":1,"88":1,"124":1,"125":1}}],["json",{"2":{"4":2,"10":1,"11":2,"137":1}}],[">>",{"2":{"22":15}}],[">",{"2":{"6":1,"7":1,"127":3}}],["39cb398vb39",{"2":{"61":1}}],["3",{"0":{"22":1,"57":1},"2":{"6":2,"11":1,"61":4,"85":2,"96":1,"103":2,"104":1,"123":1,"127":2,"137":1}}],["empty",{"2":{"77":5}}],["even",{"2":{"141":1}}],["eventually",{"2":{"124":1}}],["event",{"2":{"66":2}}],["events",{"2":{"66":2,"67":3,"94":1}}],["everywhere",{"2":{"45":1}}],["everyone",{"2":{"33":1}}],["every",{"2":{"4":1,"105":1}}],["evaluation",{"2":{"52":1}}],["evaluated",{"2":{"52":1}}],["early",{"2":{"67":1,"94":1}}],["earlier",{"2":{"44":1,"125":1}}],["easily",{"2":{"45":1}}],["each",{"2":{"14":1,"15":1,"17":1,"25":1,"32":1,"33":1,"34":1,"39":1,"66":1,"120":1,"121":1,"123":3}}],["eg",{"2":{"31":1}}],["error",{"2":{"28":1}}],["erlang",{"2":{"15":1,"89":1,"92":1,"93":1,"96":1,"97":2,"98":2,"99":2,"100":2,"103":3,"104":1}}],["effectively",{"2":{"50":1}}],["effect",{"2":{"22":1}}],["effort",{"2":{"8":1}}],["either",{"2":{"22":2,"48":2,"102":1,"123":1,"131":1}}],["edit",{"2":{"22":3,"61":1,"87":3}}],["echo",{"2":{"22":7,"69":1}}],["elm",{"2":{"89":2}}],["else",{"2":{"68":1,"74":1,"87":2,"125":1}}],["elapsed",{"2":{"66":1}}],["elv",{"2":{"22":18,"87":6}}],["elvish",{"2":{"22":18,"70":1,"87":9}}],["elixir",{"2":{"15":1,"52":2,"61":1,"88":1,"101":4,"142":2}}],["etc",{"0":{"36":1},"2":{"22":3,"33":1,"55":1,"56":1,"70":1,"87":2,"88":1,"105":1,"112":2,"117":1}}],["e",{"2":{"22":9,"33":1}}],["encompasses",{"2":{"60":1}}],["env",{"0":{"82":1,"133":1},"2":{"59":1,"82":1,"105":1,"120":1,"121":1,"133":3,"134":2}}],["environments",{"2":{"39":1,"143":1}}],["environment",{"0":{"70":1,"121":1},"1":{"71":1,"72":1,"73":1,"74":1,"75":1,"76":1},"2":{"33":1,"37":2,"47":2,"48":1,"59":1,"60":1,"62":1,"68":1,"70":2,"77":1,"101":2,"105":2,"106":1,"120":1,"121":3,"123":2,"124":1,"125":2,"127":1,"128":2,"129":2,"130":3,"131":2,"132":1,"133":3,"134":2,"135":2,"136":1,"137":2,"138":1,"139":1,"140":1,"146":1,"147":1}}],["entering",{"2":{"106":1}}],["entire",{"2":{"39":1,"91":1}}],["entries",{"2":{"22":1}}],["entry",{"2":{"22":1}}],["ensuring",{"2":{"33":1}}],["ensures",{"2":{"40":1}}],["ensure",{"2":{"22":2,"78":1,"125":1,"146":1}}],["enforces",{"2":{"27":1}}],["enforced",{"2":{"7":1}}],["end",{"2":{"22":1,"56":1,"114":1}}],["en",{"2":{"14":3}}],["english",{"2":{"14":1}}],["engine",{"2":{"10":1}}],["enabled",{"2":{"11":1,"136":1}}],["enable",{"2":{"6":1,"31":1}}],["exit",{"2":{"67":1,"124":2,"125":2,"127":2,"128":2,"129":2,"130":2,"131":2}}],["exists",{"2":{"52":1,"74":1,"77":1,"84":1}}],["existing",{"0":{"31":1},"2":{"5":2,"16":1,"31":1,"37":1,"54":1,"58":1}}],["exceeded",{"2":{"66":1}}],["exec",{"0":{"51":1,"81":1,"133":1,"134":1},"2":{"50":2,"51":2,"59":1,"81":1,"105":6,"120":2,"133":2,"134":4}}],["executing",{"2":{"69":1,"101":1,"133":1}}],["execution",{"2":{"6":1,"27":1,"28":1,"59":1,"133":1,"134":1,"135":1,"141":1}}],["executable",{"0":{"111":1},"2":{"47":1,"50":2,"51":1,"59":1,"69":1,"73":1,"84":1,"105":4,"117":1,"120":1,"133":1,"134":8,"141":3,"142":3}}],["executables",{"0":{"51":1},"2":{"34":2,"36":1,"51":1,"52":2,"84":2,"85":1,"111":2,"132":2,"141":2}}],["executes",{"2":{"59":1,"81":1,"105":1,"133":1,"134":1}}],["executed",{"2":{"51":1,"52":1,"66":1,"67":1,"69":1,"105":1,"141":1}}],["execute",{"2":{"5":1,"28":2,"30":1,"34":1,"69":2,"105":1,"111":1,"120":3,"138":1,"139":1,"140":1,"141":1,"143":1}}],["external",{"2":{"146":1}}],["extensions",{"2":{"141":1}}],["extension",{"0":{"49":1,"50":1,"141":1},"2":{"49":1,"50":5,"141":1}}],["extended",{"2":{"33":1}}],["extract",{"2":{"137":1}}],["extracted",{"2":{"13":1}}],["exact",{"2":{"27":1,"33":1,"39":1,"40":1,"137":1,"148":1}}],["examples",{"2":{"7":1}}],["example",{"0":{"77":1},"2":{"4":1,"6":1,"29":1,"50":1,"51":1,"61":1,"63":1,"69":1,"84":1,"85":1,"101":1,"119":1,"123":1,"130":1,"132":1,"134":1,"141":2,"143":1,"146":1}}],["experience",{"2":{"146":1}}],["expect",{"2":{"141":1}}],["expected",{"2":{"110":1}}],["expand",{"2":{"22":1}}],["export",{"2":{"14":1,"55":1,"57":1,"71":1,"72":1,"73":1,"74":1,"75":1}}],["exported",{"2":{"14":1}}],["exhaustive",{"2":{"18":1}}],["mod",{"2":{"137":1}}],["module",{"2":{"87":6}}],["most",{"2":{"51":2,"76":1,"112":1}}],["more",{"2":{"3":1,"4":1,"14":1,"31":1,"32":1,"37":1,"38":1,"39":1,"66":1,"88":1,"94":2,"106":1}}],["much",{"2":{"51":1,"53":1}}],["multiple",{"2":{"33":1,"61":1}}],["must",{"0":{"49":1,"51":1},"2":{"7":1,"14":1,"22":4,"49":1,"50":3,"71":1,"73":1,"74":1,"123":1,"124":2,"128":1,"131":1,"132":1,"134":2,"142":1}}],["myuser",{"2":{"56":2,"57":1}}],["my",{"2":{"22":5,"55":1,"112":1,"144":1,"145":2}}],["mitigate",{"2":{"146":1}}],["mit",{"2":{"114":1}}],["mix",{"2":{"101":1}}],["misleading",{"2":{"45":1,"50":1}}],["missing",{"2":{"38":1}}],["migration",{"2":{"31":1}}],["might",{"2":{"18":1}}],["minutes",{"2":{"66":2,"94":1}}],["minimal",{"2":{"11":1}}],["minor",{"2":{"7":1}}],["md",{"2":{"14":6}}],["me",{"2":{"114":1}}],["meant",{"2":{"105":1}}],["means",{"2":{"50":1,"105":1}}],["mean",{"2":{"40":1,"51":1}}],["method",{"2":{"21":2,"53":1,"70":1,"78":1,"86":4,"89":1,"94":1,"123":1,"148":1}}],["methods",{"0":{"21":1},"2":{"22":1}}],["menu",{"2":{"14":1}}],["message",{"2":{"7":2}}],["messages",{"2":{"7":1}}],["matrix",{"2":{"144":2}}],["matching",{"2":{"50":1,"123":1}}],["matches",{"2":{"22":1}}],["marked",{"2":{"124":1}}],["markdown",{"2":{"11":1,"14":2}}],["main",{"2":{"105":1,"144":1}}],["maintainers",{"0":{"115":1}}],["maintained",{"2":{"52":1}}],["maintaining",{"2":{"15":1}}],["maintenance",{"2":{"15":1,"107":1}}],["made",{"2":{"93":1,"105":1}}],["master",{"2":{"59":1,"86":1}}],["macos",{"2":{"18":2,"22":7,"25":1,"38":1,"76":1,"87":3,"143":1,"144":1}}],["machine",{"2":{"1":1,"62":1,"94":1,"137":1}}],["makes",{"2":{"50":1,"142":1}}],["makepkg",{"2":{"21":1}}],["make",{"2":{"12":1,"121":1,"125":1}}],["making",{"2":{"2":1,"83":1}}],["major",{"2":{"7":1}}],["manipulated",{"2":{"105":1}}],["manipulation",{"2":{"33":1}}],["manual",{"2":{"53":1}}],["manually",{"2":{"4":1,"22":2,"46":1}}],["man`",{"2":{"50":2}}],["man",{"2":{"50":3,"141":3}}],["managing",{"2":{"39":1}}],["management",{"2":{"29":1,"36":1,"39":1}}],["manages",{"2":{"28":1,"38":1}}],["managers",{"2":{"31":1,"33":1,"53":1,"63":1,"78":2}}],["manager",{"2":{"18":2,"33":1,"36":2,"38":2,"39":1,"40":2,"46":1,"53":1,"87":9}}],["managed",{"2":{"10":1,"29":2,"51":1,"61":1,"67":1,"102":1,"107":1,"111":1,"127":1,"128":1}}],["manage",{"2":{"1":2,"17":1,"23":1,"32":1,"34":1,"37":1,"38":1,"39":1,"40":1,"59":1,"111":1}}],["manpath",{"2":{"22":1}}],["many",{"2":{"22":1,"32":1,"39":1,"40":1,"79":1,"85":1,"93":1,"127":1}}],["may",{"2":{"1":2,"18":1,"22":2,"87":3,"109":1,"127":1,"128":1,"137":1,"145":1,"146":1}}],["x",{"0":{"41":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"51":1,"94":2}}],["x26",{"2":{"2":1,"6":1,"22":2,"87":2}}],["x3c",{"2":{"1":1,"7":3,"10":1,"59":38,"81":1,"82":1,"84":2,"85":1,"89":3,"92":1,"93":1,"96":2,"97":3,"98":3,"99":3,"100":3,"101":13,"102":1,"103":1,"104":2,"134":3,"143":6,"144":1,"145":5,"148":2}}],["piping",{"2":{"123":1}}],["pipeline",{"2":{"12":1,"147":1}}],["pkgbuild",{"2":{"86":1}}],["python",{"2":{"29":1,"61":4,"102":1}}],["ps1",{"2":{"22":7}}],["p",{"2":{"22":4}}],["personal",{"2":{"147":1}}],["periodically",{"2":{"94":1}}],["permission",{"2":{"50":2}}],["per",{"2":{"22":3,"31":1,"36":2,"87":2,"120":1,"129":1,"131":2}}],["performed",{"2":{"46":1}}],["performs",{"2":{"28":1}}],["perf",{"2":{"7":1}}],["potentially",{"2":{"123":1}}],["portable",{"2":{"119":1,"123":1}}],["portuguese",{"2":{"14":1}}],["powershell",{"2":{"22":7}}],["popular",{"2":{"15":1}}],["post",{"0":{"138":1,"139":1},"2":{"25":1,"69":3,"120":2,"121":1,"138":3,"139":4,"140":2}}],["possible",{"2":{"4":1,"11":1,"47":1,"53":1,"69":1,"141":1,"142":1}}],["posix",{"2":{"1":1,"22":3}}],["pt",{"2":{"14":6}}],["pruning",{"2":{"93":1}}],["practice",{"2":{"51":1}}],["presence",{"2":{"125":1}}],["present",{"2":{"46":1,"61":1,"78":1,"124":1,"132":1,"137":1}}],["predate",{"2":{"124":1}}],["prevous",{"2":{"121":1}}],["prev",{"2":{"121":1,"139":1}}],["previous",{"2":{"53":1,"139":1}}],["previously",{"2":{"43":1,"49":1,"50":1,"67":1}}],["prepare",{"2":{"120":1,"133":1}}],["prepend=no",{"2":{"76":1}}],["prepend",{"0":{"76":1},"2":{"2":1,"22":1,"76":1}}],["pre",{"0":{"140":1},"2":{"69":5,"120":1,"138":2,"139":2,"140":3}}],["precedence",{"2":{"68":1,"75":1}}],["prefer",{"2":{"89":1}}],["preferred",{"2":{"21":1,"86":1}}],["prefixed",{"0":{"49":1},"2":{"49":1}}],["prefix",{"2":{"22":12,"87":6}}],["priority",{"2":{"22":1,"76":1}}],["primarily",{"2":{"18":1}}],["printing",{"2":{"6":1}}],["printed",{"2":{"6":2,"128":1}}],["printf",{"2":{"6":2}}],["print",{"2":{"6":1,"59":2,"83":1,"123":2,"127":1,"128":1,"134":2}}],["pr",{"2":{"12":3,"14":1}}],["providing",{"2":{"141":1}}],["providers",{"2":{"127":1}}],["provider",{"2":{"127":2}}],["provided",{"2":{"59":2,"105":1,"123":3,"124":1,"125":1,"127":2,"135":3,"136":1,"138":1,"139":1,"140":1,"148":1}}],["provides",{"2":{"33":1,"45":1,"51":1,"69":1,"141":1,"144":1,"146":1}}],["provide",{"2":{"8":1,"59":1,"85":1,"141":1}}],["proc",{"2":{"68":1}}],["process",{"2":{"46":1}}],["probably",{"2":{"53":1}}],["problem",{"2":{"51":1}}],["programs",{"2":{"105":1}}],["program",{"2":{"52":2,"105":2}}],["programming",{"2":{"39":1}}],["proper",{"2":{"50":1,"51":1}}],["properly",{"2":{"22":2,"109":1,"110":1}}],["profile",{"2":{"22":14,"87":3,"112":1}}],["production",{"2":{"8":1}}],["projects",{"0":{"35":1,"107":1},"1":{"36":1,"37":1,"38":1,"39":1},"2":{"8":1,"107":2}}],["project",{"2":{"3":1,"15":1,"17":1,"30":1,"32":2,"33":1,"101":1,"103":1,"106":1,"107":1}}],["publish",{"2":{"147":1}}],["public",{"2":{"147":1}}],["purposes",{"2":{"24":1}}],["pulled",{"2":{"123":1}}],["pull",{"0":{"7":1,"12":1},"2":{"2":1,"7":4,"143":1,"144":1}}],["pushing",{"2":{"123":1}}],["push",{"2":{"2":1,"144":1}}],["places",{"2":{"124":1,"125":1}}],["place",{"2":{"53":1,"55":2}}],["placed",{"2":{"22":1,"124":2}}],["plan",{"2":{"45":1}}],["please",{"2":{"2":1,"5":1,"7":1,"12":1,"16":1,"87":1,"142":1}}],["plugin",{"0":{"24":1,"25":1,"26":1,"49":1,"66":1,"67":1,"69":1,"117":1,"119":1,"138":1,"139":1,"140":1,"148":1},"1":{"25":1,"26":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1},"2":{"1":3,"10":1,"15":1,"17":1,"22":7,"23":1,"24":1,"25":2,"26":1,"27":1,"31":1,"33":1,"34":1,"36":1,"37":1,"40":2,"43":2,"44":12,"49":1,"50":3,"52":2,"59":12,"62":2,"63":1,"66":7,"67":12,"69":11,"77":2,"84":1,"87":1,"88":1,"89":4,"90":4,"91":1,"92":4,"93":4,"94":4,"96":1,"105":5,"106":1,"117":1,"118":3,"120":9,"121":8,"123":1,"124":1,"125":1,"127":3,"128":4,"129":2,"130":3,"131":3,"132":1,"133":1,"134":3,"135":1,"136":1,"137":1,"138":14,"139":16,"140":12,"141":4,"142":2,"143":18,"144":4,"145":3,"148":4}}],["plugins",{"0":{"15":1,"43":1,"88":1},"1":{"89":1,"90":1,"91":1,"92":1,"93":1,"94":1},"2":{"1":1,"10":1,"15":6,"25":1,"32":1,"34":1,"50":6,"53":1,"59":6,"61":1,"63":1,"67":2,"74":1,"84":1,"85":1,"88":2,"89":2,"91":2,"92":1,"107":1,"111":1,"124":5,"125":1,"134":1,"141":8,"144":1}}],["page",{"2":{"31":1,"113":1,"123":1}}],["passing",{"0":{"106":1},"2":{"105":1}}],["passthrough",{"2":{"61":1}}],["pass",{"2":{"29":1,"106":1,"145":1}}],["pacman",{"2":{"18":2,"21":1,"22":7,"78":1,"86":1,"87":4}}],["packages",{"2":{"38":1,"39":2,"59":3}}],["package",{"2":{"10":1,"11":1,"18":2,"22":1,"38":2,"39":3,"40":1,"46":1,"53":2,"59":15,"78":2,"84":1,"87":9,"92":1,"105":8,"137":1}}],["parsing",{"2":{"137":1}}],["parse",{"0":{"137":1},"2":{"120":1,"137":2}}],["parser",{"2":{"1":1,"120":1}}],["parameter",{"2":{"143":1}}],["parameters",{"2":{"123":1,"124":1,"125":1,"135":1,"136":1,"138":1,"139":1,"140":1}}],["paragraph",{"2":{"128":1}}],["parent",{"2":{"73":1,"77":1}}],["part",{"2":{"76":1}}],["particular",{"2":{"34":1,"52":1,"59":1,"78":1,"101":1}}],["party",{"0":{"15":1},"2":{"142":1}}],["patterns",{"2":{"69":1}}],["patch",{"2":{"7":1}}],["path>",{"2":{"134":2,"145":1}}],["path=",{"2":{"55":1,"57":1}}],["paths",{"0":{"132":1},"2":{"2":1,"120":2,"125":1,"132":3}}],["path",{"0":{"134":1},"2":{"2":2,"22":13,"52":1,"55":1,"57":1,"59":2,"61":2,"71":2,"73":1,"74":1,"76":5,"105":6,"120":2,"121":7,"123":1,"124":9,"125":11,"127":3,"128":3,"129":3,"130":3,"131":3,"132":8,"133":4,"134":17,"135":1,"136":3,"137":3,"138":4,"139":3,"140":3,"141":1,"145":1,"146":2}}],["utilise",{"2":{"147":1}}],["utilities",{"2":{"141":1}}],["utility",{"2":{"22":1}}],["util",{"2":{"59":2,"82":1,"133":2,"134":2}}],["utils",{"2":{"59":1}}],["uz",{"2":{"22":1,"87":1}}],["undesirable",{"2":{"127":1}}],["under",{"2":{"14":2,"101":1}}],["unavoidable",{"2":{"123":1}}],["unused",{"2":{"93":1}}],["unset",{"2":{"71":1,"72":1,"73":1,"74":1,"75":1,"76":1}}],["unix",{"2":{"110":1}}],["uninstalls",{"2":{"135":1}}],["uninstalling",{"2":{"96":1}}],["uninstalled",{"2":{"69":1}}],["uninstall",{"0":{"87":1,"104":1,"135":1},"2":{"59":1,"69":1,"87":18,"104":2,"120":2,"135":3}}],["unique",{"2":{"39":1}}],["unit",{"2":{"1":1}}],["unload",{"2":{"37":1}}],["unless",{"2":{"22":2,"72":1}}],["urls",{"2":{"59":3,"90":1}}],["url>",{"2":{"59":1,"89":1,"143":2,"148":1}}],["url",{"2":{"14":1,"59":1,"66":1,"67":1,"89":2,"121":2,"138":2,"143":1,"148":3}}],["ubuntu",{"2":{"8":1,"144":1}}],["usage",{"2":{"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1}}],["usually",{"2":{"22":1,"30":1}}],["us",{"2":{"14":1}}],["using",{"0":{"31":1},"2":{"4":1,"6":1,"7":1,"12":1,"21":1,"22":6,"33":1,"40":1,"46":1,"68":1,"86":1,"87":1,"110":1,"117":1,"123":1,"128":1,"129":1,"130":1,"131":1,"141":2,"142":1,"145":1}}],["user",{"2":{"38":1,"47":1,"60":1,"62":1,"127":1,"135":1}}],["users",{"2":{"11":1,"22":1,"45":1,"78":1,"103":3,"136":1,"141":1}}],["user>",{"2":{"1":1,"10":1}}],["used",{"2":{"5":1,"13":1,"15":1,"50":1,"52":2,"59":3,"61":1,"62":1,"63":1,"64":2,"69":1,"71":1,"72":1,"73":1,"75":1,"78":2,"87":1,"88":1,"93":1,"121":1,"127":2,"133":1,"134":1,"142":1}}],["uses",{"2":{"4":1,"105":1,"111":1,"141":1,"144":1}}],["use",{"0":{"40":1,"64":1},"2":{"1":1,"2":1,"4":3,"7":1,"8":1,"11":1,"21":1,"22":8,"46":1,"61":4,"62":1,"63":2,"68":2,"70":1,"75":1,"77":10,"86":1,"87":3,"96":1,"102":1,"105":1,"118":1,"121":1,"125":2,"141":1,"142":3,"148":2}}],["useful",{"2":{"1":1,"23":1,"78":1,"121":1,"125":1,"137":1,"143":1}}],["upgrade",{"2":{"46":2,"53":1,"54":1,"58":2,"64":1,"86":2}}],["upgrading",{"0":{"41":1,"54":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":2,"56":2,"57":2,"58":1},"2":{"53":1,"58":1}}],["upon",{"2":{"38":1,"52":1,"70":1,"106":1}}],["upstream",{"2":{"38":2,"39":1}}],["updates",{"2":{"46":1,"61":1,"78":2,"92":1}}],["updated",{"2":{"22":4,"69":1,"120":1,"121":1,"139":1}}],["update",{"0":{"46":1,"86":1,"92":1,"139":1},"2":{"7":1,"44":2,"46":2,"59":8,"64":1,"67":1,"69":2,"78":2,"86":3,"92":5,"118":1,"120":1,"139":7}}],["up",{"2":{"2":1,"28":1,"34":1,"39":1}}],["rvmrc",{"2":{"136":1}}],["rbx",{"2":{"127":1}}],["rbenv",{"0":{"36":1},"2":{"31":1,"36":1,"63":1}}],["rs",{"2":{"87":4}}],["rf",{"2":{"87":26}}],["rm",{"2":{"67":1,"87":4}}],["rate",{"0":{"146":1},"1":{"147":1},"2":{"146":1}}],["rather",{"2":{"41":1,"47":1,"52":2,"79":1}}],["ran",{"2":{"69":1}}],["range",{"2":{"66":1}}],["rarely",{"2":{"52":1}}],["raw",{"2":{"1":1}}],["rocky",{"2":{"25":1}}],["root",{"2":{"13":2,"14":3}}],["rc",{"2":{"22":9,"56":1,"57":1,"58":1,"87":3}}],["rules",{"0":{"119":1}}],["ruby",{"2":{"15":1,"31":1,"61":2,"63":3,"88":1,"120":1,"127":6,"136":1}}],["runshell",{"2":{"143":1}}],["runs",{"2":{"59":1,"101":1,"124":1,"133":1,"134":1,"144":1}}],["runner",{"2":{"110":1}}],["runnable",{"0":{"51":1},"2":{"50":1}}],["running",{"0":{"111":1},"2":{"4":1,"8":1,"32":1,"50":6,"120":1,"141":5}}],["run",{"2":{"11":2,"18":1,"34":2,"48":1,"49":1,"50":2,"51":2,"56":1,"61":2,"87":14,"110":1,"117":1,"118":1}}],["runtimes",{"2":{"33":1}}],["runtime",{"2":{"10":1,"17":2,"36":2}}],["regardless",{"2":{"137":1}}],["regarding",{"2":{"108":1}}],["registered",{"2":{"59":1}}],["rebuild",{"2":{"86":1}}],["returns",{"2":{"105":2}}],["returning",{"2":{"105":1}}],["return",{"2":{"85":1,"134":2,"137":1}}],["returned",{"2":{"59":1,"123":2}}],["recalculation",{"2":{"84":1}}],["recursive",{"2":{"67":1}}],["recreates",{"2":{"84":1}}],["recreate",{"2":{"59":1,"132":1}}],["recommendation",{"2":{"89":1}}],["recommended",{"2":{"86":1,"123":1,"148":1}}],["recommend",{"2":{"21":1,"143":1}}],["redesigned",{"0":{"50":1}}],["reduce",{"2":{"4":1}}],["rewrite",{"2":{"41":2,"47":1}}],["removing",{"2":{"67":1,"93":1,"135":1}}],["remove",{"0":{"93":1,"140":1},"2":{"44":2,"58":1,"59":3,"67":5,"69":2,"87":40,"93":3,"120":1,"140":6}}],["removed",{"0":{"44":1,"45":1,"46":1,"47":1},"2":{"45":1,"67":1,"120":1,"124":1,"140":1}}],["removes",{"2":{"36":1,"47":1}}],["remote",{"2":{"2":1}}],["responsible",{"2":{"107":1}}],["result",{"2":{"66":1,"77":1}}],["resources",{"2":{"59":1}}],["resolving",{"2":{"112":1}}],["resolves",{"2":{"121":1,"141":1}}],["resolve",{"0":{"51":1},"2":{"27":1}}],["resolution",{"2":{"28":1}}],["reshimed",{"2":{"69":1}}],["reshim",{"0":{"84":1},"2":{"59":1,"69":2,"84":2,"111":1,"112":1,"132":1}}],["restart",{"2":{"22":1}}],["reason",{"2":{"106":1}}],["really",{"2":{"105":1}}],["rearrange",{"2":{"22":1}}],["reads",{"2":{"136":1,"137":1}}],["readme",{"2":{"14":4,"106":1,"141":1}}],["reading",{"2":{"7":1,"137":1}}],["read",{"2":{"5":1,"13":1,"22":1,"63":2,"135":1,"142":1}}],["refreshed",{"2":{"94":1}}],["ref>",{"2":{"59":1,"143":1}}],["ref",{"2":{"59":2,"61":2,"96":1,"121":6,"124":2,"125":2,"127":2,"128":2,"129":2,"130":2,"131":2,"132":2,"133":2,"134":2,"136":2,"139":5,"143":1}}],["refs",{"2":{"59":1}}],["references",{"2":{"14":1}}],["reference",{"2":{"13":1,"29":1,"31":1,"96":1}}],["refactor",{"2":{"7":1}}],["relative",{"2":{"120":1,"132":1,"134":2,"141":1,"145":1}}],["relate",{"2":{"107":1}}],["related",{"0":{"35":1},"1":{"36":1,"37":1,"38":1,"39":1},"2":{"107":1,"138":1,"139":1,"140":1,"141":1}}],["rely",{"2":{"77":1}}],["relevant",{"2":{"15":1,"131":1}}],["release",{"0":{"64":1},"2":{"7":3,"12":1,"59":1,"62":1,"64":2,"77":1,"86":1,"127":1}}],["releases",{"0":{"7":1,"12":1},"2":{"123":1}}],["relies",{"2":{"12":1,"86":1}}],["replacing",{"2":{"141":1}}],["replace",{"2":{"11":1}}],["reproducible",{"2":{"39":1}}],["representing",{"2":{"13":1}}],["represent",{"2":{"13":1}}],["report",{"2":{"83":1}}],["repository",{"0":{"66":1,"67":1,"91":1,"94":1},"2":{"2":1,"3":2,"30":1,"33":1,"59":1,"62":2,"66":3,"67":8,"77":2,"89":1,"92":1,"94":2,"118":1,"131":1,"143":1,"147":1,"148":1}}],["repo",{"2":{"1":1,"15":2,"16":1,"25":1,"36":1,"59":3,"67":1,"89":1,"94":1,"117":1,"118":3,"121":2,"144":1,"147":1,"148":1}}],["reverse",{"2":{"123":1}}],["revert",{"2":{"7":1}}],["revs",{"0":{"4":1},"2":{"4":6}}],["review",{"2":{"2":1}}],["requires",{"2":{"18":1,"123":2,"129":1,"130":1,"131":1}}],["require",{"2":{"14":1,"22":1,"50":1,"111":1}}],["required",{"0":{"43":1,"122":1},"1":{"123":1,"124":1,"125":1},"2":{"2":1,"11":1,"18":1,"33":1,"43":1,"62":1,"118":1,"124":1,"128":1,"130":1,"142":1,"143":1}}],["requests",{"0":{"7":1,"12":1}}],["request",{"2":{"2":1,"7":4,"143":1,"144":1}}],["h",{"2":{"146":1}}],["hw",{"2":{"68":1}}],["hyphenated",{"0":{"44":1},"2":{"44":3}}],["hook",{"2":{"120":3}}],["hooks",{"0":{"69":1},"2":{"25":1,"69":2,"138":1,"139":1,"140":1}}],["hosted",{"2":{"144":1}}],["host",{"2":{"110":1}}],["however",{"2":{"37":1}}],["how",{"0":{"34":1},"2":{"23":1,"45":1,"88":1,"105":1}}],["home",{"2":{"22":2,"56":2,"57":1,"62":1,"71":1,"73":1,"74":1,"136":1}}],["homebrew",{"0":{"38":1},"2":{"18":1,"21":1,"22":12,"38":2,"70":1,"78":1,"86":1,"87":7}}],["high",{"2":{"114":1}}],["highest",{"2":{"22":1,"76":1}}],["highly",{"2":{"21":1}}],["history",{"2":{"7":1}}],["headings",{"2":{"128":1}}],["heading",{"2":{"128":1}}],["head",{"2":{"59":1,"86":2}}],["helpful",{"2":{"106":1}}],["helper",{"2":{"21":1,"22":3,"27":1,"83":1,"86":1,"105":2}}],["help",{"0":{"128":1,"129":1,"130":1,"131":1},"2":{"15":1,"32":1,"59":2,"105":1,"120":4,"128":3,"129":3,"130":3,"131":3,"141":3,"143":1}}],["here",{"2":{"1":1,"3":1,"18":1,"22":1,"107":2,"108":1}}],["haxe",{"2":{"141":3}}],["halcyon",{"2":{"90":1}}],["handle",{"2":{"51":1,"88":1}}],["handled",{"2":{"22":1}}],["hans",{"2":{"14":4}}],["hashnuke",{"2":{"114":1,"115":1}}],["has",{"0":{"46":1,"47":1,"48":1},"2":{"14":1,"15":1,"22":2,"25":1,"32":1,"46":1,"48":1,"66":2,"67":1,"86":1,"87":1,"94":1,"120":2,"121":1,"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"136":1,"138":1,"139":1,"140":1,"141":1}}],["have",{"0":{"44":1,"45":1,"50":1},"2":{"11":1,"13":1,"22":2,"25":1,"27":1,"29":1,"34":1,"45":1,"50":1,"51":1,"87":2,"111":1,"112":2,"136":1}}],["html",{"2":{"11":1}}],["https",{"2":{"1":5,"10":3,"20":1,"21":1,"26":1,"59":2,"89":1,"90":2,"143":1,"145":1,"148":1}}],["wsl",{"2":{"110":1}}],["wsl2",{"0":{"110":1},"2":{"110":3}}],["wsl1",{"0":{"109":1},"2":{"109":2}}],["wrapper",{"2":{"105":1}}],["wrappers",{"2":{"105":1}}],["wrapping",{"2":{"105":1}}],["wrong",{"2":{"45":1}}],["written",{"2":{"36":1,"41":1}}],["writing",{"2":{"5":1,"11":1,"123":1}}],["writes",{"2":{"101":2}}],["write",{"2":{"4":1}}],["way",{"2":{"33":1,"46":1}}],["warning",{"2":{"22":3,"28":1,"142":1,"147":1}}],["was",{"2":{"11":2,"36":1,"43":1,"45":3,"47":2,"51":1,"52":5,"84":1,"121":2,"124":1,"125":1,"138":1,"139":1,"140":1}}],["want",{"2":{"2":1,"72":1,"92":1,"101":1,"106":2}}],["worry",{"2":{"78":1}}],["workflow",{"2":{"144":1}}],["workflows",{"2":{"3":1,"33":1,"79":1,"144":1}}],["works",{"0":{"34":1},"2":{"45":1,"143":1}}],["working",{"2":{"28":1,"30":1,"33":1,"110":1}}],["workaround",{"2":{"22":1}}],["work",{"2":{"15":1,"22":1,"50":1,"109":1,"110":2}}],["would",{"2":{"1":1,"11":1,"50":1,"51":1,"77":1,"132":1}}],["well",{"2":{"60":1}}],["welcome",{"2":{"15":1}}],["were",{"2":{"41":1,"51":1}}],["website",{"2":{"7":2,"123":1}}],["we",{"2":{"3":1,"11":2,"21":1,"24":1,"25":2,"27":4,"38":1,"51":1,"109":1,"110":1,"123":1,"143":2}}],["who",{"2":{"136":1}}],["what",{"2":{"61":1,"69":2,"87":2,"111":1,"137":1}}],["why",{"0":{"40":1}}],["whether",{"2":{"48":1,"76":1,"127":1,"137":1}}],["whenever",{"2":{"61":1}}],["when",{"2":{"4":2,"11":1,"12":1,"28":1,"30":1,"34":2,"50":2,"66":1,"67":1,"68":1,"75":1,"78":1,"83":1,"85":1,"96":1,"105":1,"110":2,"121":1,"125":1,"137":1,"145":1}}],["whereas",{"2":{"111":1}}],["where",{"2":{"2":1,"25":1,"59":1,"74":1,"96":1,"105":2,"121":2,"124":2,"125":2,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"136":1,"138":1,"139":1,"140":1,"141":1}}],["which",{"2":{"1":1,"7":1,"12":1,"22":3,"27":1,"28":1,"33":1,"34":1,"36":2,"51":1,"59":1,"61":1,"86":1,"87":1,"105":2,"120":2,"121":1,"124":1,"127":1,"133":1,"134":1,"136":1,"137":1,"141":1,"146":1}}],["wisely",{"2":{"142":1}}],["wish",{"2":{"1":1,"17":1}}],["windows",{"2":{"109":1,"110":2}}],["will",{"2":{"6":3,"7":3,"14":1,"22":6,"24":1,"27":2,"28":3,"29":2,"30":2,"43":1,"51":1,"58":1,"61":3,"67":2,"71":1,"72":1,"74":1,"84":1,"92":1,"93":1,"94":1,"111":1,"123":1,"124":3,"125":1,"127":1,"128":1,"132":2,"137":1,"141":2,"142":1,"143":1,"148":1}}],["within",{"2":{"13":1,"33":1}}],["without",{"0":{"54":1},"1":{"55":1,"56":1,"57":1},"2":{"2":1,"4":1,"28":1,"54":1,"58":1}}],["with",{"0":{"49":1},"2":{"1":3,"4":2,"5":1,"6":2,"7":2,"10":3,"11":3,"12":1,"13":2,"14":2,"22":19,"27":2,"29":1,"32":1,"33":2,"34":1,"37":2,"39":1,"40":2,"41":1,"44":1,"45":1,"48":1,"49":2,"50":2,"51":2,"59":3,"60":1,"61":2,"62":2,"63":1,"67":2,"69":1,"70":1,"77":1,"85":2,"87":13,"93":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"105":1,"117":1,"118":2,"120":1,"123":3,"124":2,"125":4,"127":2,"128":2,"129":2,"130":2,"131":2,"134":2,"135":1,"137":1,"138":1,"139":1,"140":1,"143":1,"144":1,"147":1}}],["f",{"2":{"87":3}}],["far",{"2":{"142":1}}],["faq",{"0":{"108":1},"1":{"109":1,"110":1,"111":1,"112":1}}],["facilitate",{"2":{"79":1}}],["factor",{"2":{"36":1}}],["familiarity",{"2":{"40":1}}],["familiar",{"2":{"32":1}}],["failure",{"2":{"124":2,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1}}],["fail",{"2":{"28":1,"43":1}}],["fall",{"2":{"14":1}}],["fallback",{"0":{"102":1},"2":{"11":1,"61":1,"63":1}}],["fpath=",{"2":{"22":1,"87":1}}],["fpath",{"2":{"22":3}}],["free",{"2":{"128":1,"130":1}}],["front",{"0":{"57":1},"2":{"22":1,"53":1,"55":1,"57":1,"76":3}}],["from",{"0":{"41":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"10":1,"28":2,"31":2,"47":1,"59":1,"61":1,"66":1,"67":1,"77":1,"96":1,"120":1,"123":2,"124":1,"125":1,"127":3,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":2,"138":1,"139":1,"140":1}}],["framework",{"2":{"22":9,"87":1,"112":1}}],["friendly",{"2":{"22":2}}],["fever",{"2":{"114":1}}],["fetch",{"2":{"86":1,"92":1}}],["few",{"2":{"13":1}}],["feature",{"2":{"7":2,"11":1,"37":1,"52":3,"53":1,"141":2,"142":1}}],["features",{"2":{"2":1,"117":1}}],["feat",{"2":{"7":4}}],["future",{"2":{"45":1}}],["function",{"2":{"41":1,"47":2,"51":1}}],["functionality",{"2":{"1":1,"45":1}}],["full",{"0":{"77":1},"2":{"7":1,"69":1,"120":1,"121":3,"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"136":1,"141":1}}],["further",{"2":{"6":1,"52":1}}],["flags",{"2":{"119":1,"125":1,"130":1}}],["flag",{"2":{"6":1}}],["fi",{"2":{"146":1}}],["final",{"2":{"105":1}}],["finally",{"2":{"61":1,"105":1}}],["find",{"2":{"87":3,"141":1}}],["filter",{"2":{"59":2,"98":1,"99":1,"123":1,"127":6}}],["filenames",{"0":{"136":1},"2":{"120":2,"136":3}}],["filename=tool",{"2":{"72":1}}],["filename",{"0":{"72":1},"2":{"72":2,"77":2}}],["file=",{"2":{"71":1}}],["files",{"0":{"31":1},"2":{"3":2,"11":1,"13":1,"14":2,"17":1,"28":1,"31":2,"33":1,"36":1,"60":1,"63":2,"72":1,"87":14,"120":2,"124":1,"125":2,"132":1,"137":1}}],["file",{"0":{"63":1,"71":1,"137":1},"2":{"3":1,"4":5,"6":1,"13":1,"30":1,"31":2,"33":2,"45":1,"48":1,"56":1,"57":2,"58":1,"59":2,"61":9,"62":4,"71":1,"72":1,"77":4,"78":1,"101":2,"105":1,"112":1,"120":1,"121":2,"136":1,"137":6,"141":2,"142":3,"145":1}}],["fish",{"2":{"22":19,"70":1,"87":17,"105":1,"112":2}}],["first",{"0":{"15":1},"2":{"14":1,"25":1,"50":2,"69":1,"127":1,"142":1}}],["fixes",{"2":{"2":1}}],["fix",{"2":{"2":2,"7":4,"141":1}}],["fourth",{"2":{"48":1}}],["found",{"2":{"12":1,"50":1,"137":1}}],["foox",{"2":{"134":1}}],["foo",{"2":{"14":2,"50":13,"69":2,"96":2,"134":4,"141":11,"142":2}}],["folder",{"2":{"14":1}}],["follow",{"2":{"7":1,"22":2,"32":1,"86":1,"87":4}}],["follows",{"2":{"7":1,"94":1}}],["following",{"2":{"2":1,"3":1,"4":1,"22":17,"31":1,"61":2,"66":1,"67":1,"69":2,"70":1,"77":2,"101":1,"148":1}}],["focus",{"2":{"11":1}}],["form",{"2":{"128":1,"130":1}}],["formats",{"2":{"137":1}}],["format",{"2":{"2":2,"7":5,"11":2,"12":1,"61":1,"62":1,"101":1,"123":1,"131":1,"135":1}}],["formatter",{"2":{"1":1}}],["force",{"0":{"76":1},"2":{"22":1,"76":3,"84":1,"87":5}}],["forcibly",{"2":{"22":1}}],["for",{"0":{"43":1,"55":1,"119":1,"141":1},"2":{"1":3,"2":2,"3":1,"4":2,"7":2,"8":2,"10":1,"11":1,"12":1,"13":3,"14":3,"15":3,"16":2,"17":1,"18":1,"22":6,"24":1,"25":1,"27":1,"28":1,"30":1,"31":2,"32":3,"34":1,"36":3,"37":1,"38":2,"39":1,"40":3,"50":2,"52":3,"53":2,"58":2,"59":7,"61":2,"63":1,"66":1,"69":2,"70":1,"78":2,"81":1,"84":5,"85":1,"86":1,"88":1,"91":1,"93":1,"94":2,"101":4,"102":1,"105":1,"106":2,"107":2,"109":2,"110":2,"111":1,"119":1,"120":6,"121":2,"123":1,"124":5,"125":4,"127":3,"128":3,"129":2,"130":4,"131":2,"132":6,"133":4,"134":4,"135":1,"136":2,"137":1,"141":2,"142":1,"143":2,"144":1,"146":1,"148":1}}],["fork",{"2":{"1":2,"10":2}}],["npm",{"2":{"84":2,"85":2,"111":1,"135":1}}],["nproc",{"2":{"68":1}}],["ncpu",{"2":{"68":1}}],["nix",{"2":{"39":1}}],["nixos",{"0":{"39":1},"2":{"39":3}}],["nvm",{"0":{"36":1},"2":{"36":1}}],["nvmrc",{"2":{"31":1}}],["n$env",{"2":{"22":3}}],["numbers",{"2":{"137":1}}],["number",{"2":{"27":1,"41":1,"50":1,"68":3,"75":1,"121":2,"124":1,"125":2,"127":2,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"136":1}}],["nu",{"2":{"22":9}}],["nushell",{"2":{"22":6}}],["nsource",{"2":{"22":1}}],["nav",{"2":{"14":3}}],["navbars",{"2":{"13":1,"14":3}}],["navbar",{"2":{"13":1,"14":2}}],["named",{"2":{"101":1,"118":1}}],["names",{"2":{"72":1}}],["name>",{"2":{"59":19,"84":1,"89":2,"92":1,"93":1,"96":1,"97":2,"98":2,"99":2,"100":2,"101":5,"102":1,"103":1,"104":1,"143":2,"145":1,"148":1}}],["name",{"0":{"67":1,"91":1,"94":1},"2":{"14":1,"15":1,"50":2,"59":1,"61":1,"62":1,"66":3,"67":8,"69":5,"77":1,"89":2,"91":1,"94":3,"96":1,"102":1,"105":1,"117":2,"118":2,"123":1,"127":1,"128":1,"129":1,"130":1,"131":1,"135":1,"138":2,"139":2,"140":2,"141":1,"143":2,"144":2}}],["n",{"0":{"36":1},"2":{"6":2,"22":16,"36":1,"146":1}}],["no",{"0":{"52":1},"2":{"46":1,"47":1,"50":3,"52":1,"53":1,"61":1,"62":4,"63":1,"64":1,"65":1,"67":1,"76":1,"77":11,"84":1,"123":2,"124":2,"125":1,"128":1,"135":3,"136":1,"137":1,"138":1,"139":1,"140":1}}],["now",{"0":{"43":1,"49":1},"2":{"27":1,"32":1,"41":1,"43":1,"47":1,"48":1,"49":1,"50":2,"51":1,"53":1,"141":1}}],["non",{"2":{"18":1,"44":2,"119":1,"124":1,"125":1,"127":2,"128":1,"129":1,"130":1,"131":1}}],["nodebuild",{"2":{"49":2}}],["node",{"2":{"10":2,"15":1,"24":1,"27":1,"31":1,"85":3,"88":1,"103":1,"124":1,"125":1,"143":1}}],["nodejs",{"2":{"10":2,"24":1,"25":1,"26":2,"27":3,"29":2,"30":2,"31":1,"32":1,"49":2,"61":2,"84":2,"85":7,"90":3,"103":1,"123":2,"124":1,"125":1,"135":2,"143":3,"148":2}}],["noise",{"2":{"4":1}}],["notify",{"2":{"111":1}}],["note",{"2":{"18":1,"27":1,"40":1,"61":1,"66":1,"67":1,"68":1,"105":1,"107":1,"121":1,"143":1,"145":1}}],["not",{"0":{"111":1,"112":1},"2":{"1":1,"6":1,"11":2,"29":1,"37":1,"38":2,"39":3,"40":2,"47":1,"48":1,"61":1,"66":2,"67":3,"72":1,"76":2,"78":1,"84":1,"94":1,"107":2,"109":3,"110":2,"112":2,"119":1,"121":1,"123":1,"128":1,"132":1,"137":2,"141":1,"142":1,"148":1}}],["neko",{"2":{"141":1}}],["never",{"2":{"66":3,"147":1}}],["near",{"2":{"45":1}}],["nexport",{"2":{"22":1}}],["nested",{"2":{"14":2}}],["newest",{"2":{"123":1}}],["newer",{"2":{"22":2,"87":1,"125":1}}],["newly",{"0":{"111":1,"112":1}}],["new",{"2":{"2":2,"7":4,"22":3,"37":1,"47":1,"66":1,"84":1,"86":1,"141":2,"147":1}}],["needed",{"2":{"101":1,"130":1}}],["needs",{"2":{"22":1,"52":1,"112":1,"145":1}}],["need",{"2":{"1":1,"22":6,"25":1,"29":1,"36":1,"51":1,"96":1,"105":1,"111":1,"145":1}}],["ll",{"2":{"96":1}}],["leave",{"2":{"123":1}}],["learn",{"2":{"23":1}}],["legacy",{"0":{"63":1,"136":1,"137":1},"2":{"31":1,"63":1,"77":1,"120":4,"124":3,"125":1,"136":3,"137":7}}],["ln",{"2":{"22":4}}],["losing",{"0":{"54":1},"1":{"55":1,"56":1,"57":1},"2":{"54":1,"58":1}}],["loaded",{"2":{"41":1}}],["load",{"2":{"37":1}}],["looks",{"2":{"61":1}}],["look",{"2":{"29":1,"30":1,"132":1}}],["lookup",{"2":{"15":1,"28":2}}],["longer",{"0":{"52":1},"2":{"46":1,"47":1,"50":2,"52":1,"89":1}}],["long",{"2":{"15":1,"51":1,"107":1}}],["locations",{"2":{"70":1}}],["location",{"2":{"22":1,"48":1,"62":1,"70":1,"71":1,"73":2,"74":2,"77":2,"124":1,"125":1,"145":1}}],["located",{"2":{"14":1}}],["locales",{"2":{"14":3}}],["locale",{"2":{"13":1,"14":2}}],["locally",{"2":{"2":1,"5":1}}],["local",{"0":{"30":1,"45":1},"2":{"1":1,"11":1,"30":2,"45":3,"59":4,"61":1,"94":1,"101":3,"102":3,"105":1,"127":2,"138":1}}],["lacking",{"2":{"51":2}}],["lack",{"2":{"50":1,"51":1}}],["lacks",{"2":{"43":1}}],["latest",{"0":{"97":1,"100":1,"127":1},"2":{"27":3,"29":1,"30":1,"46":2,"54":1,"59":15,"64":2,"86":2,"92":1,"97":5,"100":5,"101":3,"120":2,"124":1,"125":1,"127":16,"143":1,"144":2,"146":1}}],["later",{"2":{"18":1}}],["language",{"2":{"39":1,"50":1,"61":1,"117":1}}],["lang",{"2":{"14":3,"59":1}}],["label",{"2":{"14":3}}],["larger",{"2":{"13":1}}],["largely",{"2":{"11":1}}],["last",{"0":{"66":1},"2":{"7":1,"48":1,"62":1,"66":2,"77":1,"94":2,"123":1}}],["lt",{"2":{"7":2,"12":1,"61":1,"66":3,"67":4,"69":5,"76":1,"84":2,"94":1,"102":1,"117":3,"118":2,"123":1,"124":2,"125":3,"127":5,"128":2,"129":2,"130":2,"131":5,"132":3,"133":3,"134":3,"135":2,"138":1,"139":2,"140":1,"143":7}}],["limiting",{"0":{"146":1},"1":{"147":1},"2":{"146":1}}],["license",{"2":{"114":1}}],["libraries",{"2":{"141":1}}],["lib",{"2":{"22":6,"50":7,"87":3,"141":7}}],["libexec",{"2":{"22":10,"87":4}}],["link",{"2":{"131":4,"141":1}}],["links",{"0":{"131":1},"2":{"120":2,"131":2}}],["linked",{"2":{"15":1}}],["lines",{"2":{"58":1,"87":14}}],["line",{"2":{"50":1,"51":3,"56":2,"61":1,"123":3,"129":1,"131":2,"137":1,"141":1}}],["linux",{"2":{"18":4,"25":1,"38":1,"109":1,"110":1,"143":1,"145":1}}],["lint",{"2":{"2":4}}],["lifecycle",{"2":{"84":1}}],["life",{"2":{"15":1}}],["living",{"2":{"13":1}}],["likely",{"2":{"112":1}}],["like",{"2":{"4":1,"11":1,"14":1,"22":2,"29":1,"30":1,"36":1,"49":1,"50":1,"53":1,"61":1,"78":1,"84":2,"88":1,"101":1,"125":1,"137":1,"146":1}}],["lists",{"2":{"85":1,"123":2,"127":1}}],["listed",{"2":{"25":1,"28":1,"59":1,"107":1,"118":1}}],["list",{"0":{"90":1,"91":1,"98":1,"99":1,"123":1,"132":1,"136":1},"2":{"1":1,"2":1,"7":1,"15":1,"18":1,"27":2,"38":1,"44":6,"59":11,"66":1,"67":1,"79":1,"90":4,"91":2,"94":1,"98":4,"99":4,"116":1,"117":1,"119":2,"120":9,"121":1,"123":6,"125":1,"127":2,"129":1,"131":1,"132":3,"135":1,"136":3,"141":1,"146":1}}],["luizm",{"2":{"1":2}}],["dynamic",{"2":{"141":1}}],["dylibs",{"2":{"141":1}}],["due",{"2":{"112":1}}],["duration",{"0":{"66":1},"2":{"62":1,"66":4,"77":1,"94":1}}],["during",{"2":{"1":1,"6":3,"68":1,"84":1,"146":1}}],["danhper",{"2":{"115":1}}],["data",{"0":{"54":1,"56":1,"57":1,"74":1},"1":{"55":1,"56":1,"57":1},"2":{"50":6,"53":2,"54":1,"56":4,"57":3,"58":1,"67":1,"74":1,"77":2,"87":11,"105":1,"141":5}}],["daily",{"2":{"15":1}}],["d",{"2":{"22":2,"53":1,"87":2}}],["dnf",{"2":{"18":2}}],["drive",{"2":{"110":2}}],["driven",{"2":{"15":1,"107":1}}],["dropdown",{"2":{"14":1}}],["disabling",{"2":{"67":2}}],["disabled",{"2":{"67":1,"78":2}}],["disable",{"0":{"67":1},"2":{"62":1,"66":1,"67":2,"77":1,"94":1}}],["displayed",{"2":{"128":1}}],["display",{"2":{"59":4,"133":1,"134":1}}],["distro",{"2":{"110":1}}],["distributed",{"2":{"41":2}}],["distinct",{"2":{"33":1}}],["dist",{"2":{"3":1}}],["differentiating",{"2":{"36":1}}],["different",{"2":{"22":1,"36":2,"45":1,"86":1,"88":1}}],["difficult",{"2":{"6":1}}],["direct",{"2":{"148":1}}],["directories",{"2":{"76":3,"120":1,"132":1}}],["directory",{"2":{"2":2,"28":3,"30":2,"37":1,"45":1,"53":2,"55":1,"61":4,"73":1,"76":1,"105":4,"106":1,"110":1,"124":3,"125":1,"132":1,"138":1,"141":1}}],["directly",{"2":{"47":1,"61":1,"105":1}}],["direnv",{"0":{"37":1},"2":{"37":3,"106":1}}],["dirmngr",{"2":{"25":1}}],["dir=",{"2":{"22":3,"56":2,"57":1,"73":1,"74":1}}],["dir",{"0":{"56":1,"57":1,"73":1,"74":1},"2":{"2":1,"22":4,"50":6,"53":2,"56":2,"57":2,"67":1,"74":1,"77":5,"78":1,"87":21,"105":1,"141":5,"145":1}}],["doe",{"2":{"71":1,"73":1,"74":1}}],["doesn",{"2":{"45":1}}],["does",{"2":{"37":1,"38":1,"39":3,"40":1,"66":2,"67":3,"110":1}}],["don",{"2":{"51":1}}],["downloaded",{"2":{"121":1,"124":1,"125":2,"139":1}}],["download",{"0":{"19":1,"20":1,"21":1,"43":1,"55":1,"65":1,"124":1},"1":{"20":1,"21":1},"2":{"43":1,"46":1,"53":1,"55":1,"61":2,"62":1,"69":1,"77":1,"86":1,"120":2,"121":2,"124":9,"125":6}}],["downloading",{"2":{"17":1,"61":1,"96":1}}],["downloads",{"2":{"3":1,"65":1,"124":1}}],["do",{"2":{"11":1,"22":1,"23":1,"39":1,"47":1,"51":1,"76":1,"107":1,"109":1}}],["dockerized",{"2":{"8":1}}],["docker",{"0":{"8":1},"2":{"8":1}}],["docsify",{"2":{"11":2}}],["docs",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1},"2":{"7":3,"10":3,"12":2,"13":3,"14":3,"37":1,"38":1,"39":1,"59":1,"94":2,"111":1}}],["documented",{"2":{"6":1}}],["documentation",{"2":{"2":1,"4":1,"5":1,"7":1,"9":1,"11":1,"12":2,"13":2,"14":1,"59":1,"118":1,"120":1,"121":1,"128":2,"129":1,"130":1,"131":2}}],["deemed",{"2":{"125":1}}],["decompressed",{"2":{"124":1}}],["declares",{"2":{"61":1}}],["deps",{"0":{"129":1},"2":{"120":1,"129":1}}],["depends",{"2":{"146":1}}],["depend",{"2":{"70":1}}],["dependency",{"2":{"25":1,"38":1,"39":1,"110":1,"119":1,"129":1}}],["dependencies",{"0":{"18":1,"25":1},"2":{"10":1,"17":1,"25":2,"38":2,"39":1,"120":1,"129":1}}],["depending",{"2":{"18":1,"37":1,"70":1,"121":1}}],["delete",{"2":{"65":2}}],["describes",{"2":{"78":1}}],["describe",{"2":{"70":1,"130":1}}],["described",{"2":{"58":1}}],["description",{"2":{"12":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"120":2,"121":1,"123":1,"124":1,"125":1,"127":1,"128":2,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1}}],["description>",{"2":{"7":1}}],["descriptor",{"2":{"6":1}}],["desired",{"2":{"30":1}}],["debug",{"2":{"59":1,"83":1}}],["debugging",{"2":{"6":2}}],["debian",{"2":{"25":1}}],["demonstration",{"2":{"24":1}}],["definitions",{"2":{"33":1}}],["defined",{"2":{"30":1,"61":2}}],["defineconfig",{"2":{"14":1}}],["defines",{"2":{"14":1,"62":1}}],["define",{"2":{"7":1,"141":1}}],["defaults",{"2":{"22":1,"29":1,"50":1,"61":1,"76":2,"94":1,"143":2}}],["default",{"0":{"72":1},"2":{"1":1,"7":1,"10":1,"13":1,"14":1,"22":2,"50":1,"59":3,"62":2,"68":1,"70":1,"72":1,"77":8,"84":1,"87":1,"92":1,"105":1,"118":1,"125":1,"133":1,"134":3,"143":1}}],["deterministic",{"2":{"137":1}}],["determining",{"2":{"136":1}}],["determines",{"2":{"105":1}}],["determine",{"2":{"50":1,"94":1,"127":1,"137":2,"148":1}}],["determined",{"2":{"7":1}}],["detecting",{"0":{"112":1}}],["detail",{"2":{"14":1}}],["detailed",{"2":{"12":1,"120":1}}],["details",{"2":{"3":1,"101":1,"106":1,"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"134":1,"136":1,"137":1}}],["dev",{"2":{"1":1,"11":1,"107":2}}],["developed",{"2":{"92":1}}],["developers",{"2":{"61":1}}],["develop",{"2":{"1":1}}],["development",{"0":{"2":1,"11":1},"1":{"3":1,"4":1},"2":{"1":2,"8":1,"10":1,"11":2,"33":1}}],["bit",{"2":{"141":2}}],["binaries",{"2":{"50":1,"61":2,"120":2,"132":3,"133":1}}],["binary",{"0":{"55":1},"2":{"41":1,"46":1,"47":1,"53":1,"55":2,"65":3,"120":1,"121":1,"124":5,"125":1}}],["bin",{"0":{"123":1,"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":2,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1},"2":{"2":1,"55":3,"73":1,"77":1,"105":1,"120":18,"121":1,"123":1,"124":3,"125":7,"127":2,"128":1,"129":2,"130":2,"131":2,"132":4,"133":1,"134":5,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"146":2}}],["bottom",{"2":{"112":1}}],["both",{"2":{"13":1,"31":1,"60":1,"143":1}}],["bound",{"2":{"110":1}}],["boolean",{"2":{"48":1}}],["by",{"0":{"51":1,"106":1},"2":{"7":1,"13":1,"14":1,"15":1,"22":6,"29":1,"32":1,"34":1,"36":1,"39":1,"44":1,"45":1,"50":2,"51":2,"52":3,"58":1,"59":1,"61":3,"62":1,"63":1,"77":1,"78":1,"84":2,"94":1,"101":1,"105":6,"106":1,"111":1,"117":1,"121":1,"123":2,"124":1,"125":1,"127":3,"134":2,"135":1,"137":1,"141":2,"148":1}}],["burden",{"2":{"38":1}}],["but",{"2":{"22":1,"76":1,"79":1,"94":1,"111":1,"128":1}}],["built",{"2":{"10":1,"36":1,"49":1,"86":1}}],["build",{"2":{"7":1,"11":1,"39":1,"125":1,"145":1}}],["bump",{"2":{"7":1}}],["bug",{"2":{"2":1,"83":1}}],["blame",{"0":{"4":1},"2":{"4":11}}],["baz`",{"2":{"141":1}}],["baz",{"2":{"141":1}}],["banned",{"2":{"119":1}}],["bat",{"2":{"50":5,"141":6}}],["bats",{"0":{"5":1,"6":1},"1":{"6":1},"2":{"1":3,"2":2,"4":1,"5":2,"6":7}}],["bar`",{"2":{"50":2,"141":1}}],["bar",{"2":{"50":3,"69":2,"141":1}}],["back",{"2":{"22":2,"29":1}}],["basis",{"2":{"31":1}}],["based",{"2":{"127":1}}],["base",{"2":{"8":1}}],["bash`",{"2":{"141":3}}],["bash1",{"2":{"137":1}}],["bashbin",{"2":{"132":1}}],["bashgit",{"2":{"129":1,"131":1}}],["bashasdf",{"2":{"93":1}}],["bashexport",{"2":{"56":1,"57":1}}],["bashrc",{"2":{"22":6,"55":1,"56":1,"87":3}}],["bash",{"2":{"1":3,"2":4,"5":2,"22":20,"41":2,"50":2,"51":2,"56":1,"70":1,"77":1,"87":14,"112":1,"118":1,"123":1,"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":2,"137":1,"138":1,"139":1,"140":1,"141":8,"142":1}}],["broken",{"2":{"32":1}}],["brew",{"2":{"18":1,"21":1,"22":12,"25":1,"86":2,"87":7}}],["breaks",{"2":{"58":1}}],["breaking",{"0":{"42":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1},"2":{"7":2,"41":1,"50":1,"51":1}}],["break",{"2":{"1":2,"58":1}}],["brazilian",{"2":{"14":1}}],["branches",{"2":{"144":1}}],["branch",{"2":{"1":1,"7":1,"10":1,"20":1,"59":3,"61":1,"92":1,"96":1,"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"136":1,"143":2}}],["br",{"2":{"14":7}}],["beginning",{"2":{"123":1}}],["begin",{"2":{"98":1,"99":1}}],["begins",{"2":{"59":1,"97":1,"100":1}}],["between",{"2":{"66":1}}],["better",{"2":{"45":1}}],["because",{"2":{"40":1,"46":1,"47":1,"52":1,"105":1,"142":1}}],["become",{"2":{"32":1}}],["becomes",{"2":{"7":1}}],["being",{"2":{"40":1,"48":1,"59":2,"66":1,"92":1,"105":1,"112":1,"121":1,"123":1,"128":2,"129":1,"130":1,"131":1,"141":1,"142":1}}],["behaviour",{"2":{"37":1,"66":1,"125":1}}],["behavior",{"2":{"22":1}}],["below",{"2":{"15":1,"22":3,"23":1,"62":1,"118":1,"121":1}}],["been",{"0":{"44":1,"45":1,"46":1,"47":1,"50":1},"2":{"13":1,"45":1,"48":1,"66":1,"87":2,"94":1,"120":2,"121":1,"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"136":1,"138":1}}],["before",{"2":{"2":2,"5":1,"11":1,"69":3,"70":1,"120":1,"133":1,"137":1,"140":1,"145":1}}],["best",{"2":{"2":1,"22":1,"40":1,"53":1}}],["be",{"0":{"49":1},"2":{"1":1,"3":1,"6":3,"18":1,"22":14,"25":1,"30":1,"33":1,"40":1,"45":1,"46":1,"48":1,"49":2,"50":3,"51":3,"61":6,"62":1,"67":1,"69":1,"70":1,"71":3,"72":2,"73":2,"74":2,"87":1,"93":1,"94":1,"105":3,"106":2,"110":1,"112":1,"123":1,"124":4,"125":3,"127":5,"128":5,"129":3,"130":4,"131":4,"132":3,"133":1,"134":1,"135":1,"136":1,"137":2,"138":1,"141":2,"142":1,"143":1}}],["io",{"2":{"131":1}}],["irrelevant",{"2":{"78":1}}],["i",{"2":{"55":1,"111":1,"135":1}}],["iex",{"2":{"52":1}}],["ideally",{"2":{"128":1}}],["identify",{"2":{"34":1}}],["ides",{"2":{"4":1}}],["importantly",{"2":{"110":1}}],["improperly",{"2":{"52":1}}],["improving",{"2":{"15":1}}],["implement",{"2":{"118":1}}],["implemented",{"2":{"51":2,"118":1}}],["implementation",{"2":{"33":1,"46":1,"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"134":1,"136":1,"137":1}}],["images",{"0":{"8":1},"2":{"8":2}}],["i18n",{"0":{"14":1},"2":{"14":1}}],["ignorerevsfile",{"2":{"4":1}}],["ignored",{"2":{"3":1}}],["ignore",{"0":{"4":1},"2":{"3":1,"4":6,"72":1}}],["issue",{"2":{"112":1,"141":1}}],["issues",{"2":{"16":1,"125":1}}],["isn",{"2":{"51":1}}],["is",{"0":{"43":1},"2":{"2":1,"3":1,"4":1,"6":1,"7":3,"11":2,"12":1,"13":1,"14":1,"15":1,"18":1,"22":5,"23":1,"27":1,"29":1,"31":1,"33":2,"34":4,"36":2,"37":1,"38":2,"39":2,"40":3,"41":3,"43":1,"45":1,"47":2,"48":6,"50":4,"52":1,"53":4,"59":1,"61":5,"62":1,"64":2,"66":1,"67":1,"69":4,"73":1,"75":1,"77":5,"78":3,"79":1,"89":1,"94":4,"96":1,"101":1,"105":2,"109":1,"110":3,"112":2,"117":1,"120":1,"123":2,"124":4,"125":2,"127":1,"128":2,"132":1,"135":1,"137":3,"141":4,"142":4,"143":5,"146":1,"148":2}}],["its",{"2":{"22":1,"23":1,"36":1,"39":1,"40":1,"106":1,"123":1,"124":1,"129":1,"130":1,"131":1,"137":1,"142":1}}],["itself",{"2":{"1":1,"141":1,"143":1}}],["items",{"2":{"22":1}}],["it",{"0":{"34":1},"2":{"1":1,"2":1,"4":2,"11":1,"13":1,"22":1,"38":1,"40":1,"41":2,"43":1,"47":2,"48":2,"50":2,"51":2,"52":4,"53":3,"54":1,"55":1,"58":1,"61":2,"65":1,"67":1,"69":1,"74":1,"78":1,"84":1,"87":2,"89":1,"101":1,"105":4,"112":2,"121":1,"123":1,"124":2,"141":2,"142":1,"145":1,"146":1}}],["if",{"2":{"1":1,"2":1,"22":6,"43":1,"48":2,"50":1,"51":1,"53":1,"56":2,"58":3,"59":1,"63":1,"66":2,"67":2,"68":1,"69":1,"71":1,"72":1,"73":1,"74":2,"75":2,"76":3,"86":1,"87":3,"92":1,"94":2,"96":1,"101":2,"106":1,"112":2,"123":3,"124":3,"125":4,"127":3,"128":2,"129":2,"130":2,"131":2,"132":3,"133":2,"134":2,"136":2,"137":1,"141":2,"142":2,"143":2,"146":2,"148":1}}],["index",{"0":{"148":1},"2":{"91":1,"148":2}}],["independent",{"2":{"89":1}}],["indicating",{"2":{"48":1}}],["indicates",{"2":{"7":1,"48":1}}],["individually",{"2":{"14":1}}],["inside",{"2":{"59":1,"133":1,"134":1}}],["instruct",{"2":{"132":1}}],["instructions",{"2":{"22":5,"87":3,"110":1,"148":1}}],["instance",{"2":{"111":1,"127":1}}],["installable",{"2":{"120":1,"123":1}}],["installations",{"2":{"93":1}}],["installation",{"0":{"23":1,"53":1,"80":1},"1":{"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"17":1,"22":2,"23":1,"25":1,"53":2,"70":1,"77":1,"78":1,"84":2,"86":1,"105":2,"125":1,"148":2}}],["installing",{"2":{"17":4,"53":1,"58":1,"84":1,"111":1}}],["installs",{"2":{"3":1,"43":1,"105":1,"120":1,"125":1,"127":1,"134":1}}],["installed",{"0":{"90":1,"98":1,"111":1,"112":1},"2":{"2":1,"22":1,"29":1,"34":3,"36":1,"48":2,"59":5,"61":1,"67":2,"69":2,"77":1,"84":1,"85":1,"86":1,"105":3,"111":1,"121":2,"124":1,"125":1,"127":2,"128":2,"129":2,"130":2,"131":2,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"143":2}}],["install",{"0":{"18":1,"22":1,"24":1,"26":1,"27":1,"96":1,"97":1,"125":1},"1":{"25":1,"26":1},"2":{"1":2,"4":1,"10":4,"18":6,"21":1,"23":2,"24":1,"25":5,"27":3,"46":1,"48":2,"53":1,"54":1,"59":10,"61":4,"65":3,"69":1,"74":1,"84":1,"96":2,"97":5,"111":1,"117":1,"120":1,"121":4,"124":11,"125":19,"127":6,"128":7,"129":7,"130":8,"131":7,"132":11,"133":5,"134":6,"136":5}}],["instead",{"2":{"34":1,"48":1,"64":1,"102":1,"105":2,"142":1}}],["info",{"0":{"83":1},"2":{"56":1,"59":1,"83":1}}],["information",{"2":{"4":1,"7":1,"59":1,"83":1,"120":1,"128":1}}],["investigation",{"2":{"52":1}}],["invoke",{"2":{"51":1,"120":1,"123":1,"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1}}],["involves",{"2":{"17":1}}],["invocation",{"2":{"4":1}}],["including",{"2":{"135":1}}],["include",{"2":{"40":1,"52":1,"61":1,"124":1}}],["includes",{"2":{"1":1}}],["inconsistent",{"2":{"22":1}}],["introduce",{"2":{"45":1}}],["introduction",{"0":{"33":1},"1":{"34":1,"35":1,"36":1,"37":1,"38":1,"39":1,"40":1},"2":{"124":1}}],["intend",{"2":{"109":1,"110":1}}],["intended",{"2":{"40":1}}],["integrators",{"2":{"78":1}}],["integrate",{"2":{"37":1}}],["integer",{"2":{"66":1,"68":1}}],["interactively",{"2":{"118":1}}],["internal",{"0":{"78":1},"2":{"78":1}}],["internationalization",{"2":{"14":1}}],["interface",{"2":{"33":2,"141":1}}],["interest",{"2":{"16":1}}],["interpreter",{"2":{"1":1}}],["into",{"2":{"14":1,"22":2,"32":1,"41":1,"48":1}}],["in",{"0":{"91":1},"2":{"1":1,"3":2,"5":2,"6":1,"10":1,"12":3,"13":2,"14":3,"15":1,"18":1,"22":3,"28":2,"29":1,"30":2,"32":1,"33":1,"34":1,"36":2,"40":1,"41":2,"45":2,"46":1,"47":2,"48":1,"49":1,"50":2,"51":3,"52":1,"53":1,"55":3,"56":1,"57":1,"58":2,"59":4,"61":9,"63":1,"66":5,"77":1,"80":1,"86":1,"87":17,"89":1,"94":2,"101":1,"102":1,"105":10,"107":1,"111":1,"118":1,"121":1,"123":3,"124":3,"125":5,"128":1,"132":2,"135":1,"136":1,"141":1,"142":4,"143":1,"147":1,"148":1}}],["initially",{"2":{"66":1,"132":1}}],["initialise",{"2":{"22":1}}],["initial",{"0":{"1":1,"10":1}}],["veggies",{"2":{"132":2}}],["very",{"2":{"36":1}}],["versioning",{"2":{"117":1}}],["version=1",{"2":{"101":1}}],["versioned",{"2":{"92":1}}],["version`",{"2":{"59":1}}],["version>",{"2":{"59":13,"84":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":8,"104":1,"143":1}}],["version",{"0":{"27":1,"28":1,"31":1,"41":1,"63":1,"96":1,"97":1,"100":1,"101":1,"102":1,"103":1,"104":1},"1":{"29":1,"30":1,"31":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"7":1,"10":1,"17":1,"27":3,"28":3,"29":1,"31":5,"33":3,"34":2,"36":2,"40":1,"41":1,"43":1,"44":2,"45":2,"46":1,"48":5,"49":2,"52":1,"53":1,"54":1,"58":1,"59":23,"61":4,"62":1,"63":4,"64":2,"69":1,"77":1,"81":1,"84":3,"97":1,"100":1,"101":9,"102":4,"105":2,"117":1,"120":8,"121":3,"123":4,"124":8,"125":10,"127":14,"128":6,"129":6,"130":6,"131":6,"132":6,"133":4,"134":6,"135":3,"136":7,"137":7,"143":6,"144":1,"145":2}}],["versions",{"0":{"61":1,"72":1,"85":1,"95":1,"98":1,"99":1},"1":{"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1},"2":{"1":2,"10":1,"17":2,"23":1,"27":3,"28":1,"29":3,"30":3,"32":2,"33":2,"34":1,"39":1,"40":2,"41":1,"44":3,"45":2,"46":1,"53":2,"59":10,"60":1,"61":12,"63":3,"67":1,"72":5,"74":1,"77":4,"85":6,"87":14,"93":1,"98":1,"99":1,"101":4,"103":3,"105":1,"120":1,"123":7,"125":1,"127":3}}],["vlang",{"2":{"131":2}}],["v",{"2":{"119":1,"123":1,"131":1}}],["v1",{"2":{"61":1}}],["v0",{"2":{"20":1}}],["view",{"0":{"103":1}}],["vic",{"2":{"89":1,"115":1}}],["via",{"2":{"17":1,"22":2,"24":1,"31":1,"33":1,"40":1,"51":1,"53":1,"77":1,"78":1,"84":2,"86":1,"89":2,"94":1,"105":1,"111":1,"146":1,"148":1}}],["vitepress",{"0":{"13":1},"2":{"11":2,"13":4,"14":4}}],["vuepress",{"2":{"11":2}}],["v2",{"2":{"11":1,"123":1,"144":1}}],["v8",{"2":{"10":1}}],["vscode",{"2":{"4":2}}],["validate",{"2":{"143":1}}],["valid",{"2":{"72":1,"137":1}}],["values",{"2":{"62":1}}],["value",{"2":{"56":1,"66":1,"72":1,"74":1,"75":3,"77":2}}],["vars",{"2":{"121":1}}],["varies",{"2":{"70":1}}],["variables",{"0":{"70":1,"121":1},"1":{"71":1,"72":1,"73":1,"74":1,"75":1,"76":1},"2":{"33":1,"37":2,"47":1,"60":1,"70":2,"77":1,"106":1,"121":3,"123":2,"124":1,"125":1,"127":1,"128":2,"129":2,"130":3,"131":2,"132":1,"133":1,"134":1,"135":2,"136":1,"137":2,"138":1,"139":1,"140":1,"147":1}}],["variable",{"2":{"2":1,"22":1,"47":1,"48":1,"56":1,"62":1,"68":1,"101":2,"125":1,"146":1}}],["var",{"2":{"22":3,"87":3}}],["vagrant",{"2":{"3":1}}],["vm",{"2":{"1":1,"3":1,"10":2,"20":1,"21":2,"22":9,"26":1,"59":2,"87":7,"90":1,"118":1,"128":1,"143":1,"144":2,"145":1,"148":1}}],["txt1",{"2":{"123":1}}],["txtlegacy",{"2":{"62":1}}],["txtmanage",{"2":{"59":1}}],["turns",{"2":{"58":1}}],["typically",{"2":{"48":1,"72":1,"143":1}}],["type=ref",{"2":{"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"136":1}}],["type=version",{"2":{"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"136":1}}],["type",{"2":{"7":1,"12":1,"32":1,"121":2,"124":1,"125":1,"127":1,"128":2,"129":2,"130":2,"131":2,"132":1,"133":1,"134":1,"136":1}}],["typescript",{"2":{"13":1}}],["types",{"2":{"7":1}}],["type>",{"2":{"7":1}}],["two",{"2":{"48":1,"85":1,"105":1,"118":1}}],["tailored",{"2":{"128":1,"129":2,"130":1,"131":1}}],["tail",{"2":{"127":1}}],["tac",{"2":{"123":1}}],["tag",{"2":{"61":1,"96":1,"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"136":1,"143":1}}],["tab",{"2":{"22":1}}],["takes",{"2":{"39":1,"75":1}}],["take",{"2":{"22":1,"68":1}}],["taking",{"2":{"22":1}}],["tap",{"2":{"6":1}}],["travis",{"2":{"145":1}}],["travisci",{"0":{"145":1}}],["trash",{"2":{"67":1}}],["truffleruby+graalvm",{"2":{"127":1}}],["truffleruby",{"2":{"127":2}}],["truly",{"2":{"39":1}}],["triggered",{"2":{"94":1}}],["trigger",{"2":{"66":4,"67":1}}],["trim",{"2":{"22":2}}],["tree",{"2":{"39":1}}],["try",{"2":{"2":1,"34":1,"38":1}}],["t",{"2":{"6":2,"45":1,"51":2,"58":1,"87":1}}],["tmp",{"2":{"3":1}}],["titles",{"2":{"12":1}}],["title",{"2":{"7":3,"12":1,"14":1,"131":1}}],["time",{"2":{"27":1,"28":1,"66":1,"114":1,"125":2}}],["times",{"2":{"6":1}}],["timgluz",{"2":{"1":1}}],["tips",{"0":{"6":1}}],["tip",{"2":{"2":1,"7":1,"61":1,"148":1}}],["textpre",{"2":{"69":1}}],["text",{"2":{"59":1,"128":1,"130":1}}],["template",{"2":{"118":2,"142":1}}],["templates",{"0":{"52":1,"142":1},"2":{"142":1}}],["temporarily",{"2":{"2":1}}],["tell",{"2":{"29":1}}],["terminology",{"2":{"45":1}}],["terminal",{"2":{"6":1,"22":1}}],["term",{"2":{"15":1,"107":1}}],["teams",{"2":{"40":1}}],["team",{"2":{"15":1,"33":1,"52":1,"107":1,"142":1}}],["tests",{"2":{"2":3,"5":3,"6":3,"101":1}}],["test",{"2":{"2":5,"4":1,"5":3,"6":4,"7":1,"44":2,"58":1,"101":1,"110":1,"143":9,"144":6,"145":2}}],["testing",{"0":{"5":1,"58":1,"143":1},"1":{"6":1,"144":1,"145":1},"2":{"1":2,"143":2,"144":1,"146":1}}],["tokens",{"2":{"147":1}}],["token",{"0":{"147":1},"2":{"146":4,"147":2}}],["toctou",{"2":{"125":1}}],["too",{"2":{"96":1}}],["tool>",{"2":{"144":1,"145":2}}],["tooling",{"2":{"1":1}}],["tool",{"0":{"31":1,"61":1,"72":1},"2":{"1":2,"7":1,"10":2,"17":3,"23":1,"27":1,"28":6,"29":2,"30":2,"32":1,"33":3,"34":3,"36":2,"39":2,"40":3,"45":1,"51":1,"59":4,"60":1,"61":14,"63":1,"67":1,"72":4,"74":1,"77":4,"84":1,"87":14,"93":2,"101":7,"102":2,"103":3,"105":1,"111":1,"117":1,"118":2,"120":6,"121":1,"124":4,"125":6,"127":13,"128":4,"129":3,"130":5,"131":4,"132":4,"133":2,"134":3,"135":1,"136":3,"137":2,"138":1,"139":1,"140":1,"143":6,"145":2}}],["tools",{"2":{"1":3,"3":1,"8":1,"10":1,"18":1,"22":1,"28":1,"29":1,"32":1,"33":2,"34":1,"36":2,"39":1,"40":2,"61":1,"84":1,"85":1,"88":2,"107":1,"119":2,"127":1,"132":2,"141":1}}],["topic",{"2":{"15":1}}],["to",{"0":{"41":1,"51":1,"57":1,"102":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1,"57":1,"58":1},"2":{"1":5,"2":6,"3":1,"4":5,"6":2,"7":1,"8":1,"11":4,"13":2,"15":2,"17":1,"18":1,"22":47,"23":2,"25":1,"27":1,"28":2,"29":3,"31":2,"32":1,"33":4,"34":2,"36":1,"37":1,"39":2,"40":1,"45":3,"46":2,"47":1,"48":1,"49":1,"50":5,"51":2,"52":1,"53":3,"54":1,"55":2,"56":2,"57":1,"58":4,"59":8,"61":11,"63":2,"64":2,"65":1,"66":2,"68":2,"69":2,"71":2,"72":1,"73":1,"74":1,"75":1,"76":8,"78":2,"83":1,"86":1,"87":20,"88":2,"92":1,"94":4,"96":1,"98":1,"99":1,"101":4,"102":2,"105":9,"106":2,"107":2,"109":1,"110":3,"111":4,"112":2,"113":1,"114":1,"117":2,"118":3,"120":6,"121":7,"123":3,"124":6,"125":7,"127":8,"128":4,"129":5,"130":5,"131":5,"132":4,"133":3,"134":4,"135":3,"136":2,"137":5,"138":2,"139":1,"140":1,"141":8,"142":2,"143":6,"145":3,"146":1,"147":2,"148":3}}],["those",{"2":{"98":1,"99":1,"107":1,"111":1,"132":1,"135":1}}],["though",{"2":{"38":1,"124":1}}],["things",{"2":{"58":2}}],["third",{"2":{"48":2}}],["this",{"2":{"1":1,"4":1,"6":1,"7":4,"11":2,"22":5,"23":2,"30":1,"31":3,"36":1,"39":1,"43":1,"45":1,"46":1,"47":2,"49":1,"50":2,"51":3,"52":4,"59":1,"61":4,"62":1,"67":1,"72":1,"75":1,"78":3,"83":1,"84":2,"87":18,"92":1,"93":1,"94":1,"105":4,"110":1,"111":1,"123":4,"124":4,"125":3,"127":2,"128":2,"129":2,"130":2,"131":2,"132":3,"133":1,"134":2,"135":2,"136":1,"137":2,"138":1,"139":1,"140":1,"141":2,"142":4,"143":1,"146":1,"147":1}}],["through",{"2":{"123":1}}],["throughout",{"2":{"27":1,"121":1}}],["three",{"2":{"32":1,"48":1,"53":1}}],["that",{"2":{"14":1,"22":3,"27":1,"28":1,"29":1,"32":1,"34":2,"37":1,"38":1,"39":1,"40":2,"43":1,"45":3,"48":1,"50":1,"51":4,"52":4,"53":1,"56":1,"58":1,"59":2,"61":3,"66":1,"85":1,"86":1,"87":15,"97":1,"98":1,"99":1,"100":1,"105":4,"123":1,"124":2,"125":1,"127":3,"128":2,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"141":2,"142":1,"143":2,"148":1}}],["thank",{"2":{"113":1}}],["thanks",{"0":{"113":1},"1":{"114":1,"115":1,"116":1},"2":{"16":1}}],["than",{"2":{"11":1,"41":1,"47":1,"52":2,"53":1,"66":1,"76":1,"125":2}}],["themselves",{"2":{"105":1}}],["them",{"2":{"32":1,"34":1,"51":1,"61":1,"123":1}}],["themeconfig",{"2":{"14":3}}],["theme",{"2":{"13":1}}],["there",{"2":{"22":1,"37":1,"41":1,"50":2,"53":1,"94":1,"118":1,"142":1,"146":1}}],["their",{"2":{"13":1,"14":1,"15":1,"16":1,"33":1,"38":1,"87":2,"89":1,"107":1,"136":1,"141":1}}],["they",{"2":{"13":1,"25":2,"49":1,"50":6,"59":1,"107":1,"123":2,"127":1}}],["these",{"2":{"8":1,"13":1,"15":1,"18":1,"34":1,"36":1,"50":1,"87":1,"107":1,"117":1}}],["then",{"2":{"1":1,"29":1,"30":1,"55":1,"68":2,"69":1,"94":2,"112":1,"124":1,"142":1,"146":1,"147":1}}],["the",{"0":{"26":1,"55":1,"57":1,"94":1},"2":{"1":6,"2":7,"3":3,"4":4,"6":3,"7":11,"8":1,"10":5,"11":8,"12":4,"13":10,"14":11,"15":2,"16":1,"17":1,"21":1,"22":38,"23":3,"24":1,"25":1,"27":4,"28":5,"29":4,"30":2,"31":4,"32":3,"33":2,"34":3,"36":3,"37":1,"38":3,"39":1,"40":3,"41":1,"44":2,"45":3,"46":4,"47":3,"48":10,"50":4,"51":1,"52":9,"53":4,"54":2,"55":3,"56":3,"57":1,"58":3,"59":30,"60":1,"61":18,"62":7,"63":2,"64":3,"65":2,"66":7,"67":10,"68":4,"69":2,"70":1,"71":1,"72":3,"73":3,"74":2,"75":3,"76":7,"77":7,"78":3,"79":1,"80":1,"81":2,"83":1,"84":4,"85":2,"86":1,"87":37,"88":1,"89":4,"91":1,"92":4,"93":2,"94":6,"96":1,"101":11,"102":3,"105":26,"106":1,"107":1,"110":3,"111":2,"112":2,"113":1,"114":1,"116":1,"118":6,"120":11,"121":16,"123":4,"124":15,"125":22,"127":26,"128":8,"129":6,"130":6,"131":5,"132":6,"133":9,"134":20,"135":4,"136":5,"137":13,"138":4,"139":5,"140":3,"141":11,"142":4,"143":8,"144":1,"145":1,"147":1,"148":6}}],["syncing",{"0":{"94":1}}],["synchronization",{"2":{"67":1,"94":1}}],["synced",{"2":{"66":1,"67":1,"94":1}}],["sync",{"2":{"66":8,"67":4,"94":4}}],["syncs",{"2":{"66":1}}],["sysctl",{"2":{"68":1}}],["syscall",{"0":{"51":1},"2":{"50":1,"51":1}}],["systems",{"2":{"76":1}}],["system",{"0":{"55":1,"102":1},"2":{"1":1,"18":1,"22":1,"29":2,"36":1,"39":1,"40":2,"53":2,"61":4,"70":1,"102":5,"105":1,"120":1,"128":1,"129":2,"130":1,"131":1}}],["src",{"2":{"61":1}}],["small",{"2":{"38":1,"79":1,"119":1}}],["sample",{"2":{"144":1,"145":1}}],["same",{"2":{"11":1,"14":2,"33":1,"40":1,"50":6,"54":1,"56":1,"57":1,"96":1,"101":1,"137":2,"141":5}}],["say",{"2":{"92":1}}],["save",{"2":{"22":3}}],["split",{"2":{"48":1}}],["space",{"2":{"36":1,"61":1,"123":1,"132":1,"136":1}}],["spack",{"2":{"18":2}}],["spec",{"2":{"13":1}}],["specify",{"2":{"96":1}}],["specifying",{"2":{"45":1,"59":1}}],["specified",{"2":{"45":1,"48":1,"59":1,"61":1,"66":1,"105":1,"120":3,"124":2,"125":3,"132":1,"134":6,"136":1,"143":2}}],["specifically",{"2":{"137":1}}],["specifics",{"2":{"69":1}}],["specific",{"2":{"2":1,"3":2,"22":1,"40":1,"59":2,"60":1,"62":1,"92":1,"96":1,"117":1,"120":1,"124":1,"125":1,"143":1}}],["special",{"2":{"6":1}}],["speed",{"2":{"2":1}}],["suggest",{"2":{"123":1}}],["suggested",{"2":{"48":2}}],["suffice",{"2":{"123":1}}],["suite",{"2":{"110":1}}],["suitable",{"2":{"52":1,"137":1}}],["success",{"2":{"124":1,"125":2,"127":1,"128":1,"129":1,"130":1,"131":1}}],["successful",{"2":{"65":1}}],["such",{"2":{"61":1,"117":1}}],["subcommand",{"2":{"141":1}}],["subsystem",{"2":{"109":1,"110":1}}],["subsequent",{"2":{"135":1}}],["subsequently",{"2":{"11":1}}],["subset",{"2":{"27":1}}],["subdirectories",{"2":{"61":1}}],["sure",{"2":{"22":1,"58":1,"106":1,"141":1}}],["sudo",{"2":{"18":1}}],["suppose",{"2":{"141":1}}],["supporting",{"2":{"107":1}}],["supports",{"2":{"31":2,"96":1}}],["supported",{"0":{"21":1,"52":1},"2":{"14":1,"31":1,"44":2,"69":1,"101":1,"109":1}}],["support",{"0":{"109":1,"110":1},"2":{"1":1,"11":1,"14":1,"40":1,"45":1,"61":1,"63":1,"88":1,"109":1,"110":1,"117":2,"124":1}}],["supplanted",{"2":{"11":1}}],["supplying",{"2":{"4":1}}],["ssg",{"2":{"11":1}}],["stderr",{"2":{"135":1}}],["stdout",{"2":{"127":1,"135":1}}],["storing",{"2":{"72":1}}],["stop",{"2":{"66":1}}],["step",{"2":{"57":1}}],["steps",{"2":{"18":1,"32":1,"53":1,"54":1,"86":1,"87":1,"144":1}}],["still",{"2":{"51":1}}],["strategy",{"2":{"144":1}}],["stratus3d",{"2":{"115":1}}],["string",{"2":{"22":2,"59":1,"76":1,"87":2,"97":1,"98":1,"99":1,"100":1,"123":1,"134":2}}],["str",{"2":{"22":2}}],["standard",{"2":{"142":2}}],["status",{"2":{"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1}}],["static",{"2":{"1":1,"11":1}}],["stable",{"0":{"97":1,"100":1,"127":1},"2":{"59":5,"86":1,"97":1,"100":1,"120":2,"127":6,"146":1}}],["starting",{"2":{"22":1}}],["started",{"0":{"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1},"2":{"32":1,"80":1,"118":1}}],["start",{"2":{"11":1,"50":1,"118":1}}],["style",{"2":{"7":1}}],["script",{"2":{"22":2,"40":1,"105":3,"118":1,"120":2,"121":1,"123":5,"124":8,"125":9,"127":5,"128":3,"129":3,"130":3,"131":3,"132":3,"133":2,"134":2,"135":3,"136":2,"137":4,"138":2,"139":2,"140":2,"141":1,"145":2}}],["scripts",{"0":{"119":1,"120":1,"122":1,"126":1},"1":{"123":1,"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1},"2":{"1":2,"2":4,"5":2,"11":1,"22":1,"36":1,"41":2,"50":4,"51":5,"73":1,"105":1,"117":2,"118":2,"119":1,"120":2,"121":2,"141":3}}],["scope",{"2":{"7":1}}],["silent",{"2":{"146":1}}],["signature",{"2":{"123":1,"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1}}],["single",{"2":{"33":1,"40":1,"61":1,"127":1,"137":2}}],["since",{"2":{"7":1,"41":1,"66":2,"84":1}}],["simply",{"2":{"58":1,"137":1}}],["simplicity",{"2":{"40":1}}],["simplify",{"2":{"13":1,"33":1}}],["simplifying",{"2":{"6":1}}],["simpler",{"2":{"53":1}}],["simple",{"2":{"33":1,"77":1,"105":1}}],["similar",{"2":{"32":1,"36":1,"45":1}}],["si",{"2":{"21":1}}],["sidebars",{"2":{"13":1,"14":3}}],["sidebar",{"2":{"13":1,"14":5}}],["site",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1},"2":{"9":1,"10":1,"11":2,"13":2}}],["sorting",{"2":{"123":2}}],["sort",{"2":{"119":1,"123":4}}],["sourcing",{"2":{"22":2,"70":1,"112":1}}],["sourced",{"2":{"22":2,"50":1,"105":1,"112":2,"121":1,"141":1}}],["source",{"2":{"22":5,"48":1,"65":3,"67":1,"68":1,"75":1,"87":11,"96":1,"105":2,"120":1,"121":4,"124":5,"125":3,"138":2,"141":1}}],["sometimes",{"2":{"52":1}}],["something",{"2":{"39":1}}],["some",{"2":{"6":3,"7":3,"8":1,"15":1,"18":1,"25":1,"29":1,"84":1,"106":1,"107":1,"108":1,"109":1,"117":1,"123":1,"137":1}}],["so",{"2":{"4":1,"14":1,"22":1,"25":1,"28":1,"47":1,"51":1,"52":1,"77":10,"87":2,"92":1,"123":1}}],["sent",{"2":{"135":1}}],["sense",{"2":{"50":1}}],["sed",{"2":{"123":1,"129":1}}],["security",{"2":{"107":1}}],["section",{"2":{"22":1,"29":1,"78":1,"101":1,"102":1}}],["separating",{"2":{"61":1}}],["separated",{"2":{"13":1,"14":1,"123":1,"132":1,"136":1}}],["sequence",{"2":{"54":1}}],["self",{"2":{"53":1}}],["selected",{"2":{"52":1,"105":1}}],["selection",{"2":{"14":1,"22":1}}],["session",{"2":{"47":1,"101":2}}],["search",{"2":{"15":1}}],["server",{"2":{"11":1}}],["servers",{"2":{"8":1}}],["semantic",{"2":{"7":1,"64":2}}],["semver",{"2":{"7":4,"127":1}}],["seems",{"2":{"52":1}}],["see",{"2":{"2":1,"3":1,"4":1,"13":1,"15":2,"16":1,"22":2,"27":1,"31":1,"32":1,"37":1,"38":1,"39":1,"66":1,"69":1,"88":1,"91":1,"94":2,"101":1,"111":1,"116":1,"119":1,"120":2,"121":1,"138":1,"139":1,"140":1}}],["sets",{"2":{"101":1}}],["setting",{"2":{"17":1,"47":1,"56":1,"66":1,"70":1,"121":1,"125":1}}],["settings",{"2":{"4":1,"5":1}}],["set",{"0":{"28":1,"56":1,"101":1},"1":{"29":1,"30":1,"31":1},"2":{"2":1,"11":1,"14":1,"22":4,"24":1,"29":1,"34":2,"41":2,"45":1,"47":1,"48":3,"50":1,"52":1,"53":1,"59":7,"61":2,"62":1,"68":1,"70":2,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"87":3,"94":1,"101":2,"102":3,"106":1,"112":1,"125":1,"127":2,"128":1,"129":1,"130":1,"131":1,"137":1,"141":2}}],["setup",{"0":{"1":1,"10":1,"80":1},"2":{"22":4,"77":1,"110":1,"118":1}}],["ships",{"2":{"85":1}}],["shimversions",{"2":{"44":1}}],["shim",{"0":{"52":1,"85":1,"142":1},"2":{"34":1,"44":1,"52":1,"59":3,"81":1,"84":1,"85":4,"105":2,"111":1,"133":2,"134":6,"142":3}}],["shims",{"0":{"51":1,"57":1,"105":1,"106":1,"112":1},"1":{"106":1},"2":{"2":1,"3":1,"33":1,"34":1,"36":1,"52":1,"53":2,"57":2,"59":1,"74":1,"76":1,"84":3,"85":1,"105":4,"106":1,"111":3,"120":1,"125":1,"132":4,"133":1,"135":1,"142":1}}],["sharable",{"2":{"60":1}}],["share",{"2":{"33":1,"83":1}}],["shebang",{"2":{"50":1,"51":5}}],["shellcmd=",{"2":{"146":1}}],["shellcheck",{"2":{"1":3}}],["shell$",{"2":{"141":1}}],["shellfoo",{"2":{"141":1}}],["shellusage",{"2":{"134":1}}],["shelluse",{"2":{"87":3}}],["shellif",{"2":{"87":2}}],["shellpacman",{"2":{"87":4}}],["shellbrew",{"2":{"87":5}}],["shellrm",{"2":{"87":25}}],["shell➜",{"2":{"85":2}}],["shellexport",{"2":{"22":2}}],["shellecho",{"2":{"22":8}}],["shellmkdir",{"2":{"22":4}}],["shellsource",{"2":{"22":2,"87":3}}],["shells",{"2":{"22":1,"37":1}}],["shellgit",{"2":{"20":1}}],["shelldocs",{"2":{"14":1}}],["shellnpm",{"2":{"10":1,"11":2}}],["shellasdf",{"2":{"1":2,"10":2,"26":1,"27":1,"29":1,"30":1,"81":1,"82":1,"83":1,"84":1,"85":1,"89":2,"90":2,"91":1,"92":2,"96":1,"97":2,"98":2,"99":2,"100":2,"101":2,"102":1,"103":1,"104":1,"143":1,"145":1}}],["shell",{"0":{"47":1,"112":1},"2":{"1":3,"2":1,"5":1,"6":1,"10":1,"22":21,"34":1,"36":1,"40":2,"41":1,"47":5,"50":1,"51":1,"52":1,"56":1,"57":1,"58":1,"59":3,"70":2,"77":1,"83":1,"87":9,"101":4,"102":1,"105":2,"112":1,"119":1,"148":1}}],["sh",{"2":{"22":18,"70":1,"76":1,"87":16,"105":3,"112":1,"145":1}}],["shows",{"2":{"62":1}}],["shown",{"2":{"48":1}}],["show",{"0":{"100":1},"2":{"28":1,"59":3,"100":1}}],["shorthand",{"2":{"93":1}}],["short",{"0":{"67":1,"91":1,"94":1},"2":{"15":1,"62":1,"66":1,"67":5,"77":1,"89":2,"91":1,"94":2,"128":1}}],["shortname",{"0":{"148":1},"2":{"15":1,"91":1,"148":2}}],["should",{"2":{"3":1,"25":2,"70":1,"72":1,"78":1,"86":1,"110":1,"119":1,"121":1,"123":2,"124":5,"125":5,"127":7,"128":5,"129":4,"130":4,"131":4,"132":1,"133":1,"134":1,"135":1,"136":1,"137":2}}],["shgit",{"2":{"4":2}}],["shfmt",{"2":{"1":4}}],["s",{"2":{"1":2,"6":2,"10":2,"13":1,"18":1,"22":8,"33":1,"47":1,"51":1,"52":1,"53":2,"54":1,"62":1,"63":1,"87":3,"106":1,"123":1,"134":2,"137":1,"139":2,"141":1,"142":1,"143":2}}],["c",{"2":{"145":1}}],["credits",{"0":{"114":1}}],["creating",{"2":{"12":1,"88":1,"101":1,"118":1}}],["creates",{"2":{"105":1}}],["created",{"2":{"34":1,"84":1,"111":1,"125":1}}],["create",{"0":{"117":1},"1":{"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1},"2":{"2":1,"7":3,"36":1,"40":1,"69":1,"111":2,"120":1,"132":3,"141":1,"147":1}}],["cpuinfo",{"2":{"68":1}}],["cmd=",{"2":{"146":2}}],["cmd",{"0":{"49":1},"2":{"49":2,"50":6,"121":1,"141":1}}],["certain",{"2":{"44":1}}],["centos",{"2":{"25":1}}],["cd",{"2":{"21":1}}],["currently",{"2":{"59":1,"92":1,"110":1}}],["current",{"0":{"48":1,"101":1,"103":1},"2":{"28":3,"30":1,"37":1,"45":1,"47":1,"59":7,"81":1,"84":1,"101":2,"102":1,"103":4,"105":1,"110":1,"133":1,"134":1}}],["curl",{"2":{"18":7,"25":2,"129":1,"146":1}}],["customize",{"2":{"145":1}}],["customised",{"2":{"125":1}}],["customisations",{"2":{"60":1}}],["custom",{"0":{"52":1,"142":1},"2":{"22":2,"61":1,"69":2,"77":6,"120":1,"123":1,"142":1}}],["customarguments",{"2":{"4":1}}],["cleaning",{"2":{"93":1}}],["cli",{"0":{"141":1},"2":{"33":1,"39":1,"84":1}}],["class",{"2":{"14":1}}],["cloned",{"2":{"2":1}}],["clone",{"2":{"1":5,"10":5,"20":1,"21":1,"67":1,"70":1,"118":1,"145":1}}],["ci",{"2":{"7":1,"143":2,"145":1,"147":1}}],["capability",{"2":{"123":1}}],["captured",{"2":{"14":1}}],["calculated",{"2":{"77":1}}],["calculate",{"2":{"68":1}}],["callable",{"2":{"120":1,"141":1}}],["call",{"2":{"119":1,"123":1,"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":2,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1}}],["callback",{"0":{"43":1},"2":{"43":1,"105":1,"138":1,"139":1,"140":1}}],["calls",{"2":{"22":1,"105":1}}],["called",{"2":{"7":1,"22":1,"69":1,"118":1,"137":1,"142":1}}],["causes",{"2":{"61":1}}],["causing",{"2":{"22":1,"49":1}}],["cat",{"2":{"137":1}}],["categories",{"2":{"32":1}}],["catalina",{"2":{"22":2,"87":1}}],["case",{"2":{"31":1,"52":1,"63":1,"87":1,"110":1}}],["candidate",{"2":{"64":2,"127":1}}],["candidates",{"0":{"64":1},"2":{"62":1,"77":1}}],["cannot",{"2":{"46":2,"51":1,"111":1}}],["can",{"2":{"2":1,"6":1,"8":1,"22":1,"27":2,"28":1,"32":2,"33":2,"37":1,"40":1,"46":1,"50":1,"54":1,"58":2,"61":5,"62":1,"63":1,"67":1,"69":1,"71":1,"72":1,"73":1,"74":1,"79":1,"85":1,"87":1,"93":1,"94":1,"96":1,"101":1,"102":1,"105":2,"106":1,"125":1,"130":1,"138":1,"141":2,"148":1}}],["changing",{"2":{"22":2}}],["changed",{"0":{"48":1},"2":{"22":2,"46":1,"87":1}}],["changelog",{"2":{"7":1}}],["change",{"2":{"2":1,"7":3,"51":1}}],["changes",{"0":{"42":1},"1":{"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1},"2":{"2":1,"12":1,"22":1,"41":1,"50":1}}],["chose",{"2":{"55":1}}],["chosen",{"2":{"11":1,"110":1}}],["chore",{"2":{"7":1}}],["chrome",{"2":{"10":1}}],["checked",{"2":{"143":1}}],["check",{"0":{"66":1},"2":{"2":1,"25":1,"33":1,"62":1,"66":1,"77":1,"94":1,"106":1,"121":1,"125":2}}],["cool",{"2":{"103":1}}],["correctly",{"2":{"143":1}}],["correct",{"2":{"78":1,"123":1}}],["cores",{"2":{"68":3,"75":1,"121":1,"125":1}}],["coreutils",{"2":{"18":2}}],["core",{"0":{"23":1,"79":1},"1":{"80":1,"81":1,"82":1,"83":1,"84":1,"85":1,"86":1,"87":1},"2":{"0":1,"1":2,"2":1,"5":1,"6":1,"12":1,"15":2,"17":1,"22":3,"23":1,"32":2,"34":1,"52":1,"73":1,"79":1,"107":2,"119":1,"123":2,"124":1,"125":2,"127":2,"128":3,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":2,"136":1,"137":1,"138":1,"139":1,"140":1,"142":1}}],["copyright",{"2":{"114":1}}],["copy",{"2":{"56":1,"142":1}}],["cold",{"2":{"114":1}}],["column",{"2":{"48":2}}],["columns",{"2":{"48":2}}],["collection",{"2":{"39":1}}],["collaborative",{"2":{"15":1,"107":1}}],["cough",{"2":{"114":1}}],["could",{"2":{"45":1,"48":1,"49":1,"51":2,"127":1,"143":1}}],["course",{"2":{"40":1}}],["conditionally",{"2":{"134":2}}],["considered",{"2":{"129":1,"130":1,"131":1}}],["concurrency=32",{"2":{"75":1}}],["concurrency",{"0":{"68":1,"75":1},"2":{"62":1,"68":1,"75":2,"77":3,"121":1,"125":1}}],["confusion",{"2":{"49":1}}],["confusing",{"2":{"45":1}}],["configs",{"2":{"13":1,"14":2}}],["config",{"0":{"71":1,"130":1,"145":1},"2":{"4":1,"13":4,"14":5,"17":1,"22":38,"31":1,"40":1,"62":1,"71":2,"73":1,"75":2,"77":2,"87":28,"94":2,"112":2,"120":1,"130":1}}],["configured",{"2":{"22":16,"87":2,"94":1}}],["configure",{"2":{"4":2,"64":1,"65":1,"66":1}}],["configurations",{"2":{"33":1}}],["configuration",{"0":{"60":1,"77":1,"78":1},"1":{"61":1,"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1},"2":{"3":1,"11":1,"13":2,"18":1,"22":1,"31":2,"33":1,"34":1,"39":1,"60":1,"62":1,"71":1,"77":7,"78":1,"94":1,"101":1,"120":1,"130":1,"136":1}}],["conveys",{"2":{"45":1}}],["conversations",{"2":{"16":1}}],["conventional",{"0":{"7":1,"12":1},"2":{"7":3,"12":2}}],["continue",{"2":{"23":1}}],["contributors",{"0":{"116":1},"2":{"113":1,"116":1}}],["contributing",{"2":{"16":1}}],["contribution",{"2":{"0":1,"9":1,"12":1}}],["controllable",{"2":{"22":1}}],["contents",{"2":{"137":1}}],["content",{"2":{"14":1,"78":1}}],["container",{"2":{"107":2}}],["contained",{"2":{"13":1,"33":1}}],["containing",{"2":{"56":1,"61":2,"132":2}}],["contain",{"2":{"51":1,"52":1}}],["contains",{"2":{"11":1,"143":1}}],["covered",{"2":{"80":1,"128":1}}],["cover",{"2":{"2":1}}],["codespaces",{"2":{"107":1}}],["code",{"2":{"2":2,"11":2,"47":1,"52":1,"65":3,"68":1,"69":2,"75":1,"107":1,"120":1,"121":2,"124":4,"125":3,"146":1,"147":1}}],["combo",{"2":{"53":1}}],["combinations",{"2":{"22":1}}],["compatibility",{"2":{"125":1}}],["compiling",{"2":{"68":1,"75":1,"96":1,"121":1,"125":1}}],["compilation",{"2":{"68":1}}],["compiled",{"2":{"61":1}}],["compile",{"2":{"61":1,"130":1}}],["compinit",{"2":{"22":7,"87":2}}],["compete",{"2":{"36":1}}],["completes",{"2":{"23":1,"32":1}}],["complete",{"0":{"23":1,"32":1},"2":{"41":2,"137":1}}],["completer~",{"2":{"22":3,"87":3}}],["completer",{"2":{"22":3,"87":3}}],["completion",{"2":{"22":6,"87":5}}],["completions",{"2":{"22":29,"87":13}}],["compliant",{"2":{"1":1}}],["comment",{"2":{"61":2}}],["comments",{"2":{"61":1}}],["common",{"2":{"29":1,"108":1}}],["community",{"0":{"21":1,"107":1},"2":{"15":3,"107":3}}],["command>",{"2":{"59":4,"81":1,"82":1,"85":1,"134":1,"145":1}}],["command`",{"2":{"50":2}}],["command",{"0":{"46":1,"47":1},"2":{"2":1,"4":1,"18":1,"21":1,"22":1,"45":1,"46":1,"47":1,"48":2,"50":11,"59":4,"64":1,"65":1,"69":3,"78":1,"79":1,"81":1,"83":1,"85":1,"86":1,"87":18,"101":1,"111":1,"119":1,"133":5,"134":5,"136":1,"137":1,"138":1,"139":1,"140":1,"141":12,"143":5,"144":1,"146":1}}],["commands",{"0":{"44":1,"45":1,"49":1,"50":1,"59":1,"141":1},"2":{"2":2,"18":1,"32":2,"36":1,"44":2,"49":2,"50":9,"59":1,"66":1,"67":1,"69":1,"94":1,"105":1,"117":1,"119":3,"120":1,"123":1,"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"141":9}}],["committing",{"2":{"11":1}}],["commits",{"0":{"7":1,"12":1},"2":{"12":1}}],["commit",{"2":{"2":1,"7":5,"12":1,"59":2,"61":1,"86":1,"92":1,"96":1,"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"136":1,"143":1}}],["com",{"2":{"1":5,"10":3,"20":1,"26":1,"59":2,"89":1,"90":2,"131":1,"143":1,"145":1,"148":1}}],["omitted",{"2":{"127":1}}],["our",{"2":{"86":1,"119":1}}],["outlined",{"2":{"102":1}}],["outcomes",{"2":{"77":1}}],["outputs",{"2":{"6":1,"127":2}}],["output",{"2":{"6":1,"48":1,"59":1,"120":6,"123":1,"127":3,"128":5,"129":3,"130":4,"131":3,"132":2,"134":1,"135":3,"136":1,"137":1}}],["out",{"2":{"2":1,"58":1,"87":2,"110":1,"143":1}}],["occur",{"2":{"66":1,"67":1,"94":1}}],["occurs",{"2":{"28":1,"66":1}}],["override",{"2":{"134":2}}],["overridden",{"2":{"45":1}}],["overview",{"0":{"120":1,"121":1,"128":1},"2":{"120":1,"128":1,"129":1,"130":1,"131":1}}],["over",{"2":{"39":1,"75":1}}],["own",{"2":{"39":1,"107":1,"118":2,"123":1}}],["older",{"2":{"41":1,"46":1,"51":1}}],["old",{"2":{"33":1}}],["obvious",{"2":{"51":1}}],["observe",{"2":{"28":1}}],["objects",{"2":{"13":2}}],["operating",{"0":{"55":1},"2":{"53":2,"120":1,"128":1,"129":2,"130":1,"131":1}}],["opening",{"2":{"22":1}}],["option",{"2":{"94":2,"136":1}}],["options",{"2":{"31":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"118":1}}],["optional",{"0":{"126":1},"1":{"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1},"2":{"7":2,"43":1,"59":1,"124":1,"125":1,"127":1,"130":1,"143":3}}],["optionally",{"2":{"4":1,"59":3,"128":1,"129":1,"130":1,"131":1}}],["opt",{"2":{"22":9,"87":3}}],["ohmyzsh",{"2":{"22":4}}],["oh",{"2":{"22":5,"112":1}}],["otherwise",{"2":{"134":2}}],["others",{"2":{"127":1}}],["other",{"2":{"11":1,"31":1,"52":1,"61":1,"63":1,"76":2,"119":1,"130":1}}],["osx",{"2":{"145":1}}],["oss",{"2":{"22":1,"29":1}}],["os",{"2":{"3":1,"18":1,"25":1,"46":1,"53":1,"59":1,"83":1,"144":2,"145":1}}],["often",{"2":{"123":1}}],["offscreen",{"2":{"123":1}}],["offers",{"2":{"53":1}}],["officially",{"2":{"109":1}}],["official",{"0":{"20":1},"2":{"13":1,"14":1,"21":1,"109":1}}],["of",{"0":{"57":1},"2":{"1":1,"2":2,"4":1,"7":2,"8":1,"13":1,"14":1,"15":1,"17":1,"18":1,"22":5,"23":1,"27":3,"28":3,"31":1,"32":3,"33":2,"34":3,"36":1,"39":3,"40":3,"41":4,"43":2,"44":1,"48":2,"50":1,"51":2,"52":1,"53":3,"54":2,"55":1,"57":1,"59":10,"60":1,"61":2,"63":1,"64":1,"66":1,"67":2,"68":3,"72":1,"73":2,"74":1,"75":1,"76":3,"77":2,"84":5,"85":1,"89":1,"91":1,"92":2,"93":2,"102":2,"105":5,"107":1,"109":1,"111":1,"112":2,"114":1,"116":1,"119":2,"120":7,"121":6,"123":1,"124":1,"125":7,"127":9,"128":1,"129":2,"130":1,"131":2,"132":2,"134":2,"135":2,"136":2,"137":2,"138":1,"141":3,"142":1,"143":1}}],["origin",{"2":{"92":1}}],["originally",{"2":{"52":1}}],["order",{"2":{"50":1,"123":3}}],["ordering",{"2":{"22":1}}],["org",{"2":{"21":1}}],["organisation",{"2":{"15":1}}],["or",{"2":{"1":3,"2":1,"3":1,"8":1,"10":2,"11":1,"21":1,"22":9,"27":1,"28":1,"32":1,"38":1,"46":1,"48":3,"50":1,"59":6,"61":3,"65":4,"67":1,"68":1,"69":4,"74":1,"76":1,"78":1,"86":1,"87":2,"89":1,"96":1,"101":1,"102":1,"105":1,"106":1,"107":2,"112":1,"119":1,"120":3,"121":4,"124":7,"125":3,"127":5,"128":2,"129":2,"130":5,"131":3,"132":2,"133":2,"134":2,"135":1,"136":2,"137":3,"141":2,"143":1,"146":1}}],["one",{"2":{"33":1,"34":1,"51":1,"59":1,"123":2,"128":1,"129":1,"131":2}}],["once",{"2":{"23":1,"34":1,"118":1,"125":1}}],["only",{"2":{"11":1,"23":1,"44":1,"48":1,"50":1,"52":2,"53":1,"101":2,"110":1,"124":1,"125":1,"128":1,"136":1,"142":2,"147":1}}],["ongoing",{"2":{"8":1}}],["on",{"2":{"1":2,"4":1,"7":1,"10":2,"11":1,"12":1,"18":1,"22":3,"31":1,"37":1,"53":1,"55":1,"59":4,"61":1,"66":2,"67":1,"69":1,"70":1,"76":2,"77":1,"86":2,"92":1,"101":1,"105":1,"110":2,"116":1,"121":1,"123":4,"124":1,"127":1,"137":1,"143":1,"144":3,"146":1}}],["aware",{"2":{"142":1}}],["awk",{"2":{"123":1}}],["access",{"2":{"147":1}}],["accessing",{"2":{"146":1}}],["accessed",{"2":{"105":1}}],["accept",{"2":{"127":1,"137":1}}],["actually",{"2":{"45":1,"47":2,"48":1}}],["actual",{"2":{"27":1,"61":1}}],["actions",{"0":{"16":1},"2":{"16":1,"110":1,"144":3}}],["action",{"0":{"144":1},"2":{"7":2,"40":1,"144":1}}],["avoid",{"2":{"49":1,"119":1,"125":1}}],["available",{"0":{"99":1},"2":{"11":1,"27":2,"59":1,"63":1,"105":1,"110":1,"121":2,"123":1,"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1}}],["again",{"2":{"39":1}}],["aims",{"2":{"39":1}}],["absent",{"2":{"124":1,"125":1,"127":1}}],["absence",{"2":{"28":1}}],["absolutely",{"2":{"142":1}}],["absolute",{"2":{"71":1,"73":1,"74":1}}],["aborted",{"2":{"94":1}}],["above",{"2":{"54":1,"58":1,"70":1,"102":1}}],["about",{"2":{"22":1,"78":1,"120":1,"128":1}}],["able",{"2":{"47":1}}],["after",{"2":{"22":2,"50":2,"65":2,"69":3,"112":2,"120":2,"138":1,"139":1}}],["affected",{"2":{"44":1}}],["affect",{"2":{"22":1}}],["aforementioned",{"2":{"14":1}}],["architecture",{"0":{"55":1},"2":{"53":1}}],["archlinux",{"2":{"21":1}}],["args",{"2":{"59":1,"69":1,"81":1,"133":1,"134":1}}],["arguments",{"2":{"61":1}}],["argument",{"2":{"50":2,"127":2,"137":1}}],["arg",{"2":{"22":6,"87":6}}],["aren",{"2":{"58":1}}],["are",{"0":{"52":1},"2":{"1":1,"2":1,"7":1,"8":1,"10":1,"13":1,"14":1,"22":16,"25":1,"27":1,"29":2,"30":1,"32":1,"33":1,"34":2,"36":1,"40":1,"41":1,"44":1,"50":3,"51":1,"59":1,"66":1,"67":1,"69":2,"78":1,"84":1,"85":1,"88":1,"92":1,"94":1,"105":3,"107":2,"108":1,"117":1,"118":1,"121":2,"123":4,"127":1,"135":1,"141":1,"143":1}}],["augments",{"2":{"37":1}}],["aur",{"2":{"21":2,"22":1,"70":1,"86":1}}],["authentication",{"2":{"146":1,"147":1}}],["authorization",{"2":{"146":1}}],["authors",{"2":{"113":1,"141":1}}],["authored",{"2":{"15":1}}],["autoremove",{"2":{"87":1}}],["auto",{"2":{"62":1,"68":1,"77":1}}],["autocompletions",{"2":{"22":1}}],["autoload",{"2":{"22":1,"87":1}}],["automatically",{"2":{"7":1,"18":1,"22":8,"106":1,"111":1}}],["automated",{"2":{"1":1,"7":1,"12":1,"146":1}}],["api",{"0":{"146":1,"147":1},"1":{"147":1},"2":{"33":1,"88":1,"146":3,"147":1}}],["applies",{"2":{"136":1}}],["applied",{"2":{"123":1}}],["apply",{"2":{"45":1}}],["appear",{"2":{"110":1}}],["append",{"2":{"22":4}}],["appropriate",{"0":{"55":1},"2":{"53":1,"135":1}}],["approach",{"2":{"39":1}}],["apps",{"2":{"8":1}}],["apt",{"2":{"18":1,"25":1}}],["aptitude",{"2":{"18":1}}],["alternatively",{"2":{"101":1}}],["also",{"2":{"45":1,"61":1,"105":1,"138":1,"139":1,"140":1,"142":1}}],["already",{"2":{"29":1,"53":1,"67":1,"123":1,"125":1,"128":1}}],["almalinux",{"2":{"25":1}}],["always",{"0":{"65":1},"2":{"15":1,"62":1,"77":1,"137":1}}],["alpine",{"2":{"8":1}}],["allows",{"2":{"134":1,"142":1}}],["allow",{"2":{"84":1}}],["allowing",{"2":{"34":1}}],["all",{"0":{"59":1,"91":1,"99":1,"123":1},"2":{"2":1,"22":1,"27":2,"28":1,"32":1,"33":2,"36":1,"44":4,"47":1,"59":10,"61":1,"66":1,"67":2,"87":14,"91":1,"92":1,"93":1,"94":1,"99":4,"117":1,"120":2,"121":3,"123":7,"124":2,"127":4,"135":2,"146":1}}],["amongst",{"2":{"127":1}}],["amannn",{"2":{"7":1}}],["amp",{"0":{"7":1,"9":1,"12":1,"55":1,"80":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1},"2":{"6":1,"9":1,"11":1,"18":1,"21":4,"22":24,"24":1,"28":1,"86":1,"87":14,"96":1,"110":1,"113":1,"120":1,"123":1,"127":1,"132":1,"143":2}}],["at",{"2":{"6":1,"22":1,"27":1,"59":1,"61":1,"112":1,"143":1}}],["advanced",{"2":{"4":1}}],["added",{"2":{"51":1,"52":1,"55":1,"58":1,"61":1,"120":1,"138":1}}],["addition",{"2":{"58":1,"142":1}}],["additionally",{"2":{"46":1,"50":1}}],["adding",{"2":{"22":3}}],["add",{"0":{"57":1,"89":1,"138":1},"2":{"1":4,"2":1,"10":2,"22":23,"26":1,"31":1,"44":2,"53":1,"56":1,"57":1,"59":3,"66":2,"67":2,"69":2,"89":5,"94":1,"109":1,"120":1,"138":6,"147":1,"148":3}}],["a",{"0":{"24":1,"27":1,"28":1,"43":1,"117":1},"1":{"25":1,"26":1,"29":1,"30":1,"31":1,"118":1,"119":1,"120":1,"121":1,"122":1,"123":1,"124":1,"125":1,"126":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1,"140":1,"141":1,"142":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1},"2":{"1":1,"2":1,"4":2,"7":5,"12":1,"13":1,"14":1,"15":1,"17":2,"18":1,"22":13,"23":2,"27":4,"28":5,"29":2,"30":1,"31":1,"33":3,"34":2,"36":1,"37":2,"38":1,"39":4,"40":5,"41":6,"43":1,"45":2,"47":3,"48":4,"50":3,"51":7,"52":3,"53":1,"55":1,"56":1,"59":15,"61":10,"66":3,"67":2,"69":5,"70":1,"77":2,"83":2,"84":2,"85":1,"86":3,"87":1,"92":1,"93":3,"94":2,"96":2,"97":1,"98":1,"99":1,"100":1,"101":3,"105":3,"107":2,"110":2,"111":1,"117":3,"118":1,"120":10,"123":5,"124":4,"125":5,"127":8,"128":2,"129":1,"130":1,"131":2,"132":1,"134":2,"135":1,"136":2,"137":3,"138":1,"141":4,"142":1,"143":1,"144":2,"145":2,"146":2,"147":1,"148":1}}],["another",{"2":{"61":1,"145":1}}],["any",{"2":{"40":1,"43":2,"45":1,"50":1,"61":1,"71":1,"72":1,"73":1,"74":1,"76":1,"84":1,"87":1,"105":1,"112":1,"123":1,"125":1,"128":2,"130":2,"136":1,"137":1}}],["an",{"2":{"6":1,"7":1,"8":1,"11":1,"12":1,"45":1,"47":2,"51":1,"59":2,"61":1,"71":1,"73":1,"74":1,"77":1,"85":1,"101":3,"102":1,"111":1,"133":1,"134":1,"141":1,"142":4,"146":3}}],["analysis",{"2":{"1":1}}],["and",{"0":{"45":1},"2":{"1":2,"2":4,"7":1,"8":1,"10":1,"11":1,"13":2,"14":2,"15":1,"16":1,"17":1,"22":5,"23":1,"29":1,"31":1,"33":4,"34":2,"36":3,"37":1,"38":2,"39":3,"40":3,"41":3,"44":2,"45":5,"46":1,"47":1,"48":1,"51":1,"52":1,"53":3,"55":2,"56":1,"59":9,"60":1,"61":4,"69":1,"70":2,"72":1,"74":1,"76":1,"78":1,"83":1,"85":2,"87":10,"92":1,"94":1,"96":1,"105":4,"110":1,"112":1,"118":2,"124":3,"125":3,"127":2,"128":4,"129":3,"130":4,"131":4,"137":1}}],["assume",{"2":{"124":1,"125":1}}],["association",{"2":{"89":1}}],["associated",{"2":{"15":1,"22":2}}],["aspects",{"2":{"109":1}}],["as",{"2":{"1":1,"6":1,"8":1,"11":1,"14":1,"22":3,"25":1,"36":1,"41":2,"50":8,"51":1,"54":1,"57":1,"58":1,"59":1,"60":2,"77":1,"78":1,"85":1,"87":2,"89":1,"93":1,"94":1,"102":1,"105":1,"107":1,"117":1,"118":1,"123":3,"124":2,"127":1,"128":1,"135":1,"141":7,"142":3}}],["asdfrc",{"0":{"62":1},"1":{"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1},"2":{"31":1,"60":1,"62":2,"71":3,"77":8,"87":14,"94":1,"136":1}}],["asdf~",{"2":{"22":6,"87":6}}],["asdf",{"0":{"0":1,"19":1,"22":1,"40":1,"45":2,"46":1,"47":1,"48":1,"55":1,"56":1,"71":1,"72":1,"73":1,"74":1,"75":1,"76":1,"94":1,"106":1,"141":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"20":1,"21":1},"2":{"0":1,"1":13,"2":1,"3":2,"4":1,"7":1,"8":3,"10":8,"11":1,"12":1,"15":7,"16":1,"17":3,"18":1,"20":3,"21":3,"22":112,"23":2,"24":1,"25":1,"26":2,"27":4,"28":3,"29":2,"31":3,"32":5,"33":2,"34":2,"36":2,"37":3,"38":1,"39":2,"40":3,"41":4,"44":17,"45":8,"46":2,"47":2,"49":2,"50":8,"51":4,"53":6,"54":1,"55":1,"56":7,"57":2,"59":43,"60":1,"61":6,"62":2,"64":1,"65":1,"66":4,"67":6,"68":1,"69":4,"70":3,"71":2,"72":1,"73":4,"74":5,"75":3,"76":6,"77":13,"78":3,"79":1,"83":1,"84":1,"85":3,"86":6,"87":118,"88":1,"89":3,"90":5,"92":1,"93":1,"94":4,"96":1,"97":2,"98":2,"99":2,"100":2,"101":8,"102":2,"103":3,"104":1,"105":11,"106":2,"107":7,"108":1,"109":1,"111":4,"112":3,"113":1,"117":3,"118":4,"119":2,"120":1,"121":11,"123":5,"124":15,"125":18,"127":17,"128":11,"129":9,"130":9,"131":9,"132":15,"133":9,"134":11,"135":3,"136":6,"137":3,"138":9,"139":10,"140":8,"141":12,"142":3,"143":10,"144":4,"145":6,"148":5}}],["great",{"2":{"141":1}}],["gives",{"2":{"111":1}}],["given",{"2":{"59":1,"97":1,"98":1,"99":1,"100":1}}],["gitref",{"2":{"143":2}}],["gitlens",{"2":{"4":2}}],["gitignore",{"0":{"3":1},"2":{"3":3}}],["git",{"0":{"4":1},"2":{"1":8,"4":6,"10":5,"18":7,"20":1,"21":3,"22":8,"26":1,"30":1,"33":1,"59":6,"66":1,"67":1,"70":1,"77":1,"86":2,"87":5,"89":3,"90":2,"117":1,"121":3,"123":2,"124":1,"125":1,"127":1,"128":1,"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"136":1,"139":3,"143":3,"145":2,"148":3}}],["github",{"0":{"16":1,"144":1,"147":1},"2":{"1":7,"7":1,"10":5,"15":1,"20":1,"26":1,"59":2,"61":1,"89":1,"90":2,"107":2,"110":1,"116":1,"131":1,"143":1,"144":3,"145":1,"147":1,"148":1}}],["golangs",{"2":{"137":1}}],["golden",{"0":{"119":1}}],["go",{"2":{"41":1,"46":1,"51":2,"137":1}}],["goes",{"2":{"14":1}}],["g",{"2":{"33":1,"84":1,"111":1,"135":1}}],["gnupg2",{"2":{"25":1}}],["gawk",{"2":{"25":3}}],["gpg",{"2":{"25":2}}],["general",{"2":{"120":1,"128":1}}],["generally",{"2":{"70":1}}],["generator",{"2":{"11":1}}],["generated",{"2":{"118":1}}],["generate",{"2":{"7":1,"118":1}}],["get",{"2":{"25":1,"52":1,"118":1,"134":2}}],["getting",{"0":{"17":1},"1":{"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1,"30":1,"31":1,"32":1},"2":{"32":1,"80":1}}],["gt",{"2":{"6":1,"7":2,"12":1,"44":8,"61":1,"66":3,"67":4,"69":5,"76":1,"84":2,"94":1,"102":1,"117":3,"118":2,"123":2,"124":2,"125":3,"127":5,"128":2,"129":2,"130":2,"131":5,"132":3,"133":3,"134":3,"135":2,"138":1,"139":2,"140":1,"143":7}}],["global",{"0":{"29":1,"45":1},"2":{"3":1,"17":1,"29":3,"45":5,"59":4,"61":2,"84":1,"101":5,"102":1,"105":1,"127":2,"135":1}}],["guidelines",{"2":{"16":1}}],["guide",{"0":{"32":1},"2":{"0":1,"9":1,"12":1,"23":1,"29":1,"32":1,"80":1,"87":2}}]],"serializationVersion":2}';export{e as default}; diff --git a/assets/chunks/@localSearchIndexzh-hans.O1gOT0Tl.js b/assets/chunks/@localSearchIndexzh-hans.O1gOT0Tl.js new file mode 100644 index 00000000..92b7af6d --- /dev/null +++ b/assets/chunks/@localSearchIndexzh-hans.O1gOT0Tl.js @@ -0,0 +1 @@ +const t='{"documentCount":112,"nextId":112,"documentIds":{"0":"/zh-hans/contribute/core.html#asdf","1":"/zh-hans/contribute/core.html#初始化安装","2":"/zh-hans/contribute/core.html#开发","3":"/zh-hans/contribute/core.html#bats-测试","4":"/zh-hans/contribute/core.html#拉取请求、发布以及约定式提交","5":"/zh-hans/contribute/core.html#docker-镜像","6":"/zh-hans/contribute/documentation.html#文档-网站","7":"/zh-hans/contribute/documentation.html#初始化设置","8":"/zh-hans/contribute/documentation.html#开发","9":"/zh-hans/contribute/documentation.html#拉取请求、发布以及约定式提交","10":"/zh-hans/contribute/documentation.html#vuepress","11":"/zh-hans/contribute/documentation.html#i18n-国际化","12":"/zh-hans/contribute/first-party-plugins.html#官方插件","13":"/zh-hans/contribute/github-actions.html#github-actions","14":"/zh-hans/guide/getting-started.html#快速入门","15":"/zh-hans/guide/getting-started.html#_1-安装依赖","16":"/zh-hans/guide/getting-started.html#_2-下载-asdf","17":"/zh-hans/guide/getting-started.html#official-download","18":"/zh-hans/guide/getting-started.html#community-supported-download-methods","19":"/zh-hans/guide/getting-started.html#_3-安装-asdf","20":"/zh-hans/guide/getting-started.html#核心安装完成","21":"/zh-hans/guide/getting-started.html#_4-安装插件","22":"/zh-hans/guide/getting-started.html#插件依赖","23":"/zh-hans/guide/getting-started.html#安装插件","24":"/zh-hans/guide/getting-started.html#_5-安装指定版本","25":"/zh-hans/guide/getting-started.html#_6-设置默认版本","26":"/zh-hans/guide/getting-started.html#全局","27":"/zh-hans/guide/getting-started.html#本地","28":"/zh-hans/guide/getting-started.html#使用现有工具版本文件","29":"/zh-hans/guide/getting-started.html#完成指南","30":"/zh-hans/guide/introduction.html#项目简介","31":"/zh-hans/guide/introduction.html#它是如何工作的","32":"/zh-hans/guide/introduction.html#相关项目","33":"/zh-hans/guide/introduction.html#nvm-n-rbenv-等","34":"/zh-hans/guide/introduction.html#direnv","35":"/zh-hans/guide/introduction.html#homebrew","36":"/zh-hans/guide/introduction.html#nixos","37":"/zh-hans/guide/introduction.html#为什么使用-asdf","38":"/zh-hans/manage/commands.html#所有命令","39":"/zh-hans/manage/configuration.html#配置","40":"/zh-hans/manage/configuration.html#tool-versions","41":"/zh-hans/manage/configuration.html#home-asdfrc","42":"/zh-hans/manage/configuration.html#legacy-version-file","43":"/zh-hans/manage/configuration.html#use-release-candidates","44":"/zh-hans/manage/configuration.html#always-keep-download","45":"/zh-hans/manage/configuration.html#plugin-repository-last-check-duration","46":"/zh-hans/manage/configuration.html#环境变量","47":"/zh-hans/manage/configuration.html#内部配置","48":"/zh-hans/manage/core.html#核心","49":"/zh-hans/manage/core.html#安装和配置","50":"/zh-hans/manage/core.html#exec","51":"/zh-hans/manage/core.html#env","52":"/zh-hans/manage/core.html#info","53":"/zh-hans/manage/core.html#reshim","54":"/zh-hans/manage/core.html#shim-versions","55":"/zh-hans/manage/core.html#更新","56":"/zh-hans/manage/core.html#卸载","57":"/zh-hans/manage/plugins.html#插件","58":"/zh-hans/manage/plugins.html#添加","59":"/zh-hans/manage/plugins.html#列举已安装","60":"/zh-hans/manage/plugins.html#列举缩写存储库中的所有插件","61":"/zh-hans/manage/plugins.html#更新","62":"/zh-hans/manage/plugins.html#移除","63":"/zh-hans/manage/plugins.html#同步缩写存储库","64":"/zh-hans/manage/versions.html#版本","65":"/zh-hans/manage/versions.html#安装版本","66":"/zh-hans/manage/versions.html#安装最新稳定版本","67":"/zh-hans/manage/versions.html#列举已安装版本","68":"/zh-hans/manage/versions.html#列举所有可用版本","69":"/zh-hans/manage/versions.html#显示最新稳定版本","70":"/zh-hans/manage/versions.html#设置当前版本","71":"/zh-hans/manage/versions.html#回退到系统版本","72":"/zh-hans/manage/versions.html#显示当前版本","73":"/zh-hans/manage/versions.html#卸载版本","74":"/zh-hans/manage/versions.html#垫片-shims","75":"/zh-hans/manage/versions.html#绕过-asdf-垫片","76":"/zh-hans/more/community-projects.html#community-projects","77":"/zh-hans/more/faq.html#faq","78":"/zh-hans/more/faq.html#支持-wsl1-吗","79":"/zh-hans/more/faq.html#支持-wsl2-吗","80":"/zh-hans/more/faq.html#新安装的可执行程序无法运行","81":"/zh-hans/more/faq.html#shell-没有检测到新安装的垫片","82":"/zh-hans/more/thanks.html#致谢","83":"/zh-hans/more/thanks.html#作者","84":"/zh-hans/more/thanks.html#维护者","85":"/zh-hans/more/thanks.html#贡献者","86":"/zh-hans/plugins/create.html#创建插件","87":"/zh-hans/plugins/create.html#插件里有什么","88":"/zh-hans/plugins/create.html#必要的脚本","89":"/zh-hans/plugins/create.html#环境变量","90":"/zh-hans/plugins/create.html#bin-list-all","91":"/zh-hans/plugins/create.html#bin-download","92":"/zh-hans/plugins/create.html#bin-install","93":"/zh-hans/plugins/create.html#可选脚本","94":"/zh-hans/plugins/create.html#bin-help-脚本","95":"/zh-hans/plugins/create.html#bin-latest-stable","96":"/zh-hans/plugins/create.html#bin-list-bin-paths","97":"/zh-hans/plugins/create.html#bin-exec-env","98":"/zh-hans/plugins/create.html#bin-exec-path","99":"/zh-hans/plugins/create.html#bin-uninstall","100":"/zh-hans/plugins/create.html#bin-list-legacy-filenames","101":"/zh-hans/plugins/create.html#bin-parse-legacy-file","102":"/zh-hans/plugins/create.html#bin-post-plugin-add","103":"/zh-hans/plugins/create.html#bin-post-plugin-update","104":"/zh-hans/plugins/create.html#bin-pre-plugin-remove","105":"/zh-hans/plugins/create.html#asdf-命令行的扩展命令","106":"/zh-hans/plugins/create.html#自定义垫片模板","107":"/zh-hans/plugins/create.html#测试插件","108":"/zh-hans/plugins/create.html#github-action-示例","109":"/zh-hans/plugins/create.html#travisci-配置示例","110":"/zh-hans/plugins/create.html#github-api-频率限制","111":"/zh-hans/plugins/create.html#向官方插件存储库提交插件"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[1,1,3],"1":[1,1,59],"2":[1,1,42],"3":[2,1,39],"4":[2,1,69],"5":[2,1,9],"6":[3,1,4],"7":[1,3,50],"8":[1,3,33],"9":[2,3,17],"10":[1,3,27],"11":[2,3,50],"12":[1,1,24],"13":[2,1,8],"14":[1,1,15],"15":[2,1,59],"16":[3,1,1],"17":[2,4,14],"18":[4,4,32],"19":[3,1,177],"20":[2,1,8],"21":[2,1,8],"22":[1,3,25],"23":[1,3,11],"24":[2,1,23],"25":[2,1,17],"26":[1,3,24],"27":[1,3,20],"28":[1,3,29],"29":[2,1,19],"30":[1,1,22],"31":[1,1,17],"32":[1,1,1],"33":[4,2,18],"34":[1,2,13],"35":[1,2,15],"36":[1,2,19],"37":[3,1,15],"38":[1,1,144],"39":[1,1,9],"40":[3,1,74],"41":[2,1,30],"42":[3,3,21],"43":[3,3,12],"44":[3,3,11],"45":[5,3,31],"46":[1,1,48],"47":[1,1,20],"48":[1,1,5],"49":[1,1,4],"50":[1,1,7],"51":[1,1,6],"52":[1,1,11],"53":[1,1,31],"54":[2,1,29],"55":[1,1,26],"56":[1,1,110],"57":[1,1,14],"58":[1,1,25],"59":[1,1,14],"60":[1,1,8],"61":[1,1,18],"62":[1,1,11],"63":[1,1,31],"64":[1,1,1],"65":[1,1,19],"66":[1,1,11],"67":[1,1,10],"68":[1,1,11],"69":[1,1,10],"70":[1,1,48],"71":[1,1,23],"72":[1,1,22],"73":[1,1,10],"74":[3,1,66],"75":[3,4,12],"76":[2,1,48],"77":[1,1,4],"78":[4,1,12],"79":[4,1,25],"80":[2,1,25],"81":[3,1,26],"82":[1,1,3],"83":[1,1,11],"84":[1,1,6],"85":[1,1,7],"86":[1,1,1],"87":[1,1,14],"88":[1,1,9],"89":[1,1,41],"90":[3,2,36],"91":[2,2,28],"92":[2,2,51],"93":[1,1,1],"94":[3,2,65],"95":[3,2,36],"96":[3,2,21],"97":[3,2,2],"98":[3,2,25],"99":[2,2,2],"100":[4,2,15],"101":[4,2,11],"102":[4,2,19],"103":[4,2,22],"104":[4,2,15],"105":[2,1,64],"106":[1,1,24],"107":[1,1,58],"108":[3,2,28],"109":[2,2,37],"110":[3,1,46],"111":[1,1,21]},"averageFieldLength":[1.8125,1.5089285714285716,25.785714285714285],"storedFields":{"0":{"title":"asdf","titles":[]},"1":{"title":"初始化安装","titles":["asdf"]},"2":{"title":"开发","titles":["asdf"]},"3":{"title":"Bats 测试","titles":["asdf"]},"4":{"title":"拉取请求、发布以及约定式提交","titles":["asdf"]},"5":{"title":"Docker 镜像","titles":["asdf"]},"6":{"title":"文档 & 网站","titles":[]},"7":{"title":"初始化设置","titles":["文档 & 网站"]},"8":{"title":"开发","titles":["文档 & 网站"]},"9":{"title":"拉取请求、发布以及约定式提交","titles":["文档 & 网站"]},"10":{"title":"Vuepress","titles":["文档 & 网站"]},"11":{"title":"I18n 国际化","titles":["文档 & 网站"]},"12":{"title":"官方插件","titles":[]},"13":{"title":"GitHub Actions","titles":[]},"14":{"title":"快速入门","titles":[]},"15":{"title":"1. 安装依赖","titles":["快速入门"]},"16":{"title":"2. 下载 asdf","titles":["快速入门"]},"17":{"title":"Official Download","titles":["快速入门","2. 下载 asdf"]},"18":{"title":"Community Supported Download Methods","titles":["快速入门","2. 下载 asdf"]},"19":{"title":"3. 安装 asdf","titles":["快速入门"]},"20":{"title":"核心安装完成!","titles":["快速入门"]},"21":{"title":"4. 安装插件","titles":["快速入门"]},"22":{"title":"插件依赖","titles":["快速入门","4. 安装插件"]},"23":{"title":"安装插件","titles":["快速入门","4. 安装插件"]},"24":{"title":"5. 安装指定版本","titles":["快速入门"]},"25":{"title":"6. 设置默认版本","titles":["快速入门"]},"26":{"title":"全局","titles":["快速入门","6. 设置默认版本"]},"27":{"title":"本地","titles":["快速入门","6. 设置默认版本"]},"28":{"title":"使用现有工具版本文件","titles":["快速入门","6. 设置默认版本"]},"29":{"title":"完成指南!","titles":["快速入门"]},"30":{"title":"项目简介","titles":[]},"31":{"title":"它是如何工作的","titles":["项目简介"]},"32":{"title":"相关项目","titles":["项目简介"]},"33":{"title":"nvm / n / rbenv 等","titles":["项目简介","相关项目"]},"34":{"title":"direnv","titles":["项目简介","相关项目"]},"35":{"title":"Homebrew","titles":["项目简介","相关项目"]},"36":{"title":"NixOS","titles":["项目简介","相关项目"]},"37":{"title":"为什么使用 asdf?","titles":["项目简介"]},"38":{"title":"所有命令","titles":[]},"39":{"title":"配置","titles":[]},"40":{"title":".tool-versions","titles":["配置"]},"41":{"title":"$HOME/.asdfrc","titles":["配置"]},"42":{"title":"legacy_version_file","titles":["配置","$HOME/.asdfrc"]},"43":{"title":"use_release_candidates","titles":["配置","$HOME/.asdfrc"]},"44":{"title":"always_keep_download","titles":["配置","$HOME/.asdfrc"]},"45":{"title":"plugin_repository_last_check_duration","titles":["配置","$HOME/.asdfrc"]},"46":{"title":"环境变量","titles":["配置"]},"47":{"title":"内部配置","titles":["配置"]},"48":{"title":"核心","titles":[]},"49":{"title":"安装和配置","titles":["核心"]},"50":{"title":"Exec","titles":["核心"]},"51":{"title":"Env","titles":["核心"]},"52":{"title":"Info","titles":["核心"]},"53":{"title":"Reshim","titles":["核心"]},"54":{"title":"Shim-versions","titles":["核心"]},"55":{"title":"更新","titles":["核心"]},"56":{"title":"卸载","titles":["核心"]},"57":{"title":"插件","titles":[]},"58":{"title":"添加","titles":["插件"]},"59":{"title":"列举已安装","titles":["插件"]},"60":{"title":"列举缩写存储库中的所有插件","titles":["插件"]},"61":{"title":"更新","titles":["插件"]},"62":{"title":"移除","titles":["插件"]},"63":{"title":"同步缩写存储库","titles":["插件"]},"64":{"title":"版本","titles":[]},"65":{"title":"安装版本","titles":["版本"]},"66":{"title":"安装最新稳定版本","titles":["版本"]},"67":{"title":"列举已安装版本","titles":["版本"]},"68":{"title":"列举所有可用版本","titles":["版本"]},"69":{"title":"显示最新稳定版本","titles":["版本"]},"70":{"title":"设置当前版本","titles":["版本"]},"71":{"title":"回退到系统版本","titles":["版本"]},"72":{"title":"显示当前版本","titles":["版本"]},"73":{"title":"卸载版本","titles":["版本"]},"74":{"title":"垫片(Shims)","titles":["版本"]},"75":{"title":"绕过 asdf 垫片","titles":["版本","垫片(Shims)"]},"76":{"title":"Community Projects","titles":[]},"77":{"title":"FAQ","titles":[]},"78":{"title":"支持 WSL1 吗?","titles":["FAQ"]},"79":{"title":"支持 WSL2 吗?","titles":["FAQ"]},"80":{"title":"新安装的可执行程序无法运行?","titles":["FAQ"]},"81":{"title":"Shell 没有检测到新安装的垫片?","titles":["FAQ"]},"82":{"title":"致谢","titles":[]},"83":{"title":"作者","titles":["致谢"]},"84":{"title":"维护者","titles":["致谢"]},"85":{"title":"贡献者","titles":["致谢"]},"86":{"title":"创建插件","titles":[]},"87":{"title":"插件里有什么","titles":["创建插件"]},"88":{"title":"必要的脚本","titles":["创建插件"]},"89":{"title":"环境变量","titles":["创建插件"]},"90":{"title":"bin/list-all","titles":["创建插件","环境变量"]},"91":{"title":"bin/download","titles":["创建插件","环境变量"]},"92":{"title":"bin/install","titles":["创建插件","环境变量"]},"93":{"title":"可选脚本","titles":["创建插件"]},"94":{"title":"bin/help 脚本","titles":["创建插件","可选脚本"]},"95":{"title":"bin/latest-stable","titles":["创建插件","可选脚本"]},"96":{"title":"bin/list-bin-paths","titles":["创建插件","可选脚本"]},"97":{"title":"bin/exec-env","titles":["创建插件","可选脚本"]},"98":{"title":"bin/exec-path","titles":["创建插件","可选脚本"]},"99":{"title":"bin/uninstall","titles":["创建插件","可选脚本"]},"100":{"title":"bin/list-legacy-filenames","titles":["创建插件","可选脚本"]},"101":{"title":"bin/parse-legacy-file","titles":["创建插件","可选脚本"]},"102":{"title":"bin/post-plugin-add","titles":["创建插件","可选脚本"]},"103":{"title":"bin/post-plugin-update","titles":["创建插件","可选脚本"]},"104":{"title":"bin/pre-plugin-remove","titles":["创建插件","可选脚本"]},"105":{"title":"asdf 命令行的扩展命令","titles":["创建插件"]},"106":{"title":"自定义垫片模板","titles":["创建插件"]},"107":{"title":"测试插件","titles":["创建插件"]},"108":{"title":"GitHub Action 示例","titles":["创建插件","测试插件"]},"109":{"title":"TravisCI 配置示例","titles":["创建插件","测试插件"]},"110":{"title":"GitHub API 频率限制","titles":["创建插件"]},"111":{"title":"向官方插件存储库提交插件","titles":["创建插件"]}},"dirtCount":0,"index":[["轻松安装插件",{"2":{"111":1}}],["向官方插件存储库提交插件",{"0":{"111":1}}],["向其传递插件的名称和垫片正在包装的已安装包中的可执行程序的路径",{"2":{"74":1}}],["绝对不要",{"2":{"110":1}}],["安全",{"2":{"110":1}}],["安装或编译该工具所需的任何环境变量或其他标志",{"2":{"94":1}}],["安装脚本应以",{"2":{"92":1}}],["安装成功时",{"2":{"92":1}}],["安装到的目录",{"2":{"89":2}}],["安装到了其他目录",{"2":{"46":1}}],["安装一个包时",{"2":{"74":1}}],["安装给定字符串开头的最新稳定版本",{"2":{"66":1}}],["安装最新稳定版本",{"0":{"66":1}}],["安装版本",{"0":{"65":1}}],["安装和配置",{"0":{"49":1}}],["安装和管理的工具了",{"2":{"26":1}}],["安装的可执行程序会为每个可执行程序创建",{"2":{"31":1}}],["安装指定版本",{"0":{"24":1},"2":{"88":1}}],["安装插件",{"0":{"21":1,"23":1},"1":{"22":1,"23":1},"2":{"46":1}}],["安装工具",{"2":{"14":1}}],["安装",{"0":{"19":1},"2":{"14":1}}],["安装依赖",{"0":{"15":1},"2":{"14":1,"22":1}}],["安装过程包括",{"2":{"14":1}}],["构建设置中添加一个名为",{"2":{"110":1}}],["然后",{"2":{"110":1}}],["权限的",{"2":{"110":1}}],["频率限制",{"0":{"110":1}}],["示例文件",{"2":{"109":1}}],["示例",{"0":{"108":1}}],["示例输出如下所示",{"2":{"90":1,"96":1}}],["环境中测试你的插件",{"2":{"107":1}}],["环境变量包含的路径",{"2":{"91":1}}],["环境变量",{"0":{"46":1,"89":1},"1":{"90":1,"91":1,"92":1},"2":{"92":1,"110":1}}],["环境变量等等",{"2":{"30":1}}],["要测试",{"2":{"107":1}}],["要使用工具",{"2":{"71":1}}],["要使用的工具的自定义编译版本的路径",{"2":{"40":1}}],["剩下的参数被视为要执行的命令",{"2":{"107":1}}],["只有前两个参数是必须的",{"2":{"107":1}}],["只有当前工作目录是",{"2":{"79":1}}],["还被读作为",{"2":{"106":1}}],["还有更多命令需要熟悉",{"2":{"29":1}}],["允许自定义垫片模板",{"2":{"106":1}}],["允许全局安装可执行程序",{"2":{"53":1}}],["解析所获取文件的完整路径",{"2":{"105":1}}],["解析器",{"2":{"1":1}}],["且具有来自",{"2":{"105":1}}],["假设一个",{"2":{"105":1}}],["其他请参考相关钩子",{"2":{"102":1,"103":1,"104":1}}],["其中包含用于演示的默认值",{"2":{"41":1}}],["其中",{"2":{"10":1,"65":1}}],["该脚本可以访问安装插件的路径",{"2":{"104":1}}],["该脚本可以访问插件的安装路径",{"2":{"102":1,"103":1}}],["该标题成为默认分支上的提交消息格式",{"2":{"4":1}}],["后运行任何安装后操作",{"2":{"102":1}}],["未实现",{"2":{"101":1}}],["找到的传统文件",{"2":{"101":1}}],["获取工具的指定版本的可执行程序路径",{"2":{"98":1}}],["路径必须相对于传递的安装路径",{"2":{"96":1}}],["字符串调用",{"2":{"95":1}}],["过滤器",{"2":{"95":1}}],["帮助回调脚本不得输出核心",{"2":{"94":1}}],["行的格式可以是",{"2":{"94":1}}],["尽可能针对当前操作系统量身定制",{"2":{"94":1}}],["尽可能针对用户的操作系统",{"2":{"94":1}}],["尽管我们试图保持依赖关系列表很小",{"2":{"35":1}}],["输出",{"2":{"98":1}}],["输出可以是自由格式的文本",{"2":{"94":2}}],["输出将使你能够在测试执行期间打印带有特殊文件描述符",{"2":{"3":1}}],["及更高版本",{"2":{"92":1}}],["及更早版本和",{"2":{"92":1}}],["即使它还未完全安装",{"2":{"92":1}}],["扩展命令",{"2":{"105":1}}],["扩展",{"2":{"92":1}}],["检查",{"2":{"92":1}}],["检查和测试你的代码",{"2":{"2":1}}],["才将文件放在",{"2":{"92":1}}],["才能",{"2":{"79":1}}],["本身的新命令扩展的插件",{"2":{"105":1}}],["本脚本应在",{"2":{"92":1}}],["本地版本被定义在",{"2":{"27":1}}],["本地",{"0":{"27":1}}],["状态退出",{"2":{"91":1,"92":1}}],["此外",{"2":{"105":1}}],["此回调使用单个",{"2":{"95":1}}],["此脚本应该打印对插件和工具可能有用的任何必需或可选配置",{"2":{"94":1}}],["此脚本应该输出为操作系统量身定制的依赖项列表",{"2":{"94":1}}],["此脚本应该输出有关插件和所管理工具的一般描述",{"2":{"94":1}}],["此脚本必须下载源代码或者二进制文件到",{"2":{"91":1}}],["此关键字会导致",{"2":{"40":1}}],["非常有用",{"2":{"89":1}}],["非常相似",{"2":{"33":1}}],["编译源代码时使用的内核数",{"2":{"89":1}}],["应该",{"2":{"89":1}}],["应该作为你选择的",{"2":{"79":1}}],["必须明智地使用这一点",{"2":{"106":1}}],["必须打印具有相对可执行程序路径的字符串",{"2":{"98":1}}],["必须打印一个带有空格分隔的文件名列表的字符串",{"2":{"100":1}}],["必须打印一个带有空格分隔的包含可执行文件的目录路径列表的字符串",{"2":{"96":1}}],["必须打印一个带有空格分隔的版本列表的字符串",{"2":{"90":1}}],["必须使用自动补全完成配置",{"2":{"19":1}}],["必要的脚本",{"0":{"88":1}}],["🙏",{"2":{"85":1}}],["贡献者名单",{"2":{"85":1}}],["贡献者",{"0":{"85":1}}],["维护者",{"0":{"84":1}}],["直到时间尽头",{"2":{"83":1}}],["版权",{"2":{"83":1}}],["版本已经按照正确的顺序排列",{"2":{"90":1}}],["版本格式与",{"2":{"70":1}}],["版本化的插件和更新正在开发中",{"2":{"61":1}}],["版本下的",{"2":{"53":1}}],["版本号可以有如下格式",{"2":{"40":1}}],["版本文件",{"2":{"33":1}}],["版本了",{"2":{"29":1}}],["版本参考部分",{"2":{"26":1}}],["版本",{"0":{"64":1},"1":{"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"72":1,"73":1,"74":1,"75":1},"2":{"24":1,"29":1,"95":1}}],["版本并生成",{"2":{"4":1}}],["咳嗽",{"2":{"83":1}}],["感冒",{"2":{"83":1}}],["感谢你的关注",{"2":{"13":1}}],["高烧",{"2":{"83":1}}],["作者",{"0":{"83":1}}],["作者和贡献者的感谢页",{"2":{"82":1}}],["致谢",{"0":{"82":1},"1":{"83":1,"84":1,"85":1}}],["那么",{"2":{"106":1}}],["那么早期版本可能会不在屏幕上",{"2":{"90":1}}],["那么这将是版本号",{"2":{"89":1}}],["那么很有可能是在",{"2":{"81":1}}],["那样配置了",{"2":{"56":2}}],["没有解决你的问题",{"2":{"81":1}}],["没有检测到新安装的垫片",{"0":{"81":1}}],["创建一个仅具有",{"2":{"110":1}}],["创建一个垫片即可",{"2":{"80":1}}],["创建垫片的需要",{"2":{"80":1}}],["创建插件",{"0":{"86":1},"1":{"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"106":1,"107":1,"108":1,"109":1,"110":1,"111":1},"2":{"57":1}}],["我",{"2":{"83":1}}],["我执行了",{"2":{"80":1}}],["我们强烈建议你在",{"2":{"107":1}}],["我们可以运行",{"2":{"107":1}}],["我们打算在",{"2":{"79":1}}],["我们不打算添加对",{"2":{"78":1}}],["我们推荐的安装方法",{"2":{"55":1}}],["我们将只安装最新可用的",{"2":{"24":1}}],["我们将通过",{"2":{"21":1}}],["我们通过",{"2":{"24":1}}],["我们应该提前安装这些依赖",{"2":{"22":1}}],["新个人令牌",{"2":{"110":1}}],["新安装的可执行程序无法运行",{"0":{"80":1}}],["新特性需要进行测试",{"2":{"2":1}}],["驱动器时",{"2":{"79":1}}],["驱动器而不是绑定的",{"2":{"79":1}}],["重要的是",{"2":{"79":1}}],["重点是",{"2":{"8":1}}],["发行版来使用本设置和依赖说明",{"2":{"79":1}}],["发布以及约定式提交",{"0":{"4":1,"9":1}}],["不得出现一般的",{"2":{"94":1}}],["不应该打印任何标题",{"2":{"94":1}}],["不受官方支持",{"2":{"78":1}}],["不管理上游依赖",{"2":{"35":1,"36":1}}],["不管理环境变量",{"2":{"34":1}}],["吗",{"0":{"78":1,"79":1}}],["quality",{"2":{"76":1}}],["绕过",{"0":{"75":1}}],["返回软件包安装目录的路径",{"2":{"74":1}}],["返回当前版本中主要可执行程序的路径",{"2":{"74":1}}],["两个",{"2":{"74":1}}],["两者特性集合大致相同",{"2":{"8":1}}],["生效而不是执行的脚本都需要直接访问",{"2":{"74":1}}],["生效位置的下方",{"2":{"19":1}}],["调用时",{"2":{"105":1}}],["调用",{"2":{"74":1}}],["调试信息的辅助命令",{"2":{"52":1}}],["调试有时可能很困难",{"2":{"3":1}}],["回调打印的是",{"2":{"95":1}}],["回调打印的最新版本",{"2":{"95":1}}],["回调打印同一工具的不同变体并且最新版本不是你希望默认使用的变体的最新稳定版本时",{"2":{"95":1}}],["回调来操作",{"2":{"74":1}}],["回退到系统版本",{"0":{"71":1}}],["回退到",{"2":{"40":1}}],["软件包安装目录中的可执行程序的最终路径",{"2":{"74":1}}],["辅助程序确定要使用的软件包版本",{"2":{"74":1}}],["kim",{"2":{"72":3}}],["keep",{"0":{"44":1},"2":{"41":1}}],["会话或者在特定工具版本下执行一条命令",{"2":{"70":1}}],["会话将版本设置为一个名为",{"2":{"70":1}}],["可执行文件期望找到相对于可执行目录的动态链接库的问题",{"2":{"105":1}}],["可能指向存储库的一个标签",{"2":{"89":1}}],["可选脚本",{"0":{"93":1},"1":{"94":1,"95":1,"96":1,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1}}],["可选",{"2":{"70":1}}],["可以通过指定插件存储库",{"2":{"111":1}}],["可以通过可选的",{"2":{"92":1}}],["可以通过返回已安装软件包的路径来帮助解决这个问题",{"2":{"74":1}}],["可以被设置在上一节提到的生效",{"2":{"46":1}}],["可以被设置在任何位置",{"2":{"46":1}}],["可以是任何有效的文件名",{"2":{"46":1}}],["可以直接编辑这个文件或者使用",{"2":{"40":1}}],["可以用来集成",{"2":{"34":1}}],["可以用最少的配置编写",{"2":{"8":1}}],["可以看到所有可用的版本或者通过",{"2":{"24":1}}],["可以使用以下脚本",{"2":{"2":1}}],["可以将以下行的内容添加到",{"2":{"40":1}}],["可以将",{"2":{"2":1}}],["设置环境变量以运行包中的二进制文件",{"2":{"97":1}}],["设置变量时",{"2":{"94":1}}],["设置系统",{"2":{"71":1}}],["设置当前版本",{"0":{"70":1},"2":{"71":1}}],["设置默认版本",{"0":{"25":1},"1":{"26":1,"27":1,"28":1}}],["显示当前版本",{"0":{"72":1}}],["显示以给定字符串开头的最新稳定版本",{"2":{"69":1}}],["显示最新稳定版本",{"0":{"69":1}}],["筛选出以给定字符串开头的版本",{"2":{"67":1,"68":1}}],["分钟内没有同步",{"2":{"63":1}}],["分支",{"2":{"89":1,"107":1}}],["分支上的最新提交",{"2":{"55":1}}],["分支从",{"2":{"40":1}}],["同步缩写存储库",{"0":{"63":1}}],["同样",{"2":{"36":1,"94":1}}],["修剪工具的许多未使用版本的简单方法",{"2":{"62":1}}],["916",{"2":{"61":1}}],["999999999",{"2":{"45":1}}],["源代码或二进制文件应该下载到的路径",{"2":{"89":1}}],["源代码",{"2":{"61":1}}],["列举指定工具版本的可执行程序",{"2":{"96":1}}],["列举所有可安装的版本",{"2":{"88":1}}],["列举所有可用版本",{"0":{"68":1}}],["列举缩写存储库中的所有插件",{"0":{"60":1}}],["列举已安装版本",{"0":{"67":1}}],["列举已安装",{"0":{"59":1}}],["列举为命令提供垫片的插件和版本",{"2":{"54":1}}],["推荐独立于缩写存储库的",{"2":{"58":1}}],["建议尽可能不对版本进行排序",{"2":{"90":1}}],["建议",{"2":{"58":1}}],["地址添加插件",{"2":{"58":1}}],["添加如下内容到",{"2":{"110":1}}],["添加",{"0":{"58":1}}],["模块",{"2":{"56":3}}],["模块的行",{"2":{"56":3}}],["指南进行操作",{"2":{"56":1}}],["指定标签",{"2":{"40":1}}],["已经",{"2":{"89":1}}],["已经变成了",{"2":{"56":1}}],["已经被修改为",{"2":{"19":2}}],["因此请按照他们的指南找出要删除的内容",{"2":{"56":2}}],["因为一个可执行程序除了是可执行程序文件之外",{"2":{"106":1}}],["因为它是唯一的参数",{"2":{"95":1}}],["因为它描述了对包管理器和集成者有用的",{"2":{"47":1}}],["因为必须存在才能为脚本显示任何帮助输出",{"2":{"94":1}}],["因为",{"2":{"90":2,"94":1}}],["因为此系统使用",{"2":{"74":1}}],["因为这个可执行程序不是通过插件生命周期安装的",{"2":{"53":1}}],["因为有些插件有",{"2":{"22":1}}],["因为我们希望在用户没有可用或未启用",{"2":{"8":1}}],["因为你可能需要打破某些可能会影响到你的开发工具链的功能",{"2":{"1":1}}],["移除一个插件将会移除该插件安装的所有工具",{"2":{"62":1}}],["移除",{"0":{"62":1},"2":{"56":9}}],["卸载某个工具的指定版本",{"2":{"99":1}}],["卸载版本",{"0":{"73":1}}],["卸载该版本时",{"2":{"65":1}}],["卸载",{"0":{"56":1}}],["方法",{"2":{"55":1,"58":1}}],["8",{"2":{"54":2,"92":1}}],["8837",{"2":{"19":2}}],["执行",{"2":{"74":1,"105":1}}],["执行以下命令移除",{"2":{"56":14}}],["执行shim",{"2":{"54":1}}],["执行当前版本的命令垫片",{"2":{"50":1}}],["附带了两个可执行程序",{"2":{"54":1}}],["类似",{"2":{"53":1}}],["时",{"2":{"109":1}}],["时需要共享这些信息",{"2":{"52":1}}],["时支持仅依靠",{"2":{"8":1}}],["快速上手",{"2":{"49":1}}],["快速入门",{"0":{"14":1},"1":{"15":1,"16":1,"17":1,"18":1,"19":1,"20":1,"21":1,"22":1,"23":1,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1}}],["但最后",{"2":{"95":1}}],["但理想情况下只有一个短段落",{"2":{"94":1}}],["但可以通过在",{"2":{"63":1}}],["但可以促进很多工作流",{"2":{"48":1}}],["但是之后不能运行",{"2":{"80":1}}],["但是有一个插件",{"2":{"34":1}}],["但是",{"2":{"19":1}}],["像",{"2":{"47":1,"90":1}}],["用户现在可以执行",{"2":{"105":1}}],["用户可以选择传入",{"2":{"95":1}}],["用户不必担心本节",{"2":{"47":1}}],["用包管理器卸载",{"2":{"56":9}}],["用于支持对某种语言或工具进行版本控制",{"2":{"87":1}}],["用于打印操作系统",{"2":{"52":1}}],["用于单元测试",{"2":{"1":1}}],["内容无关",{"2":{"47":1}}],["内容必须位于与根配置文件中",{"2":{"11":1}}],["内部配置",{"0":{"47":1}}],["之外对以下环境变量有权限进行操作",{"2":{"89":1}}],["之间的任何位置",{"2":{"46":1}}],["之后推断出最新版本",{"2":{"95":1}}],["之后再生效",{"2":{"81":1}}],["之后和生效你的框架",{"2":{"81":1}}],["之后和已经生效的框架",{"2":{"19":1}}],["之后的位置生效",{"2":{"19":1}}],["否则你的测试可能会因频率限制而失败",{"2":{"110":1}}],["否则返回垫片指定的默认路径",{"2":{"98":1}}],["否则它将传递为",{"2":{"89":1}}],["否则不应该覆盖默认值",{"2":{"46":1}}],["否则请遵循",{"2":{"19":2}}],["忽略",{"2":{"46":1}}],["存储工具名称和版本的文件名",{"2":{"46":1}}],["存储库为托管在",{"2":{"108":1}}],["存储库中以便于和团队其他成员共享",{"2":{"30":1}}],["存储库",{"2":{"27":1,"87":1}}],["触发器事件发生时同步",{"2":{"45":1}}],["到",{"2":{"45":1}}],["则插件将检查提交",{"2":{"107":1}}],["则该工具将随指定版本一起安装",{"2":{"107":1}}],["则只是执行它们并替换",{"2":{"105":1}}],["则只有未压缩的源代码或二进制文件会放置在",{"2":{"91":1}}],["则它们将作为",{"2":{"105":1}}],["则必须存在此脚本",{"2":{"94":1}}],["则假设",{"2":{"92":1}}],["则在安装过程中在其他终端中运行的其他",{"2":{"92":1}}],["则不应将任何文件放在目录中",{"2":{"91":1}}],["则不能依赖",{"2":{"90":1}}],["则",{"2":{"75":1}}],["则可能位于",{"2":{"56":1}}],["则应按照该方法的步骤操作",{"2":{"55":1}}],["则应设置该变量为",{"2":{"46":1}}],["则进行同步",{"2":{"45":1,"63":1}}],["则会出现错误",{"2":{"25":1}}],["候选版本被使用",{"2":{"43":1}}],["语义版本被使用",{"2":{"43":1}}],["而是一组回调脚本",{"2":{"94":1}}],["而通过",{"2":{"80":1}}],["而不是尝试自行判断",{"2":{"95":1}}],["而不是通过垫片包装器进行访问",{"2":{"74":1}}],["而不是最新的语义版本",{"2":{"43":1}}],["而且每个管理器都有其不同的",{"2":{"30":1}}],["从不同步",{"2":{"45":1}}],["从传统版本文件读取版本",{"2":{"42":1}}],["从",{"2":{"42":1,"45":1}}],["从而允许",{"2":{"31":1}}],["从而确保每个人都使用完全相同的工具版本",{"2":{"30":1}}],["从而简化调试",{"2":{"3":1}}],["描述",{"2":{"42":1,"43":1,"44":1,"45":1}}],["选项的用户",{"2":{"100":1}}],["选项来进行配置",{"2":{"63":1}}],["选项",{"2":{"42":1,"43":1,"44":1,"45":1}}],["读取其他版本管理器使用的版本文件",{"2":{"42":1}}],["下面列出了可能的回调脚本",{"2":{"94":1}}],["下面的示例在版本为",{"2":{"70":1}}],["下面的文件展示了所需的格式",{"2":{"41":1}}],["下载更新的插件后运行任何插件更新后操作",{"2":{"103":1}}],["下载成功后脚本必须以",{"2":{"91":1}}],["下载指定版本的源代码或二进制文件",{"2":{"88":1}}],["下载一个新的",{"2":{"55":1}}],["下载并编译",{"2":{"40":1}}],["下载",{"0":{"16":1},"1":{"17":1,"18":1},"2":{"14":1}}],["给你的家目录添加一个",{"2":{"41":1}}],["最终将删除对传统插件的支持",{"2":{"91":1}}],["最后",{"2":{"110":1}}],["最后完成执行",{"2":{"74":1}}],["最后回退到",{"2":{"40":1}}],["最新的稳定版本应该是",{"2":{"95":1}}],["最新版本应列在最后",{"2":{"90":1}}],["最新提交",{"2":{"61":1}}],["最新稳定版本",{"2":{"55":1}}],["最好在提交或推送到远程之前",{"2":{"2":1}}],["7",{"2":{"40":4,"92":1}}],["多版本可以通过空格将它们分隔开来",{"2":{"40":1}}],["传递系统上未由",{"2":{"40":1}}],["传统工作方式需要多个命令行版本管理器",{"2":{"30":1}}],["实际的版本号",{"2":{"40":1}}],["出现在目录中",{"2":{"40":1}}],["出于演示目的",{"2":{"21":1}}],["无论何时",{"2":{"40":1}}],["无法做到的",{"2":{"36":1}}],["无法做到这一点",{"2":{"8":1}}],["也由插件",{"2":{"74":1}}],["也包括用户特定的自定义",{"2":{"39":1}}],["也就是",{"2":{"11":1}}],["`$asdf",{"2":{"105":5}}],["`env`",{"2":{"38":1}}],["`asdf",{"2":{"38":1}}],["仅在没有此脚本的情况下才能支持传统插件",{"2":{"91":1}}],["仅在你安装插件",{"2":{"20":1}}],["仅为当前",{"2":{"70":1}}],["仅仅因为你可以为任何工具创建插件并使用",{"2":{"37":1}}],["简单性和熟悉性",{"2":{"37":1}}],["确保团队可以使用完全相同的工具版本",{"2":{"37":1}}],["个包的包集合来实现这一点",{"2":{"36":1}}],["许多命令行工具和超过",{"2":{"36":1}}],["旨在通过管理每个工具的整个依赖关系树中软件包的确切版本来构建真正可重复的环境",{"2":{"36":1}}],["管理工具安装过的可执行程序则需要通知",{"2":{"80":1}}],["管理版本",{"2":{"71":1}}],["管理的工具版本",{"2":{"40":1}}],["管理的工具时实时发生",{"2":{"25":1}}],["管理其版本",{"2":{"37":1}}],["管理你的软件包及其上游依赖",{"2":{"35":1}}],["目前还未提供",{"2":{"79":1}}],["目的是在工具",{"2":{"33":1}}],["目录并为这些脚本创建垫片",{"2":{"96":1}}],["目录的",{"2":{"92":1}}],["目录的所有",{"2":{"25":1}}],["目录中的任意文件创建垫片",{"2":{"92":1}}],["目录中",{"2":{"91":1,"92":1}}],["目录",{"2":{"56":9,"74":1,"92":1}}],["目录下",{"2":{"11":1}}],["目录添加到你的路径中",{"2":{"2":1}}],["等同于运行",{"2":{"105":5}}],["等包管理器使用它来确保个性化安装的正确的更新方法",{"2":{"47":1}}],["等工具都是用",{"2":{"33":1}}],["等",{"0":{"33":1},"2":{"57":1}}],["等等实现",{"2":{"74":1}}],["等等",{"2":{"19":1,"81":2}}],["相关的一些常见问题",{"2":{"77":1}}],["相关项目",{"0":{"32":1},"1":{"33":1,"34":1,"35":1,"36":1}}],["相应的配置也会不同",{"2":{"19":1}}],["识别",{"2":{"31":1}}],["一种可以替代的排序功能是",{"2":{"90":1}}],["一些工具像",{"2":{"53":1}}],["一个辅助程序",{"2":{"74":1}}],["一个",{"2":{"40":1}}],["一个用于长期维护",{"2":{"12":1}}],["一旦",{"2":{"31":1}}],["提交",{"2":{"40":1,"89":1}}],["提供单个交互方式和配置文件来简化开发工作流程",{"2":{"30":1}}],["提示",{"2":{"2":1,"4":1,"40":1}}],["垫片本身是非常简单的包装器",{"2":{"74":1}}],["垫片是在某个工具安装的过程中由插件创建",{"2":{"53":1}}],["垫片和安装器的位置",{"2":{"46":1}}],["垫片",{"0":{"74":1,"75":1},"1":{"75":1},"2":{"30":1,"31":1,"75":1,"80":1,"106":1}}],["操作",{"2":{"30":1}}],["操作系统不支持",{"2":{"90":1}}],["操作系统",{"2":{"22":1}}],["操作系统和安装方法的组合不同",{"2":{"19":1}}],["项目上运行测试",{"2":{"70":1}}],["项目简介",{"0":{"30":1},"1":{"31":1,"32":1,"33":1,"34":1,"35":1,"36":1,"37":1}}],["项目正在努力提供一些",{"2":{"5":1}}],["恭喜你完成了",{"2":{"29":1,"56":1}}],["完成指南",{"0":{"29":1}}],["完成配置",{"2":{"19":1}}],["参考页面可以了解更多配置选项",{"2":{"28":1}}],["yml",{"2":{"109":1}}],["yamllanguage",{"2":{"109":1}}],["yamlsteps",{"2":{"108":1}}],["yarn",{"2":{"53":3,"80":3}}],["yes",{"2":{"28":1,"42":1,"43":1,"44":1}}],["your",{"2":{"15":2,"18":1}}],["中的说明了解更多",{"2":{"111":1}}],["中的文件创建垫片",{"2":{"96":1}}],["中删除插件之前运行任何预删除操作",{"2":{"104":1}}],["中安装版本",{"2":{"92":1}}],["中为该包中的每个可执行程序创建垫片",{"2":{"74":1}}],["中所有可用命令的列表",{"2":{"38":1}}],["中",{"2":{"30":1,"34":1,"40":1,"56":1,"74":1,"91":1}}],["中加入以下内容",{"2":{"28":1}}],["中使用",{"2":{"7":1}}],["当你的插件的",{"2":{"95":1}}],["当你尝试运行其中一个可执行程序时",{"2":{"31":1}}],["当",{"2":{"74":1,"79":1}}],["当使用其他",{"2":{"109":1}}],["当使用",{"2":{"54":1}}],["当此文件存在时",{"2":{"47":1}}],["当通过插件安装工具时",{"2":{"31":1}}],["当在你想要的目录执行",{"2":{"27":1}}],["当前工作目录",{"2":{"27":1}}],["当为文档更改创建",{"2":{"9":1}}],["你还可以选择将相对路径传递给",{"2":{"109":1}}],["你将需要确认哪些变量映射到存储库路径",{"2":{"109":1}}],["你希望绕过",{"2":{"75":1}}],["你也需要使用相同的名称和引用",{"2":{"65":1}}],["你也可以包含注释在里面",{"2":{"40":1}}],["你可以像下面这样使用它",{"2":{"107":1}}],["你可以设定或取消设定环境变量",{"2":{"87":1}}],["你可以设置一个类似",{"2":{"70":1}}],["你可以将插件添加到官方插件存储库中",{"2":{"111":1}}],["你可以将工具的版本设置为",{"2":{"71":1}}],["你可以将配置文件放在项目的",{"2":{"30":1}}],["你可以指定",{"2":{"65":1}}],["你可以安装插件来管理特定的工具",{"2":{"31":1}}],["你可以通过运行",{"2":{"29":1}}],["你可以使用这些容器镜像作为开发服务器的基础镜像",{"2":{"5":1}}],["你现在可以管理你的项目的",{"2":{"29":1}}],["你需要告诉",{"2":{"26":1}}],["就是一个常见的例子",{"2":{"26":1}}],["某些操作系统已经有一些由系统而非",{"2":{"26":1}}],["全局默认配置将设置在文件$home",{"2":{"40":1}}],["全局默认配置在",{"2":{"26":1}}],["全局",{"0":{"26":1}}],["查找在执行",{"2":{"25":1}}],["查看版本子集",{"2":{"24":1}}],["查看",{"2":{"2":1}}],["60",{"2":{"36":1,"41":1,"45":1,"63":1}}],["6",{"0":{"25":1},"1":{"26":1,"27":1,"28":1},"2":{"72":1}}],["是",{"2":{"89":1}}],["是特定的分支",{"2":{"65":1}}],["是一种特殊情况",{"2":{"94":1}}],["是一种采用独特方法进行软件包管理和系统配置的工具",{"2":{"36":1}}],["是一个工具版本管理器",{"2":{"30":1}}],["是一个通过",{"2":{"24":1}}],["是我们用来构建",{"2":{"8":1}}],["注意",{"2":{"24":1,"37":1,"40":1,"74":1,"100":1,"109":1}}],["现在我们已经有了",{"2":{"24":1}}],["钩子",{"2":{"22":1}}],["来测试插件的可能",{"2":{"108":1}}],["来修复",{"2":{"105":1}}],["来管理可执行程序",{"2":{"80":1}}],["来管理工具",{"2":{"1":1}}],["来更新工具版本",{"2":{"40":1}}],["来查看它们",{"2":{"29":1}}],["来解析到执行时刻的实际版本号的辅助工具",{"2":{"24":1}}],["来说",{"2":{"22":1}}],["所以软件包中的任何脚本如果要由",{"2":{"74":1}}],["所以还没有对应的垫片存在",{"2":{"53":1}}],["所以我们可以开始安装某个版本了",{"2":{"24":1}}],["所以我们需要确认应该列举了这些依赖的插件源码",{"2":{"22":1}}],["所有其他的帮助回调脚本都是可选的",{"2":{"94":1}}],["所有插件都必须包含此脚本",{"2":{"91":1}}],["所有脚本除了",{"2":{"89":1}}],["所有配置文件",{"2":{"56":14}}],["所有命令",{"0":{"38":1}}],["所有的工具版本定义都包含在一个文件",{"2":{"30":1}}],["所有案例",{"2":{"2":1}}],["每行一个链接",{"2":{"94":1}}],["每行一个依赖项",{"2":{"94":1}}],["每个脚本将打印不同的文档到",{"2":{"94":1}}],["每个触发器事件发生时同步",{"2":{"45":1}}],["每个管理工具的不同命令以及存储库中不同的",{"2":{"33":1}}],["每个插件都有依赖",{"2":{"22":1}}],["每种语言的",{"2":{"11":1}}],["4",{"0":{"21":1},"1":{"22":1,"23":1},"2":{"70":3,"90":1}}],["工具的",{"2":{"29":1}}],["工具的容器化镜像",{"2":{"5":1}}],["工具和管理它们的版本时才开始真正发挥作用",{"2":{"20":1}}],["🎉",{"2":{"20":1,"29":1,"56":1}}],["更好的选择",{"2":{"90":1}}],["更长的",{"2":{"58":1}}],["更新前的",{"2":{"103":1}}],["更新",{"0":{"55":1,"61":1}}],["更改即时生效",{"2":{"19":1}}],["更大的",{"2":{"10":1}}],["让",{"2":{"19":1}}],["通常情况下",{"2":{"107":1}}],["通常",{"2":{"27":1,"46":1,"90":1}}],["通常打开一个新的终端标签页来重启你的",{"2":{"19":1}}],["通过查看由",{"2":{"95":1}}],["通过插件系统支持很多工具",{"2":{"37":1}}],["通过",{"2":{"14":1,"47":1,"58":1,"74":2}}],["+",{"2":{"19":2}}],["|",{"2":{"19":11}}],["正常工作",{"2":{"79":1}}],["正确地使用最新的",{"2":{"19":2}}],["正在使用依赖",{"2":{"9":1}}],["正在使用一个名为",{"2":{"4":1}}],["有一个依赖于",{"2":{"55":1}}],["有一流的国际化支持",{"2":{"11":1}}],["有些是",{"2":{"36":1}}],["有关的",{"2":{"19":2}}],["警告",{"2":{"19":1,"25":1}}],["插件中",{"2":{"106":1}}],["插件作者可以使用此功能来提供与其工具相关的实用命令",{"2":{"105":1}}],["插件有以下文件",{"2":{"105":1}}],["插件可以通过提供",{"2":{"105":1}}],["插件可能会有所帮助",{"2":{"75":1}}],["插件是一个包含几个可执行脚本的",{"2":{"87":1}}],["插件里有什么",{"0":{"87":1}}],["插件所安装的那些命令会自动创建垫片",{"2":{"80":1}}],["插件缩写索引",{"2":{"60":1}}],["插件告诉",{"2":{"57":1}}],["插件存储库同步到下一次存储库同步的持续时间",{"2":{"45":1}}],["插件",{"0":{"57":1},"1":{"58":1,"59":1,"60":1,"61":1,"62":1,"63":1},"2":{"24":1,"29":1,"42":1,"107":1}}],["插件依赖",{"0":{"22":1}}],["插件来安装和设置",{"2":{"21":1}}],["插件还在更新中",{"2":{"19":2}}],["插件或许需要更新才能通过",{"2":{"19":2}}],["插件或者通过在",{"2":{"19":1}}],["插件的缩写列表",{"2":{"12":1}}],["插件的协作",{"2":{"12":1}}],["框架",{"2":{"19":5}}],["框架插件",{"2":{"19":2,"56":1}}],["比如在",{"2":{"74":1}}],["比如使用",{"2":{"53":1}}],["比如",{"2":{"19":3,"28":1,"30":1,"40":1,"42":1,"46":1,"111":2}}],["=s",{"2":{"56":2}}],["=",{"2":{"19":9,"28":1,"41":6,"56":6}}],["包",{"2":{"94":1}}],["包管理器自动配置完成",{"2":{"19":1}}],["包含了开发所需的脚本",{"2":{"8":1}}],["包含",{"2":{"1":1,"107":1}}],["很友好的位置",{"2":{"19":1}}],["很友好",{"2":{"19":1}}],["处理",{"2":{"19":1}}],["按照",{"2":{"19":3}}],["按语言类型分隔开并单独导出",{"2":{"11":1}}],["加入到",{"2":{"19":12}}],["除非你知道你希望",{"2":{"46":1}}],["除非修改回",{"2":{"19":2}}],["除此之外",{"2":{"8":1}}],["zdotdir",{"2":{"19":1}}],["zshrc",{"2":{"19":5,"56":4,"81":1}}],["zsh",{"2":{"19":24,"56":6,"81":1}}],["zypper",{"2":{"15":2}}],["默认值是插件仓库的默认分支",{"2":{"107":1}}],["默认返回为",{"2":{"107":1}}],["默认是",{"2":{"63":1}}],["默认分支",{"2":{"61":1}}],["默认情况下",{"2":{"53":1,"92":1}}],["默认为",{"2":{"46":3,"74":1}}],["默认的",{"2":{"19":2,"56":1}}],["默认主题参考",{"2":{"10":1}}],["补全功能可能已经如",{"2":{"56":2}}],["补全功能可以被",{"2":{"19":1}}],["补全功能",{"2":{"19":2}}],["补全功能会被放在一个对",{"2":{"19":1}}],["补全功能会被",{"2":{"19":1}}],["补全功能将会自动配置",{"2":{"19":6}}],["补全功能将会在安装过程中由",{"2":{"19":1}}],["补全功能将需要",{"2":{"19":2}}],["补全功能必须按照以下命令手动配置完成",{"2":{"19":1}}],["补全功能必须在",{"2":{"19":2}}],["补丁",{"2":{"4":1}}],["$releases",{"2":{"110":1}}],["$cmd",{"2":{"110":2}}],["$github",{"2":{"110":2}}],["$travis",{"2":{"109":1}}],["$e",{"2":{"56":4}}],["$env",{"2":{"19":2}}],["$pwd",{"2":{"27":2,"70":1}}],["$path",{"2":{"19":1,"30":1,"74":1,"81":1}}],["$nu",{"2":{"19":3}}],["$fpath",{"2":{"19":1,"56":1}}],["$",{"2":{"19":16,"38":1,"56":17,"70":2,"74":6,"102":4,"103":5,"104":3,"105":4,"108":1}}],["$home",{"0":{"41":1},"1":{"42":1,"43":1,"44":1,"45":1},"2":{"19":8,"25":1,"26":2,"28":1,"56":49,"70":1}}],["$asdf",{"2":{"2":1,"47":1,"56":2,"74":1,"92":1,"105":2}}],["展开以下与你的系统最匹配的选项",{"2":{"19":1}}],["000",{"2":{"36":1}}],["0",{"2":{"17":1,"26":1,"27":1,"40":4,"45":1,"54":4,"70":2,"90":3,"91":1,"92":3,"98":1}}],["~",{"2":{"17":1,"19":49,"40":1,"46":3,"56":23,"74":1,"98":2,"100":1}}],["2014",{"2":{"83":1}}],["2",{"0":{"16":1},"1":{"17":1,"18":1},"2":{"40":7,"70":1,"79":1,"90":1}}],["overview",{"2":{"94":2}}],["own",{"2":{"76":1}}],["output",{"2":{"38":1}}],["ohmyzsh",{"2":{"19":4}}],["oh",{"2":{"19":5,"81":1}}],["opt",{"2":{"19":9,"46":1,"56":3}}],["optionally",{"2":{"38":3}}],["optional",{"2":{"4":2,"38":1}}],["or",{"2":{"18":1,"38":6,"76":2}}],["org",{"2":{"18":1}}],["one",{"2":{"38":1}}],["on",{"2":{"15":1,"38":4}}],["osx",{"2":{"90":1,"107":1,"109":1}}],["os",{"2":{"15":1,"38":1,"109":1}}],["official",{"0":{"17":1},"2":{"18":1}}],["of",{"2":{"15":1,"38":9,"76":1}}],["h",{"2":{"110":1}}],["haxe",{"2":{"105":3}}],["hashnuke",{"2":{"83":1,"84":1}}],["halcyon",{"2":{"59":1}}],["home",{"2":{"19":2}}],["homebrew",{"0":{"35":1},"2":{"15":1,"18":1,"19":12,"35":2,"47":1,"55":1,"56":7}}],["head",{"2":{"38":1,"55":2}}],["help",{"0":{"94":1},"2":{"29":1,"38":2,"94":5,"105":3,"107":1}}],["helper",{"2":{"18":1,"55":1}}],["here",{"2":{"15":1,"76":2}}],["highly",{"2":{"18":1}}],["html",{"2":{"8":1}}],["https",{"2":{"1":5,"7":3,"17":1,"18":1,"23":1,"38":2,"58":1,"59":2,"107":1,"109":1,"111":1}}],["11",{"2":{"72":1}}],["17",{"2":{"54":2,"65":1,"66":1,"67":1,"68":1,"69":1,"72":2,"73":1}}],["10",{"2":{"40":3}}],["16",{"2":{"26":1,"27":1,"54":2}}],["14",{"2":{"24":1,"54":4}}],["15",{"2":{"17":1,"40":5}}],["1",{"0":{"15":1},"2":{"45":1,"70":2,"78":1,"90":4,"98":1}}],["配置示例",{"0":{"109":1}}],["配置部分",{"2":{"70":1}}],["配置文档",{"2":{"63":1}}],["配置文件中启用了",{"2":{"100":1}}],["配置文件中移除使用",{"2":{"56":3}}],["配置文件中移除生效",{"2":{"56":11}}],["配置文件和实现方式",{"2":{"30":1}}],["配置文件",{"2":{"28":1,"81":1}}],["配置文件设置全局和项目版本",{"2":{"14":1}}],["配置自上次",{"2":{"45":1}}],["配置既包括可共享的",{"2":{"39":1}}],["配置中包含的单个",{"2":{"37":1}}],["配置中设置好之后",{"2":{"31":1}}],["配置和",{"2":{"19":1}}],["配置",{"0":{"39":1},"1":{"40":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1},"2":{"19":1,"28":1,"43":1,"44":1}}],["配置已经被提取并按照语言类型分隔开来",{"2":{"10":1}}],["为此",{"2":{"110":1}}],["为此插件注册其他设置器文件",{"2":{"100":1}}],["为你的插件提供帮助信息",{"2":{"94":1}}],["为",{"2":{"45":1,"80":1,"96":1}}],["为什么使用",{"0":{"37":1}}],["为了使你的用户更轻松",{"2":{"111":1}}],["为了安装",{"2":{"40":2}}],["为了启用此功能",{"2":{"28":1}}],["为了让补全功能正常工作需要安装",{"2":{"19":1}}],["为了简化根配置文件",{"2":{"10":1}}],["为每一个你想要管理的工具",{"2":{"14":1}}],["了解插件的完整缩写列表",{"2":{"60":1}}],["了解用于支持更多工具的插件",{"2":{"57":1}}],["了解现有的问题",{"2":{"13":1}}],["了解更多详情",{"2":{"10":1,"11":1,"49":1}}],["了解更多",{"2":{"2":1,"19":2,"34":1,"35":1,"36":1,"63":1,"80":1,"85":1}}],["主题搜索",{"2":{"12":1}}],["缩写存储库将同步到你的本地计算机并定期刷新",{"2":{"63":1}}],["缩写存储库",{"2":{"12":1}}],["社区驱动的项目",{"2":{"12":1}}],["组织",{"2":{"12":1}}],["execution",{"2":{"38":1}}],["executes",{"2":{"38":1}}],["executable",{"2":{"38":1,"98":1}}],["exec",{"0":{"50":1,"97":1,"98":1},"2":{"38":1,"50":1,"74":6,"98":2}}],["exhaustive",{"2":{"15":1}}],["edit",{"2":{"19":3,"56":3}}],["echo",{"2":{"19":7}}],["elm",{"2":{"58":2}}],["else",{"2":{"56":2}}],["elv",{"2":{"19":18,"56":6}}],["elvish",{"2":{"19":18,"46":1,"56":9}}],["elixir",{"2":{"12":1,"40":1,"57":1,"70":4,"106":2}}],["etc",{"2":{"19":2,"56":2}}],["e",{"2":{"19":9}}],["erlang",{"2":{"12":1,"58":1,"61":1,"62":1,"65":1,"66":2,"67":2,"68":2,"69":2,"72":2,"73":1}}],["environment",{"2":{"38":1}}],["env",{"0":{"51":1,"97":1},"2":{"38":1,"51":1,"74":1,"108":1}}],["en",{"2":{"11":2}}],["english",{"2":{"11":1}}],["随时欢迎大家维护和改进这些插件",{"2":{"12":1}}],["官方插件",{"0":{"12":1}}],["└─",{"2":{"11":4}}],["│",{"2":{"11":1}}],["├─",{"2":{"11":5}}],["如发布候选版本",{"2":{"95":1}}],["如上面的",{"2":{"71":1}}],["如上所述默认为",{"2":{"46":1}}],["如",{"2":{"57":1}}],["如何处理不同的工具",{"2":{"57":1}}],["如果指定了",{"2":{"107":2}}],["如果扩展命令未设置其可执行位",{"2":{"105":1}}],["如果未指定此脚本",{"2":{"96":1}}],["如果未设置",{"2":{"92":1}}],["如果实现了此回调",{"2":{"95":1}}],["如果设置了可执行位",{"2":{"105":1}}],["如果设置",{"2":{"92":1}}],["如果在存储库目录中运行测试脚本",{"2":{"109":1}}],["如果在安装过程开始时填充了",{"2":{"92":1}}],["如果在过去的",{"2":{"63":1}}],["如果安装失败",{"2":{"92":1}}],["如果此脚本不存在",{"2":{"91":1}}],["如果可能",{"2":{"91":1,"92":1}}],["如果可行的话",{"2":{"42":1}}],["如果下载失败",{"2":{"91":2}}],["如果下载的源代码或者二进制文件是压缩的",{"2":{"91":1}}],["如果必须手动对版本进行排序",{"2":{"90":1}}],["如果从网站上的发布页面拉取版本",{"2":{"90":1}}],["如果有一个",{"2":{"106":1}}],["如果有很多版本",{"2":{"90":1}}],["如果有的话",{"2":{"81":1,"102":1}}],["如果有需要也会创建此文件",{"2":{"70":1}}],["如果",{"2":{"81":1,"89":1,"101":1}}],["如果由于某种原因",{"2":{"75":1}}],["如果一个插件支持从源代码下载和编译",{"2":{"65":1}}],["如果用了的话",{"2":{"56":1}}],["如果通过",{"2":{"46":1}}],["如果已过自上次同步的持续时间",{"2":{"45":1}}],["如果持续时间已过",{"2":{"45":1}}],["如果没有为工具找到指定的版本",{"2":{"25":1}}],["如果你的插件的",{"2":{"110":1}}],["如果你的插件提供了",{"2":{"105":1}}],["如果你希望",{"2":{"94":1}}],["如果你希望你的插件使用",{"2":{"92":1}}],["如果你只是想为当前",{"2":{"70":1}}],["如果你在",{"2":{"56":1}}],["如果你使用了其他方法安装",{"2":{"55":1}}],["如果你把",{"2":{"46":1}}],["如果你正在使用自定义的",{"2":{"19":2}}],["如果你正在使用",{"2":{"19":4,"56":1}}],["如果你想要更新特定的包",{"2":{"61":1}}],["如果你想要在不更改已安装的",{"2":{"2":1}}],["如果你想要使用",{"2":{"1":1}}],["如下所示",{"2":{"11":1,"61":1}}],["将复制这个文件替代使用标准垫片模板",{"2":{"106":1}}],["将在安装中查找",{"2":{"96":1}}],["将使用它来确定工具的最新稳定版本",{"2":{"95":1}}],["将打印标题",{"2":{"94":1}}],["将为",{"2":{"92":1}}],["将下载并安装该版本",{"2":{"91":1}}],["将假设存在",{"2":{"91":1}}],["将版本写到",{"2":{"70":2}}],["将运行垫片",{"2":{"31":1}}],["将管理权还给系统",{"2":{"26":1}}],["将显示当前目录中的工具和版本解析结果",{"2":{"25":1}}],["将会简单读取文件来确定版本",{"2":{"101":1}}],["将会触发同步",{"2":{"63":1}}],["将会触发持续时间的检查",{"2":{"45":1}}],["将会被禁用",{"2":{"47":1}}],["将会使用这个文件所指定的配置",{"2":{"41":1}}],["将会使脚本生效并安装补全功能",{"2":{"19":2}}],["将会引导你",{"2":{"26":1}}],["将会创建一个新的",{"2":{"4":3}}],["将要求",{"2":{"11":1}}],["键同名的目录位置",{"2":{"11":1}}],["侧边栏配置在上述配置文件中捕获",{"2":{"11":1}}],["侧边栏配置引用",{"2":{"11":1}}],["导航栏",{"2":{"11":1}}],["导航栏和侧边栏",{"2":{"10":1}}],["定义了支持的语言类型及其",{"2":{"11":1}}],["定义了拉取请求标题的格式",{"2":{"4":1}}],["根配置文件",{"2":{"11":1}}],["根据以下步骤卸载",{"2":{"56":1}}],["根据",{"2":{"7":1,"19":1}}],["国际化官方文档",{"2":{"11":1}}],["国际化",{"0":{"11":1}}],["if",{"2":{"38":1,"110":1}}],["information",{"2":{"38":1}}],["info",{"0":{"52":1},"2":{"38":1,"52":1}}],["inside",{"2":{"38":1}}],["installs",{"2":{"98":1}}],["installed",{"2":{"38":5}}],["install",{"0":{"92":1},"2":{"1":1,"7":2,"15":6,"18":1,"22":3,"24":1,"38":10,"40":2,"44":1,"53":1,"65":2,"66":4,"80":1,"87":1,"88":1,"89":6,"91":1,"92":6,"94":2,"96":3,"98":1}}],["into",{"2":{"19":2}}],["initialise",{"2":{"19":1}}],["in",{"2":{"15":1,"38":3,"76":1}}],["is",{"2":{"15":1}}],["i18n",{"0":{"11":1},"2":{"11":1}}],["它需要带",{"2":{"107":1}}],["它仅仅被使用在了",{"2":{"106":1}}],["它提供了",{"2":{"105":1}}],["它",{"2":{"74":1}}],["它会在",{"2":{"74":1}}],["它所声明的工具版本将会被用于该目录和任意子目录",{"2":{"40":1}}],["它是一个工具版本管理器",{"2":{"37":1}}],["它是如何工作的",{"0":{"31":1}}],["它不是包管理器",{"2":{"35":1}}],["它消除了每个工具",{"2":{"33":1}}],["它们是可选的",{"2":{"94":1}}],["它们是",{"2":{"10":1,"22":1}}],["它被选中来取代",{"2":{"8":1}}],["对于目前的",{"2":{"106":1}}],["对于名为",{"2":{"106":1}}],["对于配置",{"2":{"89":1}}],["对于项目中的其他工具类型可以执行类似步骤即可",{"2":{"29":1}}],["对于",{"2":{"22":1,"46":1,"95":1}}],["对于社区插件",{"2":{"12":1}}],["对话和贡献指南",{"2":{"13":1}}],["对象表示",{"2":{"10":1}}],["对象用于表示配置",{"2":{"10":1}}],["对你有帮助",{"2":{"1":1}}],["以列出你的插件并使用较短的命令轻松安装",{"2":{"111":1}}],["以确保安装的工具正常工作",{"2":{"107":1}}],["以确认是否安装了该工具版本",{"2":{"92":1}}],["以选择",{"2":{"95":1}}],["以便它看起来更接近用户的提示",{"2":{"90":1}}],["以便你可以观察哪些工具将无法执行",{"2":{"25":1}}],["以下是",{"2":{"77":1}}],["以下是所需工具的原始列表",{"2":{"1":1}}],["以及要在其中执行的环境",{"2":{"74":1}}],["以及使用以下命令卸载",{"2":{"56":3}}],["以及使用以下命令移除补全功能",{"2":{"56":1}}],["以及更新版本",{"2":{"56":1}}],["以及作为",{"2":{"37":1}}],["以及",{"2":{"9":1}}],["具体的文档可以查看",{"2":{"9":1}}],["标签",{"2":{"107":1}}],["标签或者提交",{"2":{"65":1}}],["标题使用了约定式提交类型",{"2":{"9":1}}],["标题中的约定式提交的自动化发布流水线",{"2":{"9":1}}],["标识的",{"2":{"3":1}}],["rvmrc",{"2":{"100":1}}],["rm",{"2":{"56":4}}],["rs",{"2":{"56":4}}],["rf",{"2":{"56":26}}],["rbenv",{"0":{"33":1},"2":{"28":1,"33":1,"42":1}}],["rc",{"2":{"19":9,"56":3}}],["ruby",{"2":{"12":1,"28":1,"40":2,"42":3,"57":1,"95":3,"100":1}}],["runs",{"2":{"38":1}}],["run",{"2":{"8":2,"15":1}}],["relate",{"2":{"76":1}}],["related",{"2":{"76":1}}],["release",{"0":{"43":1},"2":{"4":1,"38":1,"41":1}}],["responsible",{"2":{"76":1}}],["resources",{"2":{"38":1}}],["reshim",{"0":{"53":1},"2":{"38":1,"53":2,"80":1,"81":1}}],["recreate",{"2":{"38":1}}],["recommend",{"2":{"18":1}}],["returned",{"2":{"38":1}}],["remove",{"0":{"104":1},"2":{"38":3,"62":2,"104":4}}],["registered",{"2":{"38":1}}],["ref>",{"2":{"38":1,"107":1}}],["ref",{"2":{"38":2,"40":2,"65":1,"89":2,"103":4,"107":1}}],["refs",{"2":{"38":1}}],["refactor",{"2":{"4":1}}],["required",{"2":{"15":1}}],["requires",{"2":{"15":1}}],["request",{"2":{"4":1}}],["repository",{"0":{"45":1},"2":{"38":1,"41":2,"63":1}}],["repo",{"2":{"13":1,"38":3,"110":1}}],["readme",{"2":{"11":4,"75":1,"105":1}}],["revert",{"2":{"4":1}}],["启动本地开发服务器",{"2":{"8":1}}],["5",{"0":{"24":1},"2":{"8":1,"26":1,"27":1,"40":2,"54":2,"72":1}}],["依赖于访问",{"2":{"110":1}}],["依赖脚本可以将依赖项输出为必须安装的",{"2":{"94":1}}],["依赖",{"2":{"7":1}}],["运行环境对管理工具的需求",{"2":{"33":1}}],["运行环境版本管理领域竞争",{"2":{"33":1}}],["运行环境的一个版本",{"2":{"14":1}}],["运行环境安装插件",{"2":{"14":1}}],["运行环境",{"2":{"7":1}}],["jruby",{"2":{"95":2}}],["j",{"2":{"89":1}}],["jthegedus",{"2":{"84":1}}],["java",{"2":{"59":3}}],["javascript",{"2":{"7":1,"8":1,"10":1}}],["join",{"2":{"19":4,"56":2}}],["json",{"2":{"7":1,"8":2}}],["js",{"2":{"7":2,"8":1,"10":5,"11":2,"12":1,"21":1,"24":1,"54":1,"57":1}}],["引擎的",{"2":{"7":1}}],["基于",{"2":{"7":1}}],["进行安装",{"2":{"46":1}}],["进行管理",{"2":{"7":1}}],["进一步相关文档请查看",{"2":{"3":1}}],["初始化设置",{"0":{"7":1}}],["初始化安装",{"0":{"1":1}}],["网站的根配置文件",{"2":{"10":1}}],["网站的配置包含在几个",{"2":{"10":1}}],["网站贡献指南",{"2":{"6":1}}],["网站",{"0":{"6":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1}}],["镜像",{"0":{"5":1}}],["大版本",{"2":{"4":1}}],["mri",{"2":{"95":1}}],["my",{"2":{"19":5,"81":1,"108":1,"111":3}}],["method",{"2":{"18":2}}],["methods",{"0":{"18":1}}],["mit",{"2":{"83":1}}],["mix",{"2":{"70":1}}],["might",{"2":{"15":1}}],["minor",{"2":{"4":1}}],["md",{"2":{"11":6}}],["man",{"2":{"105":3}}],["managed",{"2":{"76":1}}],["manage",{"2":{"38":1}}],["manager",{"2":{"15":2}}],["make",{"2":{"89":1}}],["makepkg",{"2":{"18":1}}],["maintenance",{"2":{"76":1}}],["master",{"2":{"38":1,"55":1}}],["may",{"2":{"15":1}}],["macos",{"2":{"15":2,"19":4,"22":1,"35":1,"56":3}}],["markdown",{"2":{"8":1,"11":2}}],["major",{"2":{"4":1}}],["小版本",{"2":{"4":1}}],["表示重大更改",{"2":{"4":1}}],["wsl",{"2":{"79":1}}],["wsl2",{"0":{"79":1},"2":{"79":4}}],["wsl1",{"0":{"78":1},"2":{"78":2}}],["which",{"2":{"38":1,"74":2}}],["where",{"2":{"38":1,"74":2}}],["we",{"2":{"18":1}}],["website",{"2":{"4":2}}],["windows",{"2":{"78":1,"79":2}}],["with",{"2":{"4":1,"19":1,"38":3,"108":1}}],["will",{"2":{"3":2}}],["unix",{"2":{"79":1}}],["uninstall",{"0":{"99":1},"2":{"38":1,"56":5,"73":2,"87":1}}],["upgrade",{"2":{"55":2}}],["updates",{"2":{"47":1}}],["update",{"0":{"103":1},"2":{"4":1,"38":8,"43":1,"47":1,"55":2,"61":3,"103":4}}],["util",{"2":{"38":2,"51":1}}],["utils",{"2":{"38":1,"105":1}}],["uz",{"2":{"19":1,"56":1}}],["uses",{"2":{"108":1}}],["user",{"2":{"111":1}}],["users",{"2":{"72":3}}],["user>",{"2":{"1":1,"7":1}}],["used",{"2":{"38":3}}],["use",{"0":{"43":1},"2":{"18":1,"19":3,"41":1,"46":1}}],["using",{"2":{"18":1}}],["us",{"2":{"11":1}}],["urls",{"2":{"38":3,"59":1}}],["url>",{"2":{"38":1,"58":1,"107":1}}],["url",{"2":{"11":1,"38":1,"58":2,"102":2,"111":1}}],["ubuntu",{"2":{"5":1,"94":1}}],["faq",{"0":{"77":1},"1":{"78":1,"79":1,"80":1,"81":1}}],["f",{"2":{"56":3}}],["fetch",{"2":{"55":1}}],["feature",{"2":{"4":2}}],["feat",{"2":{"4":4}}],["from",{"2":{"38":1}}],["fpath=",{"2":{"19":1,"56":1}}],["fpath",{"2":{"19":3}}],["fi",{"2":{"110":1}}],["filter",{"2":{"38":2}}],["filenames",{"0":{"100":1}}],["filename",{"2":{"46":1}}],["file",{"0":{"42":1,"101":1},"2":{"28":1,"38":2,"41":1,"46":1,"100":1,"101":1,"105":1}}],["fish",{"2":{"19":19,"46":1,"56":17,"74":1,"81":2}}],["fix",{"2":{"4":4}}],["foox",{"2":{"98":1}}],["foo",{"2":{"11":2,"65":2,"98":4,"105":11,"106":2}}],["force",{"2":{"56":5}}],["format",{"2":{"8":1}}],["for",{"2":{"4":1,"15":1,"19":2,"38":7,"76":2,"78":1,"79":1}}],["fork",{"2":{"1":2,"7":2}}],["例子调用",{"2":{"98":1}}],["例子",{"2":{"4":1}}],["例如对于",{"2":{"95":1}}],["例如",{"2":{"3":1,"54":1,"94":1,"95":1,"105":1,"107":1,"109":1}}],["强制使用准确的版本",{"2":{"24":1}}],["强制执行的",{"2":{"4":1}}],["强烈建议在编写测试之前检查现有的测试套件和",{"2":{"3":1}}],["这对于在该插件的",{"2":{"107":1}}],["这使得无法使用标准的",{"2":{"106":1}}],["这可用于在从",{"2":{"104":1}}],["这可用于在",{"2":{"103":1}}],["这可用于在插件添加到",{"2":{"102":1}}],["这可用于进一步解析",{"2":{"101":1}}],["这可以在插件中通过",{"2":{"74":1}}],["这可以当作是清理",{"2":{"62":1}}],["这可以设置在",{"2":{"46":1}}],["这仅适用于在",{"2":{"100":1}}],["这允许插件有条件地覆盖垫片指定的可执行程序路径",{"2":{"98":1}}],["这应该用于过滤所有最新稳定版本",{"2":{"95":1}}],["这应该是与插件和工具相关的链接列表",{"2":{"94":1}}],["这不是一个回调脚本",{"2":{"94":1}}],["这样的插件",{"2":{"105":1}}],["这样的东西就足够了",{"2":{"90":1}}],["这样就完成了",{"2":{"20":1}}],["这很有帮助",{"2":{"90":1}}],["这需要你在设置你的",{"2":{"81":1}}],["这种默认行为是不可取的",{"2":{"95":1}}],["这种更新方式将会获取插件存储库的",{"2":{"61":1}}],["这种方式供语言开发者等使用",{"2":{"40":1}}],["这将指示",{"2":{"96":1}}],["这将为某个包的当前版本重新创建垫片",{"2":{"53":1}}],["这将会是一个项目的",{"2":{"27":1}}],["这是一个",{"2":{"109":1}}],["这是一个注释",{"2":{"40":1}}],["这是为什么",{"2":{"80":1}}],["这是另一个注释",{"2":{"40":1}}],["这是通过",{"2":{"4":1}}],["这个功能的一个很好的例子是像",{"2":{"105":1}}],["这个位于",{"2":{"74":1}}],["这个周期由以下方法确定",{"2":{"63":1}}],["这个工具将会安装",{"2":{"40":1}}],["这个列表就是",{"2":{"38":1}}],["这个责任取决于用户",{"2":{"35":1}}],["这个信息是通过读取自上次发布以来的提交历史记录来确定的",{"2":{"4":1}}],["这在每个插件中都原生支持",{"2":{"28":1}}],["这些附加的环境变量将可用于",{"2":{"89":2}}],["这些脚本或可执行程序将使用插件名称作为",{"2":{"105":1}}],["这些脚本的每一个都应根据当前操作系统调整其输出",{"2":{"94":1}}],["这些脚本在执行",{"2":{"87":1}}],["这些脚本能为工具安装的可执行程序创建垫片",{"2":{"33":1}}],["这些插件所对应的存储库链接如下所示",{"2":{"12":1}}],["这些配置的官方文档位于",{"2":{"10":1}}],["约定式提交遵循以下格式",{"2":{"4":1}}],["约定式提交",{"2":{"4":1}}],["变更日志",{"2":{"4":1}}],["变量设置为克隆存储库的路径",{"2":{"2":1}}],["拉取请求标题必须遵循这种格式",{"2":{"4":1}}],["拉取请求",{"0":{"4":1,"9":1}}],["部分所述",{"2":{"71":1}}],["部分",{"2":{"3":1}}],["x",{"2":{"63":2}}],["x26",{"2":{"3":1,"19":2,"56":2}}],["x3c",{"2":{"1":1,"4":3,"7":1,"38":38,"50":1,"51":1,"53":2,"54":1,"58":3,"61":1,"62":1,"65":2,"66":3,"67":3,"68":3,"69":3,"70":13,"71":1,"72":1,"73":2,"98":3,"107":4}}],[">>",{"2":{"19":15}}],[">",{"2":{"3":1,"4":1}}],["dylibs",{"2":{"105":1}}],["danhper",{"2":{"84":1}}],["data",{"2":{"46":1,"56":11,"74":1,"105":5}}],["driven",{"2":{"76":1}}],["duration",{"0":{"45":1},"2":{"41":1,"63":1}}],["during",{"2":{"3":2}}],["disabled",{"2":{"47":1}}],["disable",{"2":{"41":1}}],["display",{"2":{"38":4}}],["direnv",{"0":{"34":1},"2":{"34":3,"75":1}}],["dirmngr",{"2":{"22":1}}],["dir=",{"2":{"19":3}}],["dir",{"2":{"2":1,"19":4,"46":2,"47":1,"56":12,"74":1,"105":6,"109":1}}],["d",{"2":{"19":2,"56":2}}],["downlaod",{"2":{"92":1}}],["download",{"0":{"17":1,"18":1,"44":1,"91":1},"2":{"41":1,"88":1,"89":4,"91":3,"92":1}}],["do",{"2":{"76":1}}],["docker",{"0":{"5":1}}],["documentation",{"2":{"4":1,"38":1}}],["docsify",{"2":{"8":2}}],["docs",{"2":{"4":3,"7":2,"9":2,"10":3,"11":2,"38":1}}],["dnf",{"2":{"15":2}}],["deps",{"2":{"94":1}}],["depending",{"2":{"15":1}}],["debug",{"2":{"38":1}}],["debian",{"2":{"22":1}}],["default",{"2":{"38":3,"46":1}}],["description",{"2":{"9":1}}],["description>",{"2":{"4":1}}],["dev",{"2":{"8":1,"76":2}}],["npm",{"2":{"53":2,"54":2,"80":1}}],["name",{"2":{"38":1,"40":1,"41":1,"45":1,"63":1,"71":1,"102":2,"103":2,"104":2,"107":1,"108":1}}],["name>",{"2":{"38":19,"53":1,"58":2,"61":1,"62":1,"65":1,"66":2,"67":2,"68":2,"69":2,"70":5,"71":1,"72":1,"73":1,"107":1}}],["navbar",{"2":{"10":1,"11":4}}],["nix",{"2":{"36":1}}],["nixos",{"0":{"36":1},"2":{"36":3}}],["nvm",{"0":{"33":1},"2":{"33":1}}],["nvmrc",{"2":{"28":1}}],["n$env",{"2":{"19":3}}],["nu",{"2":{"19":9}}],["nushell",{"2":{"19":6}}],["nsource",{"2":{"19":1}}],["neko",{"2":{"105":1}}],["never",{"2":{"45":1}}],["nexport",{"2":{"19":1}}],["nested",{"2":{"11":2}}],["new",{"2":{"4":1}}],["no",{"2":{"41":4,"42":1,"43":1,"44":1}}],["non",{"2":{"15":1}}],["node",{"2":{"7":2,"12":1,"21":1,"24":1,"28":1,"54":3,"57":1,"72":1,"107":1,"109":2}}],["nodejs插件安装了这些工具的很多版本时",{"2":{"54":1}}],["nodejs",{"2":{"7":2,"21":1,"22":1,"23":2,"24":3,"26":2,"27":2,"28":1,"29":1,"40":2,"53":2,"54":6,"59":3,"72":1,"107":3,"109":2}}],["note",{"2":{"15":1,"76":1}}],["not",{"2":{"3":1,"76":2}}],["n",{"0":{"33":1},"2":{"3":2,"19":16,"33":1,"110":1}}],["39cb398vb39",{"2":{"40":1}}],["3",{"0":{"19":1},"2":{"3":2,"8":1,"40":4,"54":2,"65":1,"72":2,"73":1,"90":1}}],["g",{"2":{"53":1,"80":1}}],["given",{"2":{"38":1}}],["gitref",{"2":{"107":1}}],["git",{"2":{"1":8,"7":5,"15":7,"17":1,"18":3,"19":8,"23":1,"27":1,"30":1,"38":6,"55":2,"56":5,"58":3,"59":2,"87":1,"89":1,"103":2,"107":3,"109":2,"111":1}}],["github",{"0":{"13":1,"108":1,"110":1},"2":{"1":7,"4":1,"7":5,"12":1,"17":1,"23":1,"38":2,"40":1,"58":1,"59":2,"76":2,"79":2,"85":1,"107":1,"108":4,"109":1,"110":2,"111":1}}],["global",{"2":{"26":1,"38":4,"40":1,"70":5,"71":1,"74":1}}],["gawk",{"2":{"22":2}}],["gpg",{"2":{"22":2}}],["get",{"2":{"22":1,"94":1}}],["gt",{"2":{"3":1,"4":2,"9":1,"40":1,"45":1,"53":1,"63":1,"71":1,"94":3,"96":3,"107":1}}],["使用信息",{"2":{"94":1}}],["使用自己的编程语言",{"2":{"36":1}}],["使用可以根据当前目录加载和卸载环境变量的新功能增强现有",{"2":{"34":1}}],["使用现有工具版本文件",{"0":{"28":1}}],["使用",{"2":{"19":2,"40":1,"71":1,"80":1}}],["使用以下命令可以设置一个全局版本",{"2":{"26":1}}],["使用以下命令将",{"2":{"19":12}}],["使用以下命令安装工具版本",{"2":{"7":1}}],["使用以下命令安装这些版本来开发",{"2":{"1":1}}],["使用以下命令添加插件",{"2":{"7":1}}],["使用带有",{"2":{"3":1}}],["文件支持的版本格式相同",{"2":{"70":1}}],["文件了解更多详情",{"2":{"70":1,"75":1}}],["文件读取版本",{"2":{"42":1}}],["文件然后",{"2":{"41":1}}],["文件所指定的版本",{"2":{"40":1}}],["文件的目录中运行",{"2":{"40":1}}],["文件的目录中不带其他参数执行",{"2":{"40":1}}],["文件的同一集合位于",{"2":{"11":1}}],["文件示例如下所示",{"2":{"40":1}}],["文件进行迁移",{"2":{"28":1}}],["文件内容将会如下所示",{"2":{"26":1,"27":1}}],["文件",{"2":{"8":1,"28":1,"39":1,"42":1,"46":2,"106":1}}],["文件安装",{"2":{"7":1}}],["文件中提及",{"2":{"105":1}}],["文件中指定",{"2":{"74":1}}],["文件中配置",{"2":{"63":1}}],["文件中找不到任何配置",{"2":{"56":1}}],["文件中定义的某个工具",{"2":{"40":1}}],["文件中定义的所有工具",{"2":{"40":1}}],["文件中设置的工具版本并执行该版本",{"2":{"31":1}}],["文件中进行管理",{"2":{"26":1}}],["文件中进行工具的版本查找",{"2":{"25":1}}],["文件中使用以下内容手动配置完成",{"2":{"19":1}}],["文件中加入以下内容自动配置",{"2":{"19":1}}],["文件中加入以下内容来配置完成",{"2":{"19":1}}],["文件中加入以下内容",{"2":{"19":11}}],["文件中",{"2":{"1":1,"10":1,"19":12,"27":1,"40":1,"70":2}}],["文档中已涵盖的任何信息",{"2":{"94":1}}],["文档网站的静态站点生成器",{"2":{"8":1}}],["文档网站开发所需的工具都在文件",{"2":{"7":1}}],["文档",{"0":{"6":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1},"2":{"2":1,"3":1,"6":1,"10":1,"34":1,"35":1,"36":1}}],["请根据你的需要进行自定义",{"2":{"109":1}}],["请仅在真的需要时才使用此功能",{"2":{"106":1}}],["请务必在插件的",{"2":{"105":1}}],["请务必查看其",{"2":{"75":1}}],["请检查是否存在",{"2":{"92":1}}],["请注意",{"2":{"90":1,"94":1}}],["请按照",{"2":{"56":1}}],["请设置该变量到那个目录",{"2":{"46":1}}],["请在",{"2":{"28":1,"92":1}}],["请在创建拉取请求之前覆盖新的代码路径",{"2":{"2":1}}],["请继续阅读下面的指南来了解这些是如何做到的",{"2":{"20":1}}],["请参考",{"2":{"12":1,"13":1,"57":1,"60":1}}],["请参考以下文件",{"2":{"10":1}}],["请查看插件存储库",{"2":{"111":1}}],["请查看",{"2":{"10":1,"11":1,"19":2,"28":1,"34":1,"35":1,"36":1,"49":1,"63":1,"70":1,"80":1,"85":1}}],["请确保在访问时提供授权令牌",{"2":{"110":1}}],["请确保",{"2":{"9":1,"19":2}}],["请求时",{"2":{"9":1}}],["请使用约定式提交信息格式作为拉取请求标题",{"2":{"4":1}}],["请使用以下命令添加这些插件",{"2":{"1":1}}],["增加测试",{"2":{"2":1}}],["特定命令",{"2":{"2":1}}],["测试插件",{"0":{"107":1},"1":{"108":1,"109":1}}],["测试",{"0":{"3":1},"2":{"2":2}}],["格式化",{"2":{"2":1}}],["格式化器和解释器",{"2":{"1":1}}],["src",{"2":{"40":1}}],["specific",{"2":{"38":2}}],["specified",{"2":{"38":1}}],["specifying",{"2":{"38":1}}],["spack",{"2":{"15":2}}],["save",{"2":{"19":3}}],["sort",{"2":{"90":1}}],["source",{"2":{"19":3,"74":2,"102":1}}],["some",{"2":{"3":3,"4":3,"15":1,"76":1}}],["si",{"2":{"18":1}}],["sidebar",{"2":{"10":1,"11":4}}],["subsystem",{"2":{"78":1,"79":1}}],["supporting",{"2":{"76":1}}],["supported",{"0":{"18":1}}],["sudo",{"2":{"15":1}}],["system",{"2":{"15":1,"40":3,"71":3}}],["stdout",{"2":{"94":1}}],["stable",{"0":{"95":1},"2":{"38":5}}],["stratus3d",{"2":{"84":1}}],["string",{"2":{"19":2,"38":1,"56":2}}],["str",{"2":{"19":2}}],["steps",{"2":{"15":1}}],["style",{"2":{"4":1}}],["secrets",{"2":{"108":1}}],["security",{"2":{"76":1}}],["set",{"2":{"19":3,"38":7,"56":3,"72":3}}],["selectlanguagename",{"2":{"11":2}}],["semantic",{"2":{"4":1}}],["semver",{"2":{"4":4}}],["ssg",{"2":{"8":1}}],["script",{"2":{"74":2,"109":2}}],["scripts",{"2":{"2":2}}],["scope",{"2":{"4":1}}],["s",{"2":{"3":2,"15":1,"19":5,"110":1}}],["short",{"2":{"41":1}}],["show",{"2":{"38":3}}],["shim",{"0":{"54":1},"2":{"38":3,"54":3}}],["shims",{"0":{"74":1},"1":{"75":1},"2":{"2":1,"38":1,"74":2,"106":1}}],["sh",{"2":{"19":17,"46":1,"56":16,"74":3,"81":1,"109":1}}],["shfmt",{"2":{"1":4,"2":1}}],["shellcmd=",{"2":{"110":1}}],["shellcheck",{"2":{"1":3,"2":1}}],["shell$",{"2":{"105":1}}],["shellfoo",{"2":{"105":1}}],["shell用法",{"2":{"98":1}}],["shellbin",{"2":{"96":1}}],["shellbrew",{"2":{"56":5}}],["shell1",{"2":{"90":1}}],["shellif",{"2":{"56":2}}],["shelluse",{"2":{"56":3}}],["shellpacman",{"2":{"56":4}}],["shellrm",{"2":{"56":25}}],["shell➜",{"2":{"54":2}}],["shellexport",{"2":{"19":2}}],["shellecho",{"2":{"19":8}}],["shellmkdir",{"2":{"19":4}}],["shellsource",{"2":{"19":2,"56":3}}],["shellgit",{"2":{"17":1}}],["shelldocs",{"2":{"11":1}}],["shellnpm",{"2":{"7":1,"8":2}}],["shellasdf",{"2":{"1":2,"7":2,"23":1,"24":1,"26":1,"27":1,"50":1,"51":1,"52":1,"53":1,"54":1,"58":2,"59":2,"60":1,"61":2,"65":1,"66":2,"67":2,"68":2,"69":2,"70":2,"71":1,"72":1,"73":1,"107":2}}],["shell",{"0":{"81":1},"2":{"1":3,"2":1,"3":1,"7":1,"19":21,"31":1,"33":1,"34":1,"37":2,"38":3,"52":1,"56":9,"70":4,"71":1,"74":2,"81":1,"100":1}}],["脚本获取",{"2":{"105":1}}],["脚本或者可执行程序来定义新的",{"2":{"105":1}}],["脚本将传递文件路径作为其第一个参数",{"2":{"101":1}}],["脚本还应该根据设置变量",{"2":{"94":1}}],["脚本已经下载源代码",{"2":{"92":1}}],["脚本回调时下载源代码",{"2":{"92":1}}],["脚本应仅在安装脚本认为工具的生成和安装成功后",{"2":{"92":1}}],["脚本应以任何非零退出状态退出",{"2":{"92":1}}],["脚本应该仅将文件放在",{"2":{"91":1}}],["脚本自定义",{"2":{"92":1}}],["脚本必须以任何非零退出状态退出",{"2":{"91":1}}],["脚本下载源代码或二进制文件的路径",{"2":{"89":1}}],["脚本执行情况下",{"2":{"89":1}}],["脚本提供",{"2":{"74":1}}],["脚本的位置",{"2":{"46":1}}],["脚本的",{"2":{"37":1}}],["脚本的静态分析工具",{"2":{"1":1}}],["脚本写的",{"2":{"33":1}}],["脚本需要在设置好的",{"2":{"19":1}}],["脚本",{"0":{"94":1},"2":{"19":1,"89":2,"91":1}}],["脚本检查",{"2":{"2":1}}],["命令用于测试插件",{"2":{"107":1}}],["命令的子命令进行调用",{"2":{"105":1}}],["命令的打印内容",{"2":{"38":1}}],["命令可能会认为该工具版本已经安装",{"2":{"92":1}}],["命令会在自己的行打印每个版本",{"2":{"90":1}}],["命令会返回",{"2":{"54":1}}],["命令时被执行",{"2":{"87":1}}],["命令文档",{"2":{"80":1}}],["命令选择",{"2":{"74":1}}],["命令将会强制重新计算任何新可执行程序的垫片",{"2":{"53":1}}],["命令安装",{"2":{"53":1}}],["命令行的扩展命令",{"0":{"105":1}}],["命令行",{"2":{"53":1}}],["命令列表很小",{"2":{"48":1}}],["命令进行的更新",{"2":{"47":1}}],["命令以保留或删除下载的源代码或二进制文件",{"2":{"44":1}}],["命令以升级到最新的候选版本",{"2":{"43":1}}],["命令主要分为三类",{"2":{"29":1}}],["命令",{"2":{"2":1,"40":2,"45":1,"63":1,"74":1,"80":2,"105":1}}],["long",{"2":{"76":1}}],["local",{"2":{"27":1,"38":4,"40":1,"70":3,"71":3,"74":1}}],["locales",{"2":{"11":1}}],["locale",{"2":{"11":1}}],["last",{"0":{"45":1},"2":{"41":1,"63":1}}],["lang",{"2":{"38":1,"70":1}}],["latest",{"0":{"95":1},"2":{"24":3,"26":1,"27":1,"38":15,"66":4,"69":4,"70":3,"95":1,"107":1}}],["later",{"2":{"15":1}}],["legacy",{"0":{"42":1,"100":1,"101":1},"2":{"28":1,"100":1,"101":1}}],["ln",{"2":{"19":4}}],["lt",{"2":{"4":2,"9":1,"40":1,"45":1,"53":1,"63":1,"71":1,"94":3,"96":3,"107":1}}],["license",{"2":{"83":1}}],["lib",{"2":{"19":6,"56":3,"105":8}}],["libexec",{"2":{"19":10,"56":4}}],["link",{"2":{"94":2,"105":1}}],["links",{"2":{"94":1}}],["linux",{"2":{"15":4,"22":1,"35":1,"78":1,"79":1,"107":1,"109":1}}],["lint",{"2":{"2":1}}],["listed",{"2":{"38":1,"76":1}}],["list",{"0":{"90":1,"96":1,"100":1},"2":{"2":1,"15":1,"24":2,"38":9,"45":1,"59":4,"60":1,"63":1,"67":4,"68":4,"87":1,"88":1,"89":1,"90":1,"92":1,"95":3,"110":2}}],["luizm",{"2":{"1":2}}],["和更新后的",{"2":{"103":1}}],["和源",{"2":{"102":1}}],["和补全功能的行",{"2":{"56":6}}],["和环境变量",{"2":{"39":1}}],["和",{"2":{"2":1,"5":1,"28":1,"33":1,"52":1,"54":1,"74":1,"94":1,"96":1,"107":1}}],["bug",{"2":{"52":1}}],["build",{"2":{"4":1,"109":1}}],["by",{"2":{"38":1,"72":3}}],["branch",{"2":{"17":1,"38":3}}],["brazilian",{"2":{"11":1}}],["brew",{"2":{"15":1,"18":1,"19":12,"22":1,"55":2,"56":7}}],["breaking",{"2":{"4":1}}],["br",{"2":{"11":6}}],["before",{"2":{"109":1}}],["begins",{"2":{"38":1}}],["being",{"2":{"38":2}}],["be",{"2":{"3":2,"15":1}}],["bin",{"0":{"90":1,"91":1,"92":1,"94":1,"95":1,"96":2,"97":1,"98":1,"99":1,"100":1,"101":1,"102":1,"103":1,"104":1},"2":{"2":1,"74":1,"88":3,"89":5,"91":1,"92":5,"94":5,"96":2,"98":4,"110":1}}],["baz`",{"2":{"105":1}}],["baz",{"2":{"105":1}}],["bar`",{"2":{"105":1}}],["bar",{"2":{"105":1}}],["bat",{"2":{"105":6}}],["bats",{"0":{"3":1},"2":{"1":3,"2":3,"3":8}}],["bash`",{"2":{"105":3}}],["bashasdf",{"2":{"62":1}}],["bashrc",{"2":{"19":6,"56":3}}],["bash",{"2":{"1":3,"2":3,"19":19,"56":14,"81":1,"105":9,"106":1}}],["并确保它可以在",{"2":{"107":1}}],["并执行设置工具环境所需的任何操作",{"2":{"87":1}}],["并不总是被设置",{"2":{"94":1}}],["并不意味着这是这个特定工具的最佳实践方案",{"2":{"37":1}}],["并不打算成为一个系统包管理器",{"2":{"37":1}}],["并可通过简单的插件接口扩展到所有工具和运行环境",{"2":{"30":1}}],["并加快错误修复的审查速度",{"2":{"2":1}}],["并临时将目录的",{"2":{"2":1}}],["并且重新编译",{"2":{"55":1}}],["并且它不是一个包管理器",{"2":{"36":1}}],["并且",{"2":{"1":1,"7":1,"110":1}}],["开发",{"0":{"2":1,"8":1}}],["支持下载二进制文件的插件将会下载二进制文件",{"2":{"40":1}}],["支持从",{"2":{"28":1}}],["支持从其他版本管理器的现有版本文件中迁移过来",{"2":{"28":1}}],["支持",{"0":{"78":1,"79":1},"2":{"1":1,"42":1,"79":1}}],["兼容脚本",{"2":{"1":1}}],["public",{"2":{"110":1}}],["pull",{"2":{"4":1}}],["pkgbuild",{"2":{"55":1}}],["python",{"2":{"26":1,"40":4,"71":1}}],["ps1",{"2":{"19":8}}],["p",{"2":{"19":4}}],["post",{"0":{"102":1,"103":1},"2":{"22":1,"102":2,"103":3,"104":2}}],["posix",{"2":{"1":1,"19":3}}],["powershell",{"2":{"19":7}}],["portuguese",{"2":{"11":1}}],["pt",{"2":{"11":6}}],["prev",{"2":{"103":1}}],["pre",{"0":{"104":1},"2":{"102":2,"103":2,"104":2}}],["prefix",{"2":{"19":12,"56":6}}],["preferred",{"2":{"18":1}}],["projects",{"0":{"76":1},"2":{"76":2}}],["project",{"2":{"72":1,"76":1}}],["provide",{"2":{"38":1}}],["provided",{"2":{"38":2}}],["profile",{"2":{"19":14,"56":3,"81":1}}],["primarily",{"2":{"15":1}}],["print",{"2":{"38":2}}],["printing",{"2":{"3":1}}],["printed",{"2":{"3":2}}],["printf",{"2":{"3":2}}],["pr",{"2":{"9":3}}],["parse",{"0":{"101":1},"2":{"101":1}}],["particular",{"2":{"38":1}}],["path>",{"2":{"98":2}}],["paths",{"0":{"96":1},"2":{"92":1}}],["path",{"0":{"98":1},"2":{"19":8,"38":2,"40":1,"74":1,"89":3,"91":3,"92":6,"96":3,"98":2,"102":1,"103":1,"104":1,"110":1}}],["patch",{"2":{"4":1}}],["pacman",{"2":{"15":2,"18":1,"19":7,"47":1,"55":1,"56":4}}],["packages",{"2":{"38":3}}],["package",{"2":{"7":1,"8":1,"15":2,"38":15}}],["perf",{"2":{"4":1}}],["please",{"2":{"4":1}}],["plugins",{"2":{"12":1,"38":6,"76":1,"98":1,"105":5,"111":1}}],["plugin",{"0":{"45":1,"102":1,"103":1,"104":1},"2":{"1":3,"7":1,"12":1,"23":1,"38":12,"41":2,"45":2,"58":4,"59":4,"60":1,"61":3,"62":2,"63":3,"74":3,"98":1,"102":8,"103":9,"104":7,"107":7,"108":2,"109":3,"111":5}}],["自动提供",{"2":{"108":1}}],["自动化测试系统",{"2":{"1":1}}],["自定义垫片模板",{"0":{"106":1}}],["自身来管理它",{"2":{"1":1}}],["或只是",{"2":{"94":1}}],["或",{"2":{"1":1,"89":1}}],["或许",{"2":{"1":1}}],["或者可以创建",{"2":{"105":1}}],["或者以相反的顺序排列",{"2":{"90":1}}],["或者希望在进入项目目录时自动设置环境变量",{"2":{"75":1}}],["或者通过插件存储库中的缩写添加插件",{"2":{"58":1}}],["或者不存在",{"2":{"25":1}}],["或者",{"2":{"19":3,"29":1,"35":1,"40":2,"45":1,"46":1,"47":1,"56":1,"63":1,"71":1,"74":1,"81":1,"87":1,"89":1,"107":1}}],["或者执行以下命令",{"2":{"19":2}}],["或者更新的版本",{"2":{"19":2}}],["或者运行生产应用",{"2":{"5":1}}],["或者直接克隆",{"2":{"1":1,"7":1}}],["或者使用你习惯的",{"2":{"55":1}}],["或者使用",{"2":{"1":1,"7":1}}],["travis",{"2":{"109":1,"110":1}}],["travisci",{"0":{"109":1}}],["truffleruby",{"2":{"95":1}}],["trim",{"2":{"19":2}}],["title",{"2":{"94":1}}],["timgluz",{"2":{"1":1}}],["tac",{"2":{"90":1}}],["tap",{"2":{"3":1}}],["txtlegacy",{"2":{"41":1}}],["txtmanage",{"2":{"38":1}}],["those",{"2":{"76":1}}],["that",{"2":{"38":2}}],["then",{"2":{"110":1}}],["their",{"2":{"76":1}}],["they",{"2":{"38":1,"76":1}}],["these",{"2":{"15":1,"76":1}}],["themeconfig",{"2":{"11":1}}],["the",{"2":{"3":1,"4":1,"18":1,"38":28,"76":1}}],["type",{"2":{"4":1,"89":2,"94":1}}],["types",{"2":{"4":1}}],["type>",{"2":{"4":1}}],["term",{"2":{"76":1}}],["terminal",{"2":{"3":1}}],["tests",{"2":{"3":3}}],["test",{"2":{"2":2,"3":3,"4":1,"70":1,"107":4,"108":2,"109":3}}],["token",{"2":{"108":2,"110":5}}],["to",{"2":{"3":1,"15":1,"19":1,"38":8,"76":2}}],["tools",{"2":{"15":1,"76":1,"96":2}}],["tool",{"0":{"40":1},"2":{"1":1,"7":1,"14":1,"25":1,"26":2,"27":2,"30":1,"31":1,"38":4,"39":1,"40":9,"42":1,"46":3,"56":14,"70":5,"72":3,"74":1,"107":1,"108":1}}],["t",{"2":{"3":2}}],["afaik",{"2":{"106":1}}],["an",{"2":{"38":2}}],["and",{"2":{"19":1,"38":9}}],["at",{"2":{"38":1}}],["as",{"2":{"38":1,"76":1}}],["asdfrc",{"0":{"41":1},"1":{"42":1,"43":1,"44":1,"45":1},"2":{"28":1,"39":1,"41":1,"46":1,"56":14,"63":1,"100":1}}],["asdf~",{"2":{"19":6,"56":6}}],["asdf",{"0":{"0":1,"16":1,"19":1,"37":1,"75":1,"105":1},"1":{"1":1,"2":1,"3":1,"4":1,"5":1,"17":1,"18":1},"2":{"0":1,"1":14,"2":1,"4":1,"5":3,"7":9,"8":1,"9":1,"12":7,"13":1,"14":3,"15":1,"17":3,"18":3,"19":110,"20":2,"21":1,"22":1,"23":2,"24":4,"25":3,"26":2,"28":3,"29":5,"30":2,"31":2,"33":2,"34":3,"35":1,"36":2,"37":3,"38":43,"39":1,"40":6,"41":1,"43":1,"44":1,"45":3,"46":14,"47":3,"48":1,"52":1,"53":1,"54":3,"55":6,"56":118,"57":1,"58":3,"59":5,"61":1,"62":1,"63":3,"65":1,"66":2,"67":2,"68":2,"69":2,"70":8,"71":2,"72":3,"73":1,"74":12,"75":2,"76":7,"77":1,"78":1,"80":4,"81":3,"82":1,"89":7,"91":5,"92":9,"94":6,"95":2,"96":2,"98":2,"101":2,"102":7,"103":8,"104":6,"105":11,"106":2,"107":6,"108":3,"109":7,"111":5}}],["always",{"0":{"44":1},"2":{"41":1}}],["all",{"0":{"90":1},"2":{"24":2,"38":9,"45":1,"60":1,"61":1,"63":1,"68":4,"87":1,"88":1,"89":1,"90":1,"95":3,"110":2}}],["alpine",{"2":{"5":1}}],["api",{"0":{"110":1},"2":{"30":1,"57":1,"108":1,"110":4}}],["append",{"2":{"19":4}}],["apt",{"2":{"15":1,"22":1,"94":1}}],["aptitude",{"2":{"15":1}}],["are",{"2":{"38":1,"76":2}}],["args",{"2":{"38":1,"50":1}}],["arg",{"2":{"19":6,"56":6}}],["archlinux",{"2":{"18":1}}],["authorization",{"2":{"110":1}}],["autoremove",{"2":{"56":1}}],["auto",{"2":{"41":1}}],["autoload",{"2":{"19":1,"56":1}}],["automatically",{"2":{"15":1}}],["aur",{"2":{"18":2,"19":1,"46":1,"55":1}}],["a",{"2":{"4":1,"15":1,"38":15,"40":1,"76":2}}],["amannn",{"2":{"4":1}}],["amp",{"0":{"6":1},"1":{"7":1,"8":1,"9":1,"10":1,"11":1},"2":{"3":1,"6":1,"15":1,"18":4,"19":23,"56":14}}],["actions",{"0":{"13":1},"2":{"13":1,"79":2,"108":2}}],["action",{"0":{"108":1},"2":{"4":2,"108":1}}],["add",{"0":{"102":1},"2":{"1":3,"7":1,"23":1,"38":3,"45":1,"58":4,"63":1,"102":4,"111":2}}],["veggies",{"2":{"96":2}}],["version=1",{"2":{"70":1}}],["version`",{"2":{"38":1}}],["version>",{"2":{"38":13,"53":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":8,"73":1,"107":1}}],["version",{"0":{"42":1},"2":{"28":3,"38":23,"41":1,"42":1,"53":1,"70":2,"89":3,"94":1,"100":2,"107":4,"108":1,"109":2}}],["versions`",{"2":{"54":1}}],["versions",{"0":{"40":1,"54":1},"2":{"1":1,"7":1,"14":1,"25":1,"26":2,"27":2,"30":1,"31":1,"38":10,"39":1,"40":9,"42":2,"46":3,"53":1,"54":3,"56":14,"70":4,"72":3,"74":1}}],["v",{"2":{"90":1}}],["vic",{"2":{"58":1,"84":1}}],["v1",{"2":{"40":1,"108":1}}],["var",{"2":{"19":3,"56":3}}],["v0",{"2":{"17":1}}],["v2",{"2":{"8":1}}],["vuepress",{"0":{"10":1},"2":{"8":2,"10":4,"11":3}}],["v8",{"2":{"7":1}}],["vm",{"2":{"1":1,"7":2,"17":1,"18":2,"19":9,"23":1,"38":2,"46":1,"56":7,"59":1,"94":1,"107":1,"108":2,"109":1,"111":1}}],["核心在",{"2":{"31":1}}],["核心的安装",{"2":{"20":1}}],["核心安装完成",{"0":{"20":1}}],["核心",{"0":{"48":1},"1":{"49":1,"50":1,"51":1,"52":1,"53":1,"54":1,"55":1,"56":1},"2":{"14":1,"29":1,"48":1}}],["核心用于查找流行的",{"2":{"12":1}}],["核心团队已经开发了一些与他们日常工作相关的插件",{"2":{"12":1}}],["核心开发所需的工具都列举在这个存储库的",{"2":{"1":1}}],["核心贡献指南",{"2":{"0":1,"9":1}}],["c",{"2":{"109":1}}],["cmd=",{"2":{"110":2}}],["cmd",{"2":{"105":1}}],["candidates",{"0":{"43":1},"2":{"41":1}}],["catalina",{"2":{"19":2,"56":1}}],["currently",{"2":{"38":1}}],["current",{"2":{"25":1,"38":7,"72":4,"74":1}}],["curl",{"2":{"15":7,"22":1,"110":1}}],["cd",{"2":{"18":1}}],["check",{"0":{"45":1},"2":{"41":1,"63":1}}],["chrome",{"2":{"7":1}}],["chore",{"2":{"4":1}}],["change",{"2":{"4":2}}],["ci",{"2":{"4":1,"107":2,"109":1,"110":1}}],["collaborative",{"2":{"76":1}}],["cool",{"2":{"72":1}}],["container",{"2":{"76":2}}],["concurrency",{"2":{"41":1,"89":1}}],["configuration",{"2":{"15":1}}],["config",{"2":{"10":1,"11":1,"19":38,"46":1,"56":13,"81":1,"94":1}}],["codespaces",{"2":{"76":1}}],["code",{"2":{"8":1,"76":1}}],["coreutils",{"2":{"15":2}}],["core",{"2":{"1":1,"2":1,"3":2,"19":3,"76":2}}],["compinit",{"2":{"19":7,"56":2}}],["completer~",{"2":{"19":3,"56":3}}],["completer",{"2":{"19":3,"56":3}}],["completion",{"2":{"19":6,"56":5}}],["completions",{"2":{"19":8,"56":4}}],["commit",{"2":{"38":2}}],["command>",{"2":{"38":4,"50":1,"51":1,"54":1,"98":1}}],["command",{"2":{"15":1,"18":1,"38":3,"105":10,"107":1,"108":1}}],["commands",{"2":{"2":1,"15":1,"105":7}}],["community",{"0":{"18":1,"76":1},"2":{"12":1,"76":3}}],["com",{"2":{"1":5,"7":3,"17":1,"23":1,"38":2,"58":1,"59":2,"107":1,"109":1,"111":1}}],["clone",{"2":{"1":2,"7":2,"17":1,"18":1,"109":1}}],["的项目提供了使用",{"2":{"108":1}}],["的文件在插件中",{"2":{"106":1}}],["的可执行程序",{"2":{"106":1}}],["的所有可用功能",{"2":{"105":1}}],["的所有类型包含",{"2":{"4":1}}],["的最新稳定版本",{"2":{"95":1}}],["的常规实现",{"2":{"95":1}}],["的值",{"2":{"94":1}}],["的下方",{"2":{"81":1}}],["的生效不在你的",{"2":{"81":1}}],["的官方支持",{"2":{"78":1}}],["的某些方面可能无法正常工作",{"2":{"78":1}}],["的目录是已安装程序在环境中可用的方式",{"2":{"74":1}}],["的系统版本而非",{"2":{"71":1}}],["的环境变量",{"2":{"70":2}}],["的行",{"2":{"56":5}}],["的指南",{"2":{"56":2}}],["的指引",{"2":{"19":1}}],["的内置命令用于更新",{"2":{"55":1}}],["的内部配置",{"2":{"47":1}}],["的数字",{"2":{"45":1}}],["的特性到",{"2":{"34":1}}],["的区别之处在于它的插件系统",{"2":{"33":1}}],["的快速上手",{"2":{"29":1}}],["的补全功能可以交给",{"2":{"19":1}}],["的说明完成配置",{"2":{"19":2}}],["的说明",{"2":{"19":2}}],["的格式",{"2":{"9":1}}],["的自动发布工具来自动碰撞",{"2":{"4":1}}],["的输出",{"2":{"3":1}}],["的情况下尝试应用你的更改",{"2":{"2":1}}],["的",{"2":{"1":2,"3":1,"7":2,"28":1,"42":2,"53":1,"61":2,"70":2,"89":1,"110":1}}],["克隆你",{"2":{"1":1,"7":1}}],["克隆默认分支",{"2":{"1":1,"7":1}}],["上运行",{"2":{"107":1}}],["上运行测试套件",{"2":{"79":1}}],["上测试拉取请求非常有用",{"2":{"107":1}}],["上的",{"2":{"85":1}}],["上提供主机运行器支持时",{"2":{"79":1}}],["上面",{"2":{"46":1}}],["上缺失包的管理器",{"2":{"35":1}}],["上",{"2":{"1":1,"7":1,"94":1}}],["在你的代码中公布你的",{"2":{"110":1}}],["在从输出中排除了几种类型的版本",{"2":{"95":1}}],["在从当前工作目录一直到",{"2":{"25":1}}],["在这个例子中",{"2":{"80":1}}],["在这种情况下",{"2":{"56":1,"90":1}}],["在报告",{"2":{"52":1}}],["在成功安装后保留源代码或二进制文件",{"2":{"44":1}}],["在成功安装后删除源代码或二进制文件",{"2":{"44":1}}],["在包含",{"2":{"40":2}}],["在框架生效位置的下方",{"2":{"19":1}}],["在选择下拉菜单中的标题以及导航栏",{"2":{"11":1}}],["在提交之前格式化代码",{"2":{"8":1}}],["在本地做好格式化",{"2":{"2":1}}],["在本地机器的开发过程中不使用",{"2":{"1":1}}],["在",{"2":{"1":1,"7":1,"19":12,"56":14,"94":1,"110":1}}]],"serializationVersion":2}';export{t as default}; diff --git a/assets/chunks/VPLocalSearchBox.Blc1mzWh.js b/assets/chunks/VPLocalSearchBox.Blc1mzWh.js new file mode 100644 index 00000000..64ad409d --- /dev/null +++ b/assets/chunks/VPLocalSearchBox.Blc1mzWh.js @@ -0,0 +1,7 @@ +var Ft=Object.defineProperty;var Rt=(a,e,t)=>e in a?Ft(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var Ae=(a,e,t)=>Rt(a,typeof e!="symbol"?e+"":e,t);import{V as he,p as ie,h as ge,ah as tt,ai as Ct,aj as Mt,q as Be,ak as At,d as Lt,D as _e,al as st,am as Dt,an as Pt,s as zt,ao as jt,v as Le,P as fe,O as Se,ap as Vt,aq as $t,W as Bt,R as Wt,$ as Kt,o as H,b as Jt,j as _,a0 as Ut,k as L,ar as qt,as as Gt,at as Ht,c as Z,n as nt,e as Ee,C as it,F as rt,a as pe,t as ve,au as Qt,av as at,aw as Yt,a6 as Zt,ac as Xt,ax as es,_ as ts}from"./framework.BQmytedh.js";import{u as ss,c as ns}from"./theme.Cb3KoOiM.js";const is={root:()=>he(()=>import("./@localSearchIndexroot.Cvu0aAJF.js"),[]),"ja-jp":()=>he(()=>import("./@localSearchIndexja-jp.3a-2EviV.js"),[]),"ko-kr":()=>he(()=>import("./@localSearchIndexko-kr.B6cKja34.js"),[]),"pt-br":()=>he(()=>import("./@localSearchIndexpt-br.DbNYDzTe.js"),[]),"zh-hans":()=>he(()=>import("./@localSearchIndexzh-hans.O1gOT0Tl.js"),[])};/*! +* tabbable 6.2.0 +* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE +*/var gt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Oe=gt.join(","),bt=typeof Element>"u",ae=bt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Fe=!bt&&Element.prototype.getRootNode?function(a){var e;return a==null||(e=a.getRootNode)===null||e===void 0?void 0:e.call(a)}:function(a){return a==null?void 0:a.ownerDocument},Re=function a(e,t){var s;t===void 0&&(t=!0);var n=e==null||(s=e.getAttribute)===null||s===void 0?void 0:s.call(e,"inert"),r=n===""||n==="true",i=r||t&&e&&a(e.parentNode);return i},rs=function(e){var t,s=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return s===""||s==="true"},yt=function(e,t,s){if(Re(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Oe));return t&&ae.call(e,Oe)&&n.unshift(e),n=n.filter(s),n},wt=function a(e,t,s){for(var n=[],r=Array.from(e);r.length;){var i=r.shift();if(!Re(i,!1))if(i.tagName==="SLOT"){var o=i.assignedElements(),l=o.length?o:i.children,c=a(l,!0,s);s.flatten?n.push.apply(n,c):n.push({scopeParent:i,candidates:c})}else{var h=ae.call(i,Oe);h&&s.filter(i)&&(t||!e.includes(i))&&n.push(i);var m=i.shadowRoot||typeof s.getShadowRoot=="function"&&s.getShadowRoot(i),f=!Re(m,!1)&&(!s.shadowRootFilter||s.shadowRootFilter(i));if(m&&f){var b=a(m===!0?i.children:m.children,!0,s);s.flatten?n.push.apply(n,b):n.push({scopeParent:i,candidates:b})}else r.unshift.apply(r,i.children)}}return n},xt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},re=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||rs(e))&&!xt(e)?0:e.tabIndex},as=function(e,t){var s=re(e);return s<0&&t&&!xt(e)?0:s},os=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},_t=function(e){return e.tagName==="INPUT"},ls=function(e){return _t(e)&&e.type==="hidden"},cs=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(s){return s.tagName==="SUMMARY"});return t},us=function(e,t){for(var s=0;ssummary:first-of-type"),i=r?e.parentElement:e;if(ae.call(i,"details:not([open]) *"))return!0;if(!s||s==="full"||s==="legacy-full"){if(typeof n=="function"){for(var o=e;e;){var l=e.parentElement,c=Fe(e);if(l&&!l.shadowRoot&&n(l)===!0)return ot(e);e.assignedSlot?e=e.assignedSlot:!l&&c!==e.ownerDocument?e=c.host:e=l}e=o}if(ps(e))return!e.getClientRects().length;if(s!=="legacy-full")return!0}else if(s==="non-zero-area")return ot(e);return!1},ms=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var s=0;s=0)},bs=function a(e){var t=[],s=[];return e.forEach(function(n,r){var i=!!n.scopeParent,o=i?n.scopeParent:n,l=as(o,i),c=i?a(n.candidates):o;l===0?i?t.push.apply(t,c):t.push(o):s.push({documentOrder:r,tabIndex:l,item:n,isScope:i,content:c})}),s.sort(os).reduce(function(n,r){return r.isScope?n.push.apply(n,r.content):n.push(r.content),n},[]).concat(t)},ys=function(e,t){t=t||{};var s;return t.getShadowRoot?s=wt([e],t.includeContainer,{filter:We.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:gs}):s=yt(e,t.includeContainer,We.bind(null,t)),bs(s)},ws=function(e,t){t=t||{};var s;return t.getShadowRoot?s=wt([e],t.includeContainer,{filter:Ce.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):s=yt(e,t.includeContainer,Ce.bind(null,t)),s},oe=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ae.call(e,Oe)===!1?!1:We(t,e)},xs=gt.concat("iframe").join(","),De=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return ae.call(e,xs)===!1?!1:Ce(t,e)};/*! +* focus-trap 7.6.0 +* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE +*/function _s(a,e,t){return(e=Es(e))in a?Object.defineProperty(a,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):a[e]=t,a}function lt(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(a);e&&(s=s.filter(function(n){return Object.getOwnPropertyDescriptor(a,n).enumerable})),t.push.apply(t,s)}return t}function ct(a){for(var e=1;e0){var s=e[e.length-1];s!==t&&s.pause()}var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var s=e.indexOf(t);s!==-1&&e.splice(s,1),e.length>0&&e[e.length-1].unpause()}},Ts=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Is=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},be=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},ks=function(e){return be(e)&&!e.shiftKey},Ns=function(e){return be(e)&&e.shiftKey},dt=function(e){return setTimeout(e,0)},ht=function(e,t){var s=-1;return e.every(function(n,r){return t(n)?(s=r,!1):!0}),s},me=function(e){for(var t=arguments.length,s=new Array(t>1?t-1:0),n=1;n1?g-1:0),T=1;T=0)d=s.activeElement;else{var u=i.tabbableGroups[0],g=u&&u.firstTabbableNode;d=g||h("fallbackFocus")}if(!d)throw new Error("Your focus-trap needs to have at least one focusable element");return d},f=function(){if(i.containerGroups=i.containers.map(function(d){var u=ys(d,r.tabbableOptions),g=ws(d,r.tabbableOptions),E=u.length>0?u[0]:void 0,T=u.length>0?u[u.length-1]:void 0,N=g.find(function(v){return oe(v)}),F=g.slice().reverse().find(function(v){return oe(v)}),A=!!u.find(function(v){return re(v)>0});return{container:d,tabbableNodes:u,focusableNodes:g,posTabIndexesFound:A,firstTabbableNode:E,lastTabbableNode:T,firstDomTabbableNode:N,lastDomTabbableNode:F,nextTabbableNode:function(p){var S=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,O=u.indexOf(p);return O<0?S?g.slice(g.indexOf(p)+1).find(function(P){return oe(P)}):g.slice(0,g.indexOf(p)).reverse().find(function(P){return oe(P)}):u[O+(S?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(d){return d.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!h("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(d){return d.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},b=function(d){var u=d.activeElement;if(u)return u.shadowRoot&&u.shadowRoot.activeElement!==null?b(u.shadowRoot):u},y=function(d){if(d!==!1&&d!==b(document)){if(!d||!d.focus){y(m());return}d.focus({preventScroll:!!r.preventScroll}),i.mostRecentlyFocusedNode=d,Ts(d)&&d.select()}},x=function(d){var u=h("setReturnFocus",d);return u||(u===!1?!1:d)},w=function(d){var u=d.target,g=d.event,E=d.isBackward,T=E===void 0?!1:E;u=u||Te(g),f();var N=null;if(i.tabbableGroups.length>0){var F=c(u,g),A=F>=0?i.containerGroups[F]:void 0;if(F<0)T?N=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:N=i.tabbableGroups[0].firstTabbableNode;else if(T){var v=ht(i.tabbableGroups,function(j){var I=j.firstTabbableNode;return u===I});if(v<0&&(A.container===u||De(u,r.tabbableOptions)&&!oe(u,r.tabbableOptions)&&!A.nextTabbableNode(u,!1))&&(v=F),v>=0){var p=v===0?i.tabbableGroups.length-1:v-1,S=i.tabbableGroups[p];N=re(u)>=0?S.lastTabbableNode:S.lastDomTabbableNode}else be(g)||(N=A.nextTabbableNode(u,!1))}else{var O=ht(i.tabbableGroups,function(j){var I=j.lastTabbableNode;return u===I});if(O<0&&(A.container===u||De(u,r.tabbableOptions)&&!oe(u,r.tabbableOptions)&&!A.nextTabbableNode(u))&&(O=F),O>=0){var P=O===i.tabbableGroups.length-1?0:O+1,z=i.tabbableGroups[P];N=re(u)>=0?z.firstTabbableNode:z.firstDomTabbableNode}else be(g)||(N=A.nextTabbableNode(u))}}else N=h("fallbackFocus");return N},R=function(d){var u=Te(d);if(!(c(u,d)>=0)){if(me(r.clickOutsideDeactivates,d)){o.deactivate({returnFocus:r.returnFocusOnDeactivate});return}me(r.allowOutsideClick,d)||d.preventDefault()}},C=function(d){var u=Te(d),g=c(u,d)>=0;if(g||u instanceof Document)g&&(i.mostRecentlyFocusedNode=u);else{d.stopImmediatePropagation();var E,T=!0;if(i.mostRecentlyFocusedNode)if(re(i.mostRecentlyFocusedNode)>0){var N=c(i.mostRecentlyFocusedNode),F=i.containerGroups[N].tabbableNodes;if(F.length>0){var A=F.findIndex(function(v){return v===i.mostRecentlyFocusedNode});A>=0&&(r.isKeyForward(i.recentNavEvent)?A+1=0&&(E=F[A-1],T=!1))}}else i.containerGroups.some(function(v){return v.tabbableNodes.some(function(p){return re(p)>0})})||(T=!1);else T=!1;T&&(E=w({target:i.mostRecentlyFocusedNode,isBackward:r.isKeyBackward(i.recentNavEvent)})),y(E||i.mostRecentlyFocusedNode||m())}i.recentNavEvent=void 0},J=function(d){var u=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=d;var g=w({event:d,isBackward:u});g&&(be(d)&&d.preventDefault(),y(g))},Q=function(d){(r.isKeyForward(d)||r.isKeyBackward(d))&&J(d,r.isKeyBackward(d))},W=function(d){Is(d)&&me(r.escapeDeactivates,d)!==!1&&(d.preventDefault(),o.deactivate())},V=function(d){var u=Te(d);c(u,d)>=0||me(r.clickOutsideDeactivates,d)||me(r.allowOutsideClick,d)||(d.preventDefault(),d.stopImmediatePropagation())},$=function(){if(i.active)return ut.activateTrap(n,o),i.delayInitialFocusTimer=r.delayInitialFocus?dt(function(){y(m())}):y(m()),s.addEventListener("focusin",C,!0),s.addEventListener("mousedown",R,{capture:!0,passive:!1}),s.addEventListener("touchstart",R,{capture:!0,passive:!1}),s.addEventListener("click",V,{capture:!0,passive:!1}),s.addEventListener("keydown",Q,{capture:!0,passive:!1}),s.addEventListener("keydown",W),o},ye=function(){if(i.active)return s.removeEventListener("focusin",C,!0),s.removeEventListener("mousedown",R,!0),s.removeEventListener("touchstart",R,!0),s.removeEventListener("click",V,!0),s.removeEventListener("keydown",Q,!0),s.removeEventListener("keydown",W),o},M=function(d){var u=d.some(function(g){var E=Array.from(g.removedNodes);return E.some(function(T){return T===i.mostRecentlyFocusedNode})});u&&y(m())},U=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(M):void 0,q=function(){U&&(U.disconnect(),i.active&&!i.paused&&i.containers.map(function(d){U.observe(d,{subtree:!0,childList:!0})}))};return o={get active(){return i.active},get paused(){return i.paused},activate:function(d){if(i.active)return this;var u=l(d,"onActivate"),g=l(d,"onPostActivate"),E=l(d,"checkCanFocusTrap");E||f(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=s.activeElement,u==null||u();var T=function(){E&&f(),$(),q(),g==null||g()};return E?(E(i.containers.concat()).then(T,T),this):(T(),this)},deactivate:function(d){if(!i.active)return this;var u=ct({onDeactivate:r.onDeactivate,onPostDeactivate:r.onPostDeactivate,checkCanReturnFocus:r.checkCanReturnFocus},d);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,ye(),i.active=!1,i.paused=!1,q(),ut.deactivateTrap(n,o);var g=l(u,"onDeactivate"),E=l(u,"onPostDeactivate"),T=l(u,"checkCanReturnFocus"),N=l(u,"returnFocus","returnFocusOnDeactivate");g==null||g();var F=function(){dt(function(){N&&y(x(i.nodeFocusedBeforeActivation)),E==null||E()})};return N&&T?(T(x(i.nodeFocusedBeforeActivation)).then(F,F),this):(F(),this)},pause:function(d){if(i.paused||!i.active)return this;var u=l(d,"onPause"),g=l(d,"onPostPause");return i.paused=!0,u==null||u(),ye(),q(),g==null||g(),this},unpause:function(d){if(!i.paused||!i.active)return this;var u=l(d,"onUnpause"),g=l(d,"onPostUnpause");return i.paused=!1,u==null||u(),f(),$(),q(),g==null||g(),this},updateContainerElements:function(d){var u=[].concat(d).filter(Boolean);return i.containers=u.map(function(g){return typeof g=="string"?s.querySelector(g):g}),i.active&&f(),q(),this}},o.updateContainerElements(e),o};function Rs(a,e={}){let t;const{immediate:s,...n}=e,r=ie(!1),i=ie(!1),o=f=>t&&t.activate(f),l=f=>t&&t.deactivate(f),c=()=>{t&&(t.pause(),i.value=!0)},h=()=>{t&&(t.unpause(),i.value=!1)},m=ge(()=>{const f=tt(a);return(Array.isArray(f)?f:[f]).map(b=>{const y=tt(b);return typeof y=="string"?y:Ct(y)}).filter(Mt)});return Be(m,f=>{f.length&&(t=Fs(f,{...n,onActivate(){r.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){r.value=!1,e.onDeactivate&&e.onDeactivate()}}),s&&o())},{flush:"post"}),At(()=>l()),{hasFocus:r,isPaused:i,activate:o,deactivate:l,pause:c,unpause:h}}class ce{constructor(e,t=!0,s=[],n=5e3){this.ctx=e,this.iframes=t,this.exclude=s,this.iframesTimeout=n}static matches(e,t){const s=typeof t=="string"?[t]:t,n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(n){let r=!1;return s.every(i=>n.call(e,i)?(r=!0,!1):!0),r}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(s=>{const n=t.filter(r=>r.contains(s)).length>0;t.indexOf(s)===-1&&!n&&t.push(s)}),t}getIframeContents(e,t,s=()=>{}){let n;try{const r=e.contentWindow;if(n=r.document,!r||!n)throw new Error("iframe inaccessible")}catch{s()}n&&t(n)}isIframeBlank(e){const t="about:blank",s=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&s!==t&&s}observeIframeLoad(e,t,s){let n=!1,r=null;const i=()=>{if(!n){n=!0,clearTimeout(r);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,s))}catch{s()}}};e.addEventListener("load",i),r=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,s){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,s):this.getIframeContents(e,t,s):this.observeIframeLoad(e,t,s)}catch{s()}}waitForIframes(e,t){let s=0;this.forEachIframe(e,()=>!0,n=>{s++,this.waitForIframes(n.querySelector("html"),()=>{--s||t()})},n=>{n||t()})}forEachIframe(e,t,s,n=()=>{}){let r=e.querySelectorAll("iframe"),i=r.length,o=0;r=Array.prototype.slice.call(r);const l=()=>{--i<=0&&n(o)};i||l(),r.forEach(c=>{ce.matches(c,this.exclude)?l():this.onIframeReady(c,h=>{t(c)&&(o++,s(h)),l()},l)})}createIterator(e,t,s){return document.createNodeIterator(e,t,s,!1)}createInstanceOnIframe(e){return new ce(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,s){const n=e.compareDocumentPosition(s),r=Node.DOCUMENT_POSITION_PRECEDING;if(n&r)if(t!==null){const i=t.compareDocumentPosition(s),o=Node.DOCUMENT_POSITION_FOLLOWING;if(i&o)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let s;return t===null?s=e.nextNode():s=e.nextNode()&&e.nextNode(),{prevNode:t,node:s}}checkIframeFilter(e,t,s,n){let r=!1,i=!1;return n.forEach((o,l)=>{o.val===s&&(r=l,i=o.handled)}),this.compareNodeIframe(e,t,s)?(r===!1&&!i?n.push({val:s,handled:!0}):r!==!1&&!i&&(n[r].handled=!0),!0):(r===!1&&n.push({val:s,handled:!1}),!1)}handleOpenIframes(e,t,s,n){e.forEach(r=>{r.handled||this.getIframeContents(r.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,s,n)})})}iterateThroughNodes(e,t,s,n,r){const i=this.createIterator(t,e,n);let o=[],l=[],c,h,m=()=>({prevNode:h,node:c}=this.getIteratorNode(i),c);for(;m();)this.iframes&&this.forEachIframe(t,f=>this.checkIframeFilter(c,h,f,o),f=>{this.createInstanceOnIframe(f).forEachNode(e,b=>l.push(b),n)}),l.push(c);l.forEach(f=>{s(f)}),this.iframes&&this.handleOpenIframes(o,e,s,n),r()}forEachNode(e,t,s,n=()=>{}){const r=this.getContexts();let i=r.length;i||n(),r.forEach(o=>{const l=()=>{this.iterateThroughNodes(e,o,t,s,()=>{--i<=0&&n()})};this.iframes?this.waitForIframes(o,l):l()})}}let Cs=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new ce(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const s=this.opt.log;this.opt.debug&&typeof s=="object"&&typeof s[t]=="function"&&s[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,s=this.opt.caseSensitive?"":"i",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let r in t)if(t.hasOwnProperty(r)){const i=t[r],o=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(r):this.escapeStr(r),l=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);o!==""&&l!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(o)}|${this.escapeStr(l)})`,`gm${s}`),n+`(${this.processSynomyms(o)}|${this.processSynomyms(l)})`+n))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,s,n)=>{let r=n.charAt(s+1);return/[(|)\\]/.test(r)||r===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const s=this.opt.ignorePunctuation;return Array.isArray(s)&&s.length&&t.push(this.escapeStr(s.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",s=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let n=[];return e.split("").forEach(r=>{s.every(i=>{if(i.indexOf(r)!==-1){if(n.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),n.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let s=this.opt.accuracy,n=typeof s=="string"?s:s.value,r=typeof s=="string"?[]:s.limiters,i="";switch(r.forEach(o=>{i+=`|${this.escapeStr(o)}`}),n){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(s=>{this.opt.separateWordSearch?s.split(" ").forEach(n=>{n.trim()&&t.indexOf(n)===-1&&t.push(n)}):s.trim()&&t.indexOf(s)===-1&&t.push(s)}),{keywords:t.sort((s,n)=>n.length-s.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let s=0;return e.sort((n,r)=>n.start-r.start).forEach(n=>{let{start:r,end:i,valid:o}=this.callNoMatchOnInvalidRanges(n,s);o&&(n.start=r,n.length=i-r,t.push(n),s=i)}),t}callNoMatchOnInvalidRanges(e,t){let s,n,r=!1;return e&&typeof e.start<"u"?(s=parseInt(e.start,10),n=s+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-s>0?r=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:s,end:n,valid:r}}checkWhitespaceRanges(e,t,s){let n,r=!0,i=s.length,o=t-i,l=parseInt(e.start,10)-o;return l=l>i?i:l,n=l+parseInt(e.length,10),n>i&&(n=i,this.log(`End range automatically set to the max value of ${i}`)),l<0||n-l<0||l>i||n>i?(r=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):s.substring(l,n).replace(/\s+/g,"")===""&&(r=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:l,end:n,valid:r}}getTextNodes(e){let t="",s=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,n=>{s.push({start:t.length,end:(t+=n.textContent).length,node:n})},n=>this.matchesExclude(n.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:s})})}matchesExclude(e){return ce.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,s){const n=this.opt.element?this.opt.element:"mark",r=e.splitText(t),i=r.splitText(s-t);let o=document.createElement(n);return o.setAttribute("data-markjs","true"),this.opt.className&&o.setAttribute("class",this.opt.className),o.textContent=r.textContent,r.parentNode.replaceChild(o,r),i}wrapRangeInMappedTextNode(e,t,s,n,r){e.nodes.every((i,o)=>{const l=e.nodes[o+1];if(typeof l>"u"||l.start>t){if(!n(i.node))return!1;const c=t-i.start,h=(s>i.end?i.end:s)-i.start,m=e.value.substr(0,i.start),f=e.value.substr(h+i.start);if(i.node=this.wrapRangeInTextNode(i.node,c,h),e.value=m+f,e.nodes.forEach((b,y)=>{y>=o&&(e.nodes[y].start>0&&y!==o&&(e.nodes[y].start-=h),e.nodes[y].end-=h)}),s-=h,r(i.node.previousSibling,i.start),s>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,s,n,r){const i=t===0?0:t+1;this.getTextNodes(o=>{o.nodes.forEach(l=>{l=l.node;let c;for(;(c=e.exec(l.textContent))!==null&&c[i]!=="";){if(!s(c[i],l))continue;let h=c.index;if(i!==0)for(let m=1;m{let l;for(;(l=e.exec(o.value))!==null&&l[i]!=="";){let c=l.index;if(i!==0)for(let m=1;ms(l[i],m),(m,f)=>{e.lastIndex=f,n(m)})}r()})}wrapRangeFromIndex(e,t,s,n){this.getTextNodes(r=>{const i=r.value.length;e.forEach((o,l)=>{let{start:c,end:h,valid:m}=this.checkWhitespaceRanges(o,i,r.value);m&&this.wrapRangeInMappedTextNode(r,c,h,f=>t(f,o,r.value.substring(c,h),l),f=>{s(f,o)})}),n()})}unwrapMatches(e){const t=e.parentNode;let s=document.createDocumentFragment();for(;e.firstChild;)s.appendChild(e.removeChild(e.firstChild));t.replaceChild(s,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let s=0,n="wrapMatches";const r=i=>{s++,this.opt.each(i)};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),this[n](e,this.opt.ignoreGroups,(i,o)=>this.opt.filter(o,i,s),r,()=>{s===0&&this.opt.noMatch(e),this.opt.done(s)})}mark(e,t){this.opt=t;let s=0,n="wrapMatches";const{keywords:r,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),o=this.opt.caseSensitive?"":"i",l=c=>{let h=new RegExp(this.createRegExp(c),`gm${o}`),m=0;this.log(`Searching with expression "${h}"`),this[n](h,1,(f,b)=>this.opt.filter(b,c,s,m),f=>{m++,s++,this.opt.each(f)},()=>{m===0&&this.opt.noMatch(c),r[i-1]===c?this.opt.done(s):l(r[r.indexOf(c)+1])})};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),i===0?this.opt.done(s):l(r[0])}markRanges(e,t){this.opt=t;let s=0,n=this.checkRanges(e);n&&n.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(n)),this.wrapRangeFromIndex(n,(r,i,o,l)=>this.opt.filter(r,i,o,l),(r,i)=>{s++,this.opt.each(r,i)},()=>{this.opt.done(s)})):this.opt.done(s)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,s=>{this.unwrapMatches(s)},s=>{const n=ce.matches(s,t),r=this.matchesExclude(s);return!n||r?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function Ms(a){const e=new Cs(a);return this.mark=(t,s)=>(e.mark(t,s),this),this.markRegExp=(t,s)=>(e.markRegExp(t,s),this),this.markRanges=(t,s)=>(e.markRanges(t,s),this),this.unmark=t=>(e.unmark(t),this),this}function Ne(a,e,t,s){function n(r){return r instanceof t?r:new t(function(i){i(r)})}return new(t||(t=Promise))(function(r,i){function o(h){try{c(s.next(h))}catch(m){i(m)}}function l(h){try{c(s.throw(h))}catch(m){i(m)}}function c(h){h.done?r(h.value):n(h.value).then(o,l)}c((s=s.apply(a,[])).next())})}const As="ENTRIES",St="KEYS",Et="VALUES",D="";class Pe{constructor(e,t){const s=e._tree,n=Array.from(s.keys());this.set=e,this._type=t,this._path=n.length>0?[{node:s,keys:n}]:[]}next(){const e=this.dive();return this.backtrack(),e}dive(){if(this._path.length===0)return{done:!0,value:void 0};const{node:e,keys:t}=le(this._path);if(le(t)===D)return{done:!1,value:this.result()};const s=e.get(le(t));return this._path.push({node:s,keys:Array.from(s.keys())}),this.dive()}backtrack(){if(this._path.length===0)return;const e=le(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}key(){return this.set._prefix+this._path.map(({keys:e})=>le(e)).filter(e=>e!==D).join("")}value(){return le(this._path).node.get(D)}result(){switch(this._type){case Et:return this.value();case St:return this.key();default:return[this.key(),this.value()]}}[Symbol.iterator](){return this}}const le=a=>a[a.length-1],Ls=(a,e,t)=>{const s=new Map;if(e===void 0)return s;const n=e.length+1,r=n+t,i=new Uint8Array(r*n).fill(t+1);for(let o=0;o{const l=r*i;e:for(const c of a.keys())if(c===D){const h=n[l-1];h<=t&&s.set(o,[a.get(c),h])}else{let h=r;for(let m=0;mt)continue e}Tt(a.get(c),e,t,s,n,h,i,o+c)}};class X{constructor(e=new Map,t=""){this._size=void 0,this._tree=e,this._prefix=t}atPrefix(e){if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");const[t,s]=Me(this._tree,e.slice(this._prefix.length));if(t===void 0){const[n,r]=qe(s);for(const i of n.keys())if(i!==D&&i.startsWith(r)){const o=new Map;return o.set(i.slice(r.length),n.get(i)),new X(o,e)}}return new X(t,e)}clear(){this._size=void 0,this._tree.clear()}delete(e){return this._size=void 0,Ds(this._tree,e)}entries(){return new Pe(this,As)}forEach(e){for(const[t,s]of this)e(t,s,this)}fuzzyGet(e,t){return Ls(this._tree,e,t)}get(e){const t=Ke(this._tree,e);return t!==void 0?t.get(D):void 0}has(e){const t=Ke(this._tree,e);return t!==void 0&&t.has(D)}keys(){return new Pe(this,St)}set(e,t){if(typeof e!="string")throw new Error("key must be a string");return this._size=void 0,ze(this._tree,e).set(D,t),this}get size(){if(this._size)return this._size;this._size=0;const e=this.entries();for(;!e.next().done;)this._size+=1;return this._size}update(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const s=ze(this._tree,e);return s.set(D,t(s.get(D))),this}fetch(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;const s=ze(this._tree,e);let n=s.get(D);return n===void 0&&s.set(D,n=t()),n}values(){return new Pe(this,Et)}[Symbol.iterator](){return this.entries()}static from(e){const t=new X;for(const[s,n]of e)t.set(s,n);return t}static fromObject(e){return X.from(Object.entries(e))}}const Me=(a,e,t=[])=>{if(e.length===0||a==null)return[a,t];for(const s of a.keys())if(s!==D&&e.startsWith(s))return t.push([a,s]),Me(a.get(s),e.slice(s.length),t);return t.push([a,e]),Me(void 0,"",t)},Ke=(a,e)=>{if(e.length===0||a==null)return a;for(const t of a.keys())if(t!==D&&e.startsWith(t))return Ke(a.get(t),e.slice(t.length))},ze=(a,e)=>{const t=e.length;e:for(let s=0;a&&s{const[t,s]=Me(a,e);if(t!==void 0){if(t.delete(D),t.size===0)It(s);else if(t.size===1){const[n,r]=t.entries().next().value;kt(s,n,r)}}},It=a=>{if(a.length===0)return;const[e,t]=qe(a);if(e.delete(t),e.size===0)It(a.slice(0,-1));else if(e.size===1){const[s,n]=e.entries().next().value;s!==D&&kt(a.slice(0,-1),s,n)}},kt=(a,e,t)=>{if(a.length===0)return;const[s,n]=qe(a);s.set(n+e,t),s.delete(n)},qe=a=>a[a.length-1],Ge="or",Nt="and",Ps="and_not";class ue{constructor(e){if((e==null?void 0:e.fields)==null)throw new Error('MiniSearch: option "fields" must be provided');const t=e.autoVacuum==null||e.autoVacuum===!0?$e:e.autoVacuum;this._options=Object.assign(Object.assign(Object.assign({},Ve),e),{autoVacuum:t,searchOptions:Object.assign(Object.assign({},ft),e.searchOptions||{}),autoSuggestOptions:Object.assign(Object.assign({},Bs),e.autoSuggestOptions||{})}),this._index=new X,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldIds={},this._fieldLength=new Map,this._avgFieldLength=[],this._nextId=0,this._storedFields=new Map,this._dirtCount=0,this._currentVacuum=null,this._enqueuedVacuum=null,this._enqueuedVacuumConditions=Ue,this.addFields(this._options.fields)}add(e){const{extractField:t,tokenize:s,processTerm:n,fields:r,idField:i}=this._options,o=t(e,i);if(o==null)throw new Error(`MiniSearch: document does not have ID field "${i}"`);if(this._idToShortId.has(o))throw new Error(`MiniSearch: duplicate ID ${o}`);const l=this.addDocumentId(o);this.saveStoredFields(l,e);for(const c of r){const h=t(e,c);if(h==null)continue;const m=s(h.toString(),c),f=this._fieldIds[c],b=new Set(m).size;this.addFieldLength(l,f,this._documentCount-1,b);for(const y of m){const x=n(y,c);if(Array.isArray(x))for(const w of x)this.addTerm(f,l,w);else x&&this.addTerm(f,l,x)}}}addAll(e){for(const t of e)this.add(t)}addAllAsync(e,t={}){const{chunkSize:s=10}=t,n={chunk:[],promise:Promise.resolve()},{chunk:r,promise:i}=e.reduce(({chunk:o,promise:l},c,h)=>(o.push(c),(h+1)%s===0?{chunk:[],promise:l.then(()=>new Promise(m=>setTimeout(m,0))).then(()=>this.addAll(o))}:{chunk:o,promise:l}),n);return i.then(()=>this.addAll(r))}remove(e){const{tokenize:t,processTerm:s,extractField:n,fields:r,idField:i}=this._options,o=n(e,i);if(o==null)throw new Error(`MiniSearch: document does not have ID field "${i}"`);const l=this._idToShortId.get(o);if(l==null)throw new Error(`MiniSearch: cannot remove document with ID ${o}: it is not in the index`);for(const c of r){const h=n(e,c);if(h==null)continue;const m=t(h.toString(),c),f=this._fieldIds[c],b=new Set(m).size;this.removeFieldLength(l,f,this._documentCount,b);for(const y of m){const x=s(y,c);if(Array.isArray(x))for(const w of x)this.removeTerm(f,l,w);else x&&this.removeTerm(f,l,x)}}this._storedFields.delete(l),this._documentIds.delete(l),this._idToShortId.delete(o),this._fieldLength.delete(l),this._documentCount-=1}removeAll(e){if(e)for(const t of e)this.remove(t);else{if(arguments.length>0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new X,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}}discard(e){const t=this._idToShortId.get(e);if(t==null)throw new Error(`MiniSearch: cannot discard document with ID ${e}: it is not in the index`);this._idToShortId.delete(e),this._documentIds.delete(t),this._storedFields.delete(t),(this._fieldLength.get(t)||[]).forEach((s,n)=>{this.removeFieldLength(t,n,this._documentCount,s)}),this._fieldLength.delete(t),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()}maybeAutoVacuum(){if(this._options.autoVacuum===!1)return;const{minDirtFactor:e,minDirtCount:t,batchSize:s,batchWait:n}=this._options.autoVacuum;this.conditionalVacuum({batchSize:s,batchWait:n},{minDirtCount:t,minDirtFactor:e})}discardAll(e){const t=this._options.autoVacuum;try{this._options.autoVacuum=!1;for(const s of e)this.discard(s)}finally{this._options.autoVacuum=t}this.maybeAutoVacuum()}replace(e){const{idField:t,extractField:s}=this._options,n=s(e,t);this.discard(n),this.add(e)}vacuum(e={}){return this.conditionalVacuum(e)}conditionalVacuum(e,t){return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(()=>{const s=this._enqueuedVacuumConditions;return this._enqueuedVacuumConditions=Ue,this.performVacuuming(e,s)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)}performVacuuming(e,t){return Ne(this,void 0,void 0,function*(){const s=this._dirtCount;if(this.vacuumConditionsMet(t)){const n=e.batchSize||Je.batchSize,r=e.batchWait||Je.batchWait;let i=1;for(const[o,l]of this._index){for(const[c,h]of l)for(const[m]of h)this._documentIds.has(m)||(h.size<=1?l.delete(c):h.delete(m));this._index.get(o).size===0&&this._index.delete(o),i%n===0&&(yield new Promise(c=>setTimeout(c,r))),i+=1}this._dirtCount-=s}yield null,this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null})}vacuumConditionsMet(e){if(e==null)return!0;let{minDirtCount:t,minDirtFactor:s}=e;return t=t||$e.minDirtCount,s=s||$e.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=s}get isVacuuming(){return this._currentVacuum!=null}get dirtCount(){return this._dirtCount}get dirtFactor(){return this._dirtCount/(1+this._documentCount+this._dirtCount)}has(e){return this._idToShortId.has(e)}getStoredFields(e){const t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)}search(e,t={}){const s=this.executeQuery(e,t),n=[];for(const[r,{score:i,terms:o,match:l}]of s){const c=o.length||1,h={id:this._documentIds.get(r),score:i*c,terms:Object.keys(l),queryTerms:o,match:l};Object.assign(h,this._storedFields.get(r)),(t.filter==null||t.filter(h))&&n.push(h)}return e===ue.wildcard&&t.boostDocument==null&&this._options.searchOptions.boostDocument==null||n.sort(vt),n}autoSuggest(e,t={}){t=Object.assign(Object.assign({},this._options.autoSuggestOptions),t);const s=new Map;for(const{score:r,terms:i}of this.search(e,t)){const o=i.join(" "),l=s.get(o);l!=null?(l.score+=r,l.count+=1):s.set(o,{score:r,terms:i,count:1})}const n=[];for(const[r,{score:i,terms:o,count:l}]of s)n.push({suggestion:r,terms:o,score:i/l});return n.sort(vt),n}get documentCount(){return this._documentCount}get termCount(){return this._index.size}static loadJSON(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)}static loadJSONAsync(e,t){return Ne(this,void 0,void 0,function*(){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJSAsync(JSON.parse(e),t)})}static getDefault(e){if(Ve.hasOwnProperty(e))return je(Ve,e);throw new Error(`MiniSearch: unknown option "${e}"`)}static loadJS(e,t){const{index:s,documentIds:n,fieldLength:r,storedFields:i,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=Ie(n),l._fieldLength=Ie(r),l._storedFields=Ie(i);for(const[c,h]of l._documentIds)l._idToShortId.set(h,c);for(const[c,h]of s){const m=new Map;for(const f of Object.keys(h)){let b=h[f];o===1&&(b=b.ds),m.set(parseInt(f,10),Ie(b))}l._index.set(c,m)}return l}static loadJSAsync(e,t){return Ne(this,void 0,void 0,function*(){const{index:s,documentIds:n,fieldLength:r,storedFields:i,serializationVersion:o}=e,l=this.instantiateMiniSearch(e,t);l._documentIds=yield ke(n),l._fieldLength=yield ke(r),l._storedFields=yield ke(i);for(const[h,m]of l._documentIds)l._idToShortId.set(m,h);let c=0;for(const[h,m]of s){const f=new Map;for(const b of Object.keys(m)){let y=m[b];o===1&&(y=y.ds),f.set(parseInt(b,10),yield ke(y))}++c%1e3===0&&(yield Ot(0)),l._index.set(h,f)}return l})}static instantiateMiniSearch(e,t){const{documentCount:s,nextId:n,fieldIds:r,averageFieldLength:i,dirtCount:o,serializationVersion:l}=e;if(l!==1&&l!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");const c=new ue(t);return c._documentCount=s,c._nextId=n,c._idToShortId=new Map,c._fieldIds=r,c._avgFieldLength=i,c._dirtCount=o||0,c._index=new X,c}executeQuery(e,t={}){if(e===ue.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){const f=Object.assign(Object.assign(Object.assign({},t),e),{queries:void 0}),b=e.queries.map(y=>this.executeQuery(y,f));return this.combineResults(b,f.combineWith)}const{tokenize:s,processTerm:n,searchOptions:r}=this._options,i=Object.assign(Object.assign({tokenize:s,processTerm:n},r),t),{tokenize:o,processTerm:l}=i,m=o(e).flatMap(f=>l(f)).filter(f=>!!f).map($s(i)).map(f=>this.executeQuerySpec(f,i));return this.combineResults(m,i.combineWith)}executeQuerySpec(e,t){const s=Object.assign(Object.assign({},this._options.searchOptions),t),n=(s.fields||this._options.fields).reduce((x,w)=>Object.assign(Object.assign({},x),{[w]:je(s.boost,w)||1}),{}),{boostDocument:r,weights:i,maxFuzzy:o,bm25:l}=s,{fuzzy:c,prefix:h}=Object.assign(Object.assign({},ft.weights),i),m=this._index.get(e.term),f=this.termResults(e.term,e.term,1,e.termBoost,m,n,r,l);let b,y;if(e.prefix&&(b=this._index.atPrefix(e.term)),e.fuzzy){const x=e.fuzzy===!0?.2:e.fuzzy,w=x<1?Math.min(o,Math.round(e.term.length*x)):x;w&&(y=this._index.fuzzyGet(e.term,w))}if(b)for(const[x,w]of b){const R=x.length-e.term.length;if(!R)continue;y==null||y.delete(x);const C=h*x.length/(x.length+.3*R);this.termResults(e.term,x,C,e.termBoost,w,n,r,l,f)}if(y)for(const x of y.keys()){const[w,R]=y.get(x);if(!R)continue;const C=c*x.length/(x.length+R);this.termResults(e.term,x,C,e.termBoost,w,n,r,l,f)}return f}executeWildcardQuery(e){const t=new Map,s=Object.assign(Object.assign({},this._options.searchOptions),e);for(const[n,r]of this._documentIds){const i=s.boostDocument?s.boostDocument(r,"",this._storedFields.get(n)):1;t.set(n,{score:i,terms:[],match:{}})}return t}combineResults(e,t=Ge){if(e.length===0)return new Map;const s=t.toLowerCase(),n=zs[s];if(!n)throw new Error(`Invalid combination operator: ${t}`);return e.reduce(n)||new Map}toJSON(){const e=[];for(const[t,s]of this._index){const n={};for(const[r,i]of s)n[r]=Object.fromEntries(i);e.push([t,n])}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:e,serializationVersion:2}}termResults(e,t,s,n,r,i,o,l,c=new Map){if(r==null)return c;for(const h of Object.keys(i)){const m=i[h],f=this._fieldIds[h],b=r.get(f);if(b==null)continue;let y=b.size;const x=this._avgFieldLength[f];for(const w of b.keys()){if(!this._documentIds.has(w)){this.removeTerm(f,w,t),y-=1;continue}const R=o?o(this._documentIds.get(w),t,this._storedFields.get(w)):1;if(!R)continue;const C=b.get(w),J=this._fieldLength.get(w)[f],Q=Vs(C,y,this._documentCount,J,x,l),W=s*n*m*R*Q,V=c.get(w);if(V){V.score+=W,Ws(V.terms,e);const $=je(V.match,t);$?$.push(h):V.match[t]=[h]}else c.set(w,{score:W,terms:[e],match:{[t]:[h]}})}}return c}addTerm(e,t,s){const n=this._index.fetch(s,mt);let r=n.get(e);if(r==null)r=new Map,r.set(t,1),n.set(e,r);else{const i=r.get(t);r.set(t,(i||0)+1)}}removeTerm(e,t,s){if(!this._index.has(s)){this.warnDocumentChanged(t,e,s);return}const n=this._index.fetch(s,mt),r=n.get(e);r==null||r.get(t)==null?this.warnDocumentChanged(t,e,s):r.get(t)<=1?r.size<=1?n.delete(e):r.delete(t):r.set(t,r.get(t)-1),this._index.get(s).size===0&&this._index.delete(s)}warnDocumentChanged(e,t,s){for(const n of Object.keys(this._fieldIds))if(this._fieldIds[n]===t){this._options.logger("warn",`MiniSearch: document with ID ${this._documentIds.get(e)} has changed before removal: term "${s}" was not present in field "${n}". Removing a document after it has changed can corrupt the index!`,"version_conflict");return}}addDocumentId(e){const t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t}addFields(e){for(let t=0;tObject.prototype.hasOwnProperty.call(a,e)?a[e]:void 0,zs={[Ge]:(a,e)=>{for(const t of e.keys()){const s=a.get(t);if(s==null)a.set(t,e.get(t));else{const{score:n,terms:r,match:i}=e.get(t);s.score=s.score+n,s.match=Object.assign(s.match,i),pt(s.terms,r)}}return a},[Nt]:(a,e)=>{const t=new Map;for(const s of e.keys()){const n=a.get(s);if(n==null)continue;const{score:r,terms:i,match:o}=e.get(s);pt(n.terms,i),t.set(s,{score:n.score+r,terms:n.terms,match:Object.assign(n.match,o)})}return t},[Ps]:(a,e)=>{for(const t of e.keys())a.delete(t);return a}},js={k:1.2,b:.7,d:.5},Vs=(a,e,t,s,n,r)=>{const{k:i,b:o,d:l}=r;return Math.log(1+(t-e+.5)/(e+.5))*(l+a*(i+1)/(a+i*(1-o+o*s/n)))},$s=a=>(e,t,s)=>{const n=typeof a.fuzzy=="function"?a.fuzzy(e,t,s):a.fuzzy||!1,r=typeof a.prefix=="function"?a.prefix(e,t,s):a.prefix===!0,i=typeof a.boostTerm=="function"?a.boostTerm(e,t,s):1;return{term:e,fuzzy:n,prefix:r,termBoost:i}},Ve={idField:"id",extractField:(a,e)=>a[e],tokenize:a=>a.split(Ks),processTerm:a=>a.toLowerCase(),fields:void 0,searchOptions:void 0,storeFields:[],logger:(a,e)=>{typeof(console==null?void 0:console[a])=="function"&&console[a](e)},autoVacuum:!0},ft={combineWith:Ge,prefix:!1,fuzzy:!1,maxFuzzy:6,boost:{},weights:{fuzzy:.45,prefix:.375},bm25:js},Bs={combineWith:Nt,prefix:(a,e,t)=>e===t.length-1},Je={batchSize:1e3,batchWait:10},Ue={minDirtFactor:.1,minDirtCount:20},$e=Object.assign(Object.assign({},Je),Ue),Ws=(a,e)=>{a.includes(e)||a.push(e)},pt=(a,e)=>{for(const t of e)a.includes(t)||a.push(t)},vt=({score:a},{score:e})=>e-a,mt=()=>new Map,Ie=a=>{const e=new Map;for(const t of Object.keys(a))e.set(parseInt(t,10),a[t]);return e},ke=a=>Ne(void 0,void 0,void 0,function*(){const e=new Map;let t=0;for(const s of Object.keys(a))e.set(parseInt(s,10),a[s]),++t%1e3===0&&(yield Ot(0));return e}),Ot=a=>new Promise(e=>setTimeout(e,a)),Ks=/[\n\r\p{Z}\p{P}]+/u;class Js{constructor(e=10){Ae(this,"max");Ae(this,"cache");this.max=e,this.cache=new Map}get(e){let t=this.cache.get(e);return t!==void 0&&(this.cache.delete(e),this.cache.set(e,t)),t}set(e,t){this.cache.has(e)?this.cache.delete(e):this.cache.size===this.max&&this.cache.delete(this.first()),this.cache.set(e,t)}first(){return this.cache.keys().next().value}clear(){this.cache.clear()}}const Us=["aria-owns"],qs={class:"shell"},Gs=["title"],Hs={class:"search-actions before"},Qs=["title"],Ys=["aria-activedescendant","aria-controls","placeholder"],Zs={class:"search-actions"},Xs=["title"],en=["disabled","title"],tn=["id","role","aria-labelledby"],sn=["id","aria-selected"],nn=["href","aria-label","onMouseenter","onFocusin","data-index"],rn={class:"titles"},an=["innerHTML"],on={class:"title main"},ln=["innerHTML"],cn={key:0,class:"excerpt-wrapper"},un={key:0,class:"excerpt",inert:""},dn=["innerHTML"],hn={key:0,class:"no-results"},fn={class:"search-keyboard-shortcuts"},pn=["aria-label"],vn=["aria-label"],mn=["aria-label"],gn=["aria-label"],bn=Lt({__name:"VPLocalSearchBox",emits:["close"],setup(a,{emit:e}){var F,A;const t=e,s=_e(),n=_e(),r=_e(is),i=ss(),{activate:o}=Rs(s,{immediate:!0,allowOutsideClick:!0,clickOutsideDeactivates:!0,escapeDeactivates:!0}),{localeIndex:l,theme:c}=i,h=st(async()=>{var v,p,S,O,P,z,j,I,K;return at(ue.loadJSON((S=await((p=(v=r.value)[l.value])==null?void 0:p.call(v)))==null?void 0:S.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((O=c.value.search)==null?void 0:O.provider)==="local"&&((z=(P=c.value.search.options)==null?void 0:P.miniSearch)==null?void 0:z.searchOptions)},...((j=c.value.search)==null?void 0:j.provider)==="local"&&((K=(I=c.value.search.options)==null?void 0:I.miniSearch)==null?void 0:K.options)}))}),f=ge(()=>{var v,p;return((v=c.value.search)==null?void 0:v.provider)==="local"&&((p=c.value.search.options)==null?void 0:p.disableQueryPersistence)===!0}).value?ie(""):Dt("vitepress:local-search-filter",""),b=Pt("vitepress:local-search-detailed-list",((F=c.value.search)==null?void 0:F.provider)==="local"&&((A=c.value.search.options)==null?void 0:A.detailedView)===!0),y=ge(()=>{var v,p,S;return((v=c.value.search)==null?void 0:v.provider)==="local"&&(((p=c.value.search.options)==null?void 0:p.disableDetailedView)===!0||((S=c.value.search.options)==null?void 0:S.detailedView)===!1)}),x=ge(()=>{var p,S,O,P,z,j,I;const v=((p=c.value.search)==null?void 0:p.options)??c.value.algolia;return((z=(P=(O=(S=v==null?void 0:v.locales)==null?void 0:S[l.value])==null?void 0:O.translations)==null?void 0:P.button)==null?void 0:z.buttonText)||((I=(j=v==null?void 0:v.translations)==null?void 0:j.button)==null?void 0:I.buttonText)||"Search"});zt(()=>{y.value&&(b.value=!1)});const w=_e([]),R=ie(!1);Be(f,()=>{R.value=!1});const C=st(async()=>{if(n.value)return at(new Ms(n.value))},null),J=new Js(16);jt(()=>[h.value,f.value,b.value],async([v,p,S],O,P)=>{var ee,we,He,Qe;(O==null?void 0:O[0])!==v&&J.clear();let z=!1;if(P(()=>{z=!0}),!v)return;w.value=v.search(p).slice(0,16),R.value=!0;const j=S?await Promise.all(w.value.map(B=>Q(B.id))):[];if(z)return;for(const{id:B,mod:te}of j){const se=B.slice(0,B.indexOf("#"));let Y=J.get(se);if(Y)continue;Y=new Map,J.set(se,Y);const G=te.default??te;if(G!=null&&G.render||G!=null&&G.setup){const ne=Yt(G);ne.config.warnHandler=()=>{},ne.provide(Zt,i),Object.defineProperties(ne.config.globalProperties,{$frontmatter:{get(){return i.frontmatter.value}},$params:{get(){return i.page.value.params}}});const Ye=document.createElement("div");ne.mount(Ye),Ye.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(de=>{var et;const xe=(et=de.querySelector("a"))==null?void 0:et.getAttribute("href"),Ze=(xe==null?void 0:xe.startsWith("#"))&&xe.slice(1);if(!Ze)return;let Xe="";for(;(de=de.nextElementSibling)&&!/^h[1-6]$/i.test(de.tagName);)Xe+=de.outerHTML;Y.set(Ze,Xe)}),ne.unmount()}if(z)return}const I=new Set;if(w.value=w.value.map(B=>{const[te,se]=B.id.split("#"),Y=J.get(te),G=(Y==null?void 0:Y.get(se))??"";for(const ne in B.match)I.add(ne);return{...B,text:G}}),await fe(),z)return;await new Promise(B=>{var te;(te=C.value)==null||te.unmark({done:()=>{var se;(se=C.value)==null||se.markRegExp(T(I),{done:B})}})});const K=((ee=s.value)==null?void 0:ee.querySelectorAll(".result .excerpt"))??[];for(const B of K)(we=B.querySelector('mark[data-markjs="true"]'))==null||we.scrollIntoView({block:"center"});(Qe=(He=n.value)==null?void 0:He.firstElementChild)==null||Qe.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function Q(v){const p=Xt(v.slice(0,v.indexOf("#")));try{if(!p)throw new Error(`Cannot find file for id: ${v}`);return{id:v,mod:await import(p)}}catch(S){return console.error(S),{id:v,mod:{}}}}const W=ie(),V=ge(()=>{var v;return((v=f.value)==null?void 0:v.length)<=0});function $(v=!0){var p,S;(p=W.value)==null||p.focus(),v&&((S=W.value)==null||S.select())}Le(()=>{$()});function ye(v){v.pointerType==="mouse"&&$()}const M=ie(-1),U=ie(!0);Be(w,v=>{M.value=v.length?0:-1,q()});function q(){fe(()=>{const v=document.querySelector(".result.selected");v==null||v.scrollIntoView({block:"nearest"})})}Se("ArrowUp",v=>{v.preventDefault(),M.value--,M.value<0&&(M.value=w.value.length-1),U.value=!0,q()}),Se("ArrowDown",v=>{v.preventDefault(),M.value++,M.value>=w.value.length&&(M.value=0),U.value=!0,q()});const k=Vt();Se("Enter",v=>{if(v.isComposing||v.target instanceof HTMLButtonElement&&v.target.type!=="submit")return;const p=w.value[M.value];if(v.target instanceof HTMLInputElement&&!p){v.preventDefault();return}p&&(k.go(p.id),t("close"))}),Se("Escape",()=>{t("close")});const u=ns({modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}});Le(()=>{window.history.pushState(null,"",null)}),$t("popstate",v=>{v.preventDefault(),t("close")});const g=Bt(Wt?document.body:null);Le(()=>{fe(()=>{g.value=!0,fe().then(()=>o())})}),Kt(()=>{g.value=!1});function E(){f.value="",fe().then(()=>$(!1))}function T(v){return new RegExp([...v].sort((p,S)=>S.length-p.length).map(p=>`(${es(p)})`).join("|"),"gi")}function N(v){var O;if(!U.value)return;const p=(O=v.target)==null?void 0:O.closest(".result"),S=Number.parseInt(p==null?void 0:p.dataset.index);S>=0&&S!==M.value&&(M.value=S),U.value=!1}return(v,p)=>{var S,O,P,z,j;return H(),Jt(Qt,{to:"body"},[_("div",{ref_key:"el",ref:s,role:"button","aria-owns":(S=w.value)!=null&&S.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[_("div",{class:"backdrop",onClick:p[0]||(p[0]=I=>v.$emit("close"))}),_("div",qs,[_("form",{class:"search-bar",onPointerup:p[4]||(p[4]=I=>ye(I)),onSubmit:p[5]||(p[5]=Ut(()=>{},["prevent"]))},[_("label",{title:x.value,id:"localsearch-label",for:"localsearch-input"},p[7]||(p[7]=[_("span",{"aria-hidden":"true",class:"vpi-search search-icon local-search-icon"},null,-1)]),8,Gs),_("div",Hs,[_("button",{class:"back-button",title:L(u)("modal.backButtonTitle"),onClick:p[1]||(p[1]=I=>v.$emit("close"))},p[8]||(p[8]=[_("span",{class:"vpi-arrow-left local-search-icon"},null,-1)]),8,Qs)]),qt(_("input",{ref_key:"searchInput",ref:W,"onUpdate:modelValue":p[2]||(p[2]=I=>Ht(f)?f.value=I:null),"aria-activedescendant":M.value>-1?"localsearch-item-"+M.value:void 0,"aria-autocomplete":"both","aria-controls":(O=w.value)!=null&&O.length?"localsearch-list":void 0,"aria-labelledby":"localsearch-label",autocapitalize:"off",autocomplete:"off",autocorrect:"off",class:"search-input",id:"localsearch-input",enterkeyhint:"go",maxlength:"64",placeholder:x.value,spellcheck:"false",type:"search"},null,8,Ys),[[Gt,L(f)]]),_("div",Zs,[y.value?Ee("",!0):(H(),Z("button",{key:0,class:nt(["toggle-layout-button",{"detailed-list":L(b)}]),type:"button",title:L(u)("modal.displayDetails"),onClick:p[3]||(p[3]=I=>M.value>-1&&(b.value=!L(b)))},p[9]||(p[9]=[_("span",{class:"vpi-layout-list local-search-icon"},null,-1)]),10,Xs)),_("button",{class:"clear-button",type:"reset",disabled:V.value,title:L(u)("modal.resetButtonTitle"),onClick:E},p[10]||(p[10]=[_("span",{class:"vpi-delete local-search-icon"},null,-1)]),8,en)])],32),_("ul",{ref_key:"resultsEl",ref:n,id:(P=w.value)!=null&&P.length?"localsearch-list":void 0,role:(z=w.value)!=null&&z.length?"listbox":void 0,"aria-labelledby":(j=w.value)!=null&&j.length?"localsearch-label":void 0,class:"results",onMousemove:N},[(H(!0),Z(rt,null,it(w.value,(I,K)=>(H(),Z("li",{key:I.id,id:"localsearch-item-"+K,"aria-selected":M.value===K?"true":"false",role:"option"},[_("a",{href:I.id,class:nt(["result",{selected:M.value===K}]),"aria-label":[...I.titles,I.title].join(" > "),onMouseenter:ee=>!U.value&&(M.value=K),onFocusin:ee=>M.value=K,onClick:p[6]||(p[6]=ee=>v.$emit("close")),"data-index":K},[_("div",null,[_("div",rn,[p[12]||(p[12]=_("span",{class:"title-icon"},"#",-1)),(H(!0),Z(rt,null,it(I.titles,(ee,we)=>(H(),Z("span",{key:we,class:"title"},[_("span",{class:"text",innerHTML:ee},null,8,an),p[11]||(p[11]=_("span",{class:"vpi-chevron-right local-search-icon"},null,-1))]))),128)),_("span",on,[_("span",{class:"text",innerHTML:I.title},null,8,ln)])]),L(b)?(H(),Z("div",cn,[I.text?(H(),Z("div",un,[_("div",{class:"vp-doc",innerHTML:I.text},null,8,dn)])):Ee("",!0),p[13]||(p[13]=_("div",{class:"excerpt-gradient-bottom"},null,-1)),p[14]||(p[14]=_("div",{class:"excerpt-gradient-top"},null,-1))])):Ee("",!0)])],42,nn)],8,sn))),128)),L(f)&&!w.value.length&&R.value?(H(),Z("li",hn,[pe(ve(L(u)("modal.noResultsText"))+' "',1),_("strong",null,ve(L(f)),1),p[15]||(p[15]=pe('" '))])):Ee("",!0)],40,tn),_("div",fn,[_("span",null,[_("kbd",{"aria-label":L(u)("modal.footer.navigateUpKeyAriaLabel")},p[16]||(p[16]=[_("span",{class:"vpi-arrow-up navigate-icon"},null,-1)]),8,pn),_("kbd",{"aria-label":L(u)("modal.footer.navigateDownKeyAriaLabel")},p[17]||(p[17]=[_("span",{class:"vpi-arrow-down navigate-icon"},null,-1)]),8,vn),pe(" "+ve(L(u)("modal.footer.navigateText")),1)]),_("span",null,[_("kbd",{"aria-label":L(u)("modal.footer.selectKeyAriaLabel")},p[18]||(p[18]=[_("span",{class:"vpi-corner-down-left navigate-icon"},null,-1)]),8,mn),pe(" "+ve(L(u)("modal.footer.selectText")),1)]),_("span",null,[_("kbd",{"aria-label":L(u)("modal.footer.closeKeyAriaLabel")},"esc",8,gn),pe(" "+ve(L(u)("modal.footer.closeText")),1)])])])],8,Us)])}}}),En=ts(bn,[["__scopeId","data-v-68e678c9"]]);export{En as default}; diff --git a/assets/chunks/framework.BQmytedh.js b/assets/chunks/framework.BQmytedh.js new file mode 100644 index 00000000..4ea78d54 --- /dev/null +++ b/assets/chunks/framework.BQmytedh.js @@ -0,0 +1,18 @@ +/** +* @vue/shared v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**//*! #__NO_SIDE_EFFECTS__ */function Ns(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const Z={},Et=[],ke=()=>{},Ko=()=>!1,en=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Fs=e=>e.startsWith("onUpdate:"),ae=Object.assign,Hs=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},qo=Object.prototype.hasOwnProperty,z=(e,t)=>qo.call(e,t),W=Array.isArray,Tt=e=>In(e)==="[object Map]",ii=e=>In(e)==="[object Set]",q=e=>typeof e=="function",re=e=>typeof e=="string",Xe=e=>typeof e=="symbol",ne=e=>e!==null&&typeof e=="object",oi=e=>(ne(e)||q(e))&&q(e.then)&&q(e.catch),li=Object.prototype.toString,In=e=>li.call(e),Go=e=>In(e).slice(8,-1),ci=e=>In(e)==="[object Object]",$s=e=>re(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Ct=Ns(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Nn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Yo=/-(\w)/g,Le=Nn(e=>e.replace(Yo,(t,n)=>n?n.toUpperCase():"")),Xo=/\B([A-Z])/g,st=Nn(e=>e.replace(Xo,"-$1").toLowerCase()),Fn=Nn(e=>e.charAt(0).toUpperCase()+e.slice(1)),_n=Nn(e=>e?`on${Fn(e)}`:""),tt=(e,t)=>!Object.is(e,t),bn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},vs=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Jo=e=>{const t=re(e)?Number(e):NaN;return isNaN(t)?e:t};let ar;const Hn=()=>ar||(ar=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ds(e){if(W(e)){const t={};for(let n=0;n{if(n){const s=n.split(Qo);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function js(e){let t="";if(re(e))t=e;else if(W(e))for(let n=0;n!!(e&&e.__v_isRef===!0),sl=e=>re(e)?e:e==null?"":W(e)||ne(e)&&(e.toString===li||!q(e.toString))?ui(e)?sl(e.value):JSON.stringify(e,di,2):String(e),di=(e,t)=>ui(t)?di(e,t.value):Tt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[zn(s,i)+" =>"]=r,n),{})}:ii(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>zn(n))}:Xe(t)?zn(t):ne(t)&&!W(t)&&!ci(t)?String(t):t,zn=(e,t="")=>{var n;return Xe(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let we;class rl{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=we,!t&&we&&(this.index=(we.scopes||(we.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0)return;if(jt){let t=jt;for(jt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Dt;){let t=Dt;for(Dt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function yi(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function vi(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),ks(s),ol(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function _s(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(_i(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function _i(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Kt))return;e.globalVersion=Kt;const t=e.dep;if(e.flags|=2,t.version>0&&!e.isSSR&&e.deps&&!_s(e)){e.flags&=-3;return}const n=te,s=Ne;te=e,Ne=!0;try{yi(e);const r=e.fn(e._value);(t.version===0||tt(r,e._value))&&(e._value=r,t.version++)}catch(r){throw t.version++,r}finally{te=n,Ne=s,vi(e),e.flags&=-3}}function ks(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)ks(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function ol(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let Ne=!0;const bi=[];function rt(){bi.push(Ne),Ne=!1}function it(){const e=bi.pop();Ne=e===void 0?!0:e}function fr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=te;te=void 0;try{t()}finally{te=n}}}let Kt=0;class ll{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class $n{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(t){if(!te||!Ne||te===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==te)n=this.activeLink=new ll(te,this),te.deps?(n.prevDep=te.depsTail,te.depsTail.nextDep=n,te.depsTail=n):te.deps=te.depsTail=n,wi(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=te.depsTail,n.nextDep=void 0,te.depsTail.nextDep=n,te.depsTail=n,te.deps===n&&(te.deps=s)}return n}trigger(t){this.version++,Kt++,this.notify(t)}notify(t){Vs();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Us()}}}function wi(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)wi(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Cn=new WeakMap,dt=Symbol(""),bs=Symbol(""),qt=Symbol("");function me(e,t,n){if(Ne&&te){let s=Cn.get(e);s||Cn.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new $n),r.map=s,r.key=n),r.track()}}function Ge(e,t,n,s,r,i){const o=Cn.get(e);if(!o){Kt++;return}const l=c=>{c&&c.trigger()};if(Vs(),t==="clear")o.forEach(l);else{const c=W(e),f=c&&$s(n);if(c&&n==="length"){const a=Number(s);o.forEach((h,y)=>{(y==="length"||y===qt||!Xe(y)&&y>=a)&&l(h)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),f&&l(o.get(qt)),t){case"add":c?f&&l(o.get("length")):(l(o.get(dt)),Tt(e)&&l(o.get(bs)));break;case"delete":c||(l(o.get(dt)),Tt(e)&&l(o.get(bs)));break;case"set":Tt(e)&&l(o.get(dt));break}}Us()}function cl(e,t){const n=Cn.get(e);return n&&n.get(t)}function _t(e){const t=J(e);return t===e?t:(me(t,"iterate",qt),Pe(e)?t:t.map(ye))}function Dn(e){return me(e=J(e),"iterate",qt),e}const al={__proto__:null,[Symbol.iterator](){return Zn(this,Symbol.iterator,ye)},concat(...e){return _t(this).concat(...e.map(t=>W(t)?_t(t):t))},entries(){return Zn(this,"entries",e=>(e[1]=ye(e[1]),e))},every(e,t){return We(this,"every",e,t,void 0,arguments)},filter(e,t){return We(this,"filter",e,t,n=>n.map(ye),arguments)},find(e,t){return We(this,"find",e,t,ye,arguments)},findIndex(e,t){return We(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return We(this,"findLast",e,t,ye,arguments)},findLastIndex(e,t){return We(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return We(this,"forEach",e,t,void 0,arguments)},includes(...e){return es(this,"includes",e)},indexOf(...e){return es(this,"indexOf",e)},join(e){return _t(this).join(e)},lastIndexOf(...e){return es(this,"lastIndexOf",e)},map(e,t){return We(this,"map",e,t,void 0,arguments)},pop(){return Ft(this,"pop")},push(...e){return Ft(this,"push",e)},reduce(e,...t){return ur(this,"reduce",e,t)},reduceRight(e,...t){return ur(this,"reduceRight",e,t)},shift(){return Ft(this,"shift")},some(e,t){return We(this,"some",e,t,void 0,arguments)},splice(...e){return Ft(this,"splice",e)},toReversed(){return _t(this).toReversed()},toSorted(e){return _t(this).toSorted(e)},toSpliced(...e){return _t(this).toSpliced(...e)},unshift(...e){return Ft(this,"unshift",e)},values(){return Zn(this,"values",ye)}};function Zn(e,t,n){const s=Dn(e),r=s[t]();return s!==e&&!Pe(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.value&&(i.value=n(i.value)),i}),r}const fl=Array.prototype;function We(e,t,n,s,r,i){const o=Dn(e),l=o!==e&&!Pe(e),c=o[t];if(c!==fl[t]){const h=c.apply(e,i);return l?ye(h):h}let f=n;o!==e&&(l?f=function(h,y){return n.call(this,ye(h),y,e)}:n.length>2&&(f=function(h,y){return n.call(this,h,y,e)}));const a=c.call(o,f,s);return l&&r?r(a):a}function ur(e,t,n,s){const r=Dn(e);let i=n;return r!==e&&(Pe(e)?n.length>3&&(i=function(o,l,c){return n.call(this,o,l,c,e)}):i=function(o,l,c){return n.call(this,o,ye(l),c,e)}),r[t](i,...s)}function es(e,t,n){const s=J(e);me(s,"iterate",qt);const r=s[t](...n);return(r===-1||r===!1)&&Ks(n[0])?(n[0]=J(n[0]),s[t](...n)):r}function Ft(e,t,n=[]){rt(),Vs();const s=J(e)[t].apply(e,n);return Us(),it(),s}const ul=Ns("__proto__,__v_isRef,__isVue"),Si=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Xe));function dl(e){Xe(e)||(e=String(e));const t=J(this);return me(t,"has",e),t.hasOwnProperty(e)}class xi{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?Sl:Ai:i?Ci:Ti).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=W(t);if(!r){let c;if(o&&(c=al[n]))return c;if(n==="hasOwnProperty")return dl}const l=Reflect.get(t,n,fe(t)?t:s);return(Xe(n)?Si.has(n):ul(n))||(r||me(t,"get",n),i)?l:fe(l)?o&&$s(n)?l:l.value:ne(l)?r?Vn(l):jn(l):l}}class Ei extends xi{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];if(!this._isShallow){const c=yt(i);if(!Pe(s)&&!yt(s)&&(i=J(i),s=J(s)),!W(t)&&fe(i)&&!fe(s))return c?!1:(i.value=s,!0)}const o=W(t)&&$s(n)?Number(n)e,cn=e=>Reflect.getPrototypeOf(e);function yl(e,t,n){return function(...s){const r=this.__v_raw,i=J(r),o=Tt(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,f=r[e](...s),a=n?ws:t?Ss:ye;return!t&&me(i,"iterate",c?bs:dt),{next(){const{value:h,done:y}=f.next();return y?{value:h,done:y}:{value:l?[a(h[0]),a(h[1])]:a(h),done:y}},[Symbol.iterator](){return this}}}}function an(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function vl(e,t){const n={get(r){const i=this.__v_raw,o=J(i),l=J(r);e||(tt(r,l)&&me(o,"get",r),me(o,"get",l));const{has:c}=cn(o),f=t?ws:e?Ss:ye;if(c.call(o,r))return f(i.get(r));if(c.call(o,l))return f(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&me(J(r),"iterate",dt),Reflect.get(r,"size",r)},has(r){const i=this.__v_raw,o=J(i),l=J(r);return e||(tt(r,l)&&me(o,"has",r),me(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,c=J(l),f=t?ws:e?Ss:ye;return!e&&me(c,"iterate",dt),l.forEach((a,h)=>r.call(i,f(a),f(h),o))}};return ae(n,e?{add:an("add"),set:an("set"),delete:an("delete"),clear:an("clear")}:{add(r){!t&&!Pe(r)&&!yt(r)&&(r=J(r));const i=J(this);return cn(i).has.call(i,r)||(i.add(r),Ge(i,"add",r,r)),this},set(r,i){!t&&!Pe(i)&&!yt(i)&&(i=J(i));const o=J(this),{has:l,get:c}=cn(o);let f=l.call(o,r);f||(r=J(r),f=l.call(o,r));const a=c.call(o,r);return o.set(r,i),f?tt(i,a)&&Ge(o,"set",r,i):Ge(o,"add",r,i),this},delete(r){const i=J(this),{has:o,get:l}=cn(i);let c=o.call(i,r);c||(r=J(r),c=o.call(i,r)),l&&l.call(i,r);const f=i.delete(r);return c&&Ge(i,"delete",r,void 0),f},clear(){const r=J(this),i=r.size!==0,o=r.clear();return i&&Ge(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=yl(r,e,t)}),n}function Bs(e,t){const n=vl(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(z(n,r)&&r in s?n:s,r,i)}const _l={get:Bs(!1,!1)},bl={get:Bs(!1,!0)},wl={get:Bs(!0,!1)};const Ti=new WeakMap,Ci=new WeakMap,Ai=new WeakMap,Sl=new WeakMap;function xl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function El(e){return e.__v_skip||!Object.isExtensible(e)?0:xl(Go(e))}function jn(e){return yt(e)?e:Ws(e,!1,pl,_l,Ti)}function Tl(e){return Ws(e,!1,ml,bl,Ci)}function Vn(e){return Ws(e,!0,gl,wl,Ai)}function Ws(e,t,n,s,r){if(!ne(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=r.get(e);if(i)return i;const o=El(e);if(o===0)return e;const l=new Proxy(e,o===2?s:n);return r.set(e,l),l}function ht(e){return yt(e)?ht(e.__v_raw):!!(e&&e.__v_isReactive)}function yt(e){return!!(e&&e.__v_isReadonly)}function Pe(e){return!!(e&&e.__v_isShallow)}function Ks(e){return e?!!e.__v_raw:!1}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function wn(e){return!z(e,"__v_skip")&&Object.isExtensible(e)&&ai(e,"__v_skip",!0),e}const ye=e=>ne(e)?jn(e):e,Ss=e=>ne(e)?Vn(e):e;function fe(e){return e?e.__v_isRef===!0:!1}function oe(e){return Ri(e,!1)}function qs(e){return Ri(e,!0)}function Ri(e,t){return fe(e)?e:new Cl(e,t)}class Cl{constructor(t,n){this.dep=new $n,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:J(t),this._value=n?t:ye(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Pe(t)||yt(t);t=s?t:J(t),tt(t,n)&&(this._rawValue=t,this._value=s?t:ye(t),this.dep.trigger())}}function Oi(e){return fe(e)?e.value:e}const Al={get:(e,t,n)=>t==="__v_raw"?e:Oi(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return fe(r)&&!fe(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Mi(e){return ht(e)?e:new Proxy(e,Al)}class Rl{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new $n,{get:s,set:r}=t(n.track.bind(n),n.trigger.bind(n));this._get=s,this._set=r}get value(){return this._value=this._get()}set value(t){this._set(t)}}function Ol(e){return new Rl(e)}class Ml{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return cl(J(this._object),this._key)}}class Pl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function Ll(e,t,n){return fe(e)?e:q(e)?new Pl(e):ne(e)&&arguments.length>1?Il(e,t,n):oe(e)}function Il(e,t,n){const s=e[t];return fe(s)?s:new Ml(e,t,n)}class Nl{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new $n(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Kt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&te!==this)return mi(this,!0),!0}get value(){const t=this.dep.track();return _i(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Fl(e,t,n=!1){let s,r;return q(e)?s=e:(s=e.get,r=e.set),new Nl(s,r,n)}const fn={},An=new WeakMap;let ft;function Hl(e,t=!1,n=ft){if(n){let s=An.get(n);s||An.set(n,s=[]),s.push(e)}}function $l(e,t,n=Z){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:c}=n,f=g=>r?g:Pe(g)||r===!1||r===0?Ye(g,1):Ye(g);let a,h,y,v,S=!1,_=!1;if(fe(e)?(h=()=>e.value,S=Pe(e)):ht(e)?(h=()=>f(e),S=!0):W(e)?(_=!0,S=e.some(g=>ht(g)||Pe(g)),h=()=>e.map(g=>{if(fe(g))return g.value;if(ht(g))return f(g);if(q(g))return c?c(g,2):g()})):q(e)?t?h=c?()=>c(e,2):e:h=()=>{if(y){rt();try{y()}finally{it()}}const g=ft;ft=a;try{return c?c(e,3,[v]):e(v)}finally{ft=g}}:h=ke,t&&r){const g=h,O=r===!0?1/0:r;h=()=>Ye(g(),O)}const K=hi(),N=()=>{a.stop(),K&&K.active&&Hs(K.effects,a)};if(i&&t){const g=t;t=(...O)=>{g(...O),N()}}let j=_?new Array(e.length).fill(fn):fn;const p=g=>{if(!(!(a.flags&1)||!a.dirty&&!g))if(t){const O=a.run();if(r||S||(_?O.some((F,$)=>tt(F,j[$])):tt(O,j))){y&&y();const F=ft;ft=a;try{const $=[O,j===fn?void 0:_&&j[0]===fn?[]:j,v];c?c(t,3,$):t(...$),j=O}finally{ft=F}}}else a.run()};return l&&l(p),a=new pi(h),a.scheduler=o?()=>o(p,!1):p,v=g=>Hl(g,!1,a),y=a.onStop=()=>{const g=An.get(a);if(g){if(c)c(g,4);else for(const O of g)O();An.delete(a)}},t?s?p(!0):j=a.run():o?o(p.bind(null,!0),!0):a.run(),N.pause=a.pause.bind(a),N.resume=a.resume.bind(a),N.stop=N,N}function Ye(e,t=1/0,n){if(t<=0||!ne(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,fe(e))Ye(e.value,t,n);else if(W(e))for(let s=0;s{Ye(s,t,n)});else if(ci(e)){for(const s in e)Ye(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&Ye(e[s],t,n)}return e}/** +* @vue/runtime-core v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/function tn(e,t,n,s){try{return s?e(...s):e()}catch(r){nn(r,t,n)}}function He(e,t,n,s){if(q(e)){const r=tn(e,t,n,s);return r&&oi(r)&&r.catch(i=>{nn(i,t,n)}),r}if(W(e)){const r=[];for(let i=0;i>>1,r=Se[s],i=Gt(r);i=Gt(n)?Se.push(e):Se.splice(jl(t),0,e),e.flags|=1,Li()}}function Li(){Rn||(Rn=Pi.then(Ii))}function Vl(e){W(e)?At.push(...e):Qe&&e.id===-1?Qe.splice(wt+1,0,e):e.flags&1||(At.push(e),e.flags|=1),Li()}function dr(e,t,n=Ve+1){for(;nGt(n)-Gt(s));if(At.length=0,Qe){Qe.push(...t);return}for(Qe=t,wt=0;wte.id==null?e.flags&2?-1:1/0:e.id;function Ii(e){try{for(Ve=0;Ve{s._d&&Ar(-1);const i=Mn(t);let o;try{o=e(...r)}finally{Mn(i),s._d&&Ar(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function _f(e,t){if(de===null)return e;const n=Gn(de),s=e.dirs||(e.dirs=[]);for(let r=0;re.__isTeleport,Vt=e=>e&&(e.disabled||e.disabled===""),hr=e=>e&&(e.defer||e.defer===""),pr=e=>typeof SVGElement<"u"&&e instanceof SVGElement,gr=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,xs=(e,t)=>{const n=e&&e.to;return re(n)?t?t(n):null:n},$i={name:"Teleport",__isTeleport:!0,process(e,t,n,s,r,i,o,l,c,f){const{mc:a,pc:h,pbc:y,o:{insert:v,querySelector:S,createText:_,createComment:K}}=f,N=Vt(t.props);let{shapeFlag:j,children:p,dynamicChildren:g}=t;if(e==null){const O=t.el=_(""),F=t.anchor=_("");v(O,n,s),v(F,n,s);const $=(R,b)=>{j&16&&(r&&r.isCE&&(r.ce._teleportTarget=R),a(p,R,b,r,i,o,l,c))},V=()=>{const R=t.target=xs(t.props,S),b=Di(R,t,_,v);R&&(o!=="svg"&&pr(R)?o="svg":o!=="mathml"&&gr(R)&&(o="mathml"),N||($(R,b),Sn(t,!1)))};N&&($(n,F),Sn(t,!0)),hr(t.props)?be(()=>{V(),t.el.__isMounted=!0},i):V()}else{if(hr(t.props)&&!e.el.__isMounted){be(()=>{$i.process(e,t,n,s,r,i,o,l,c,f),delete e.el.__isMounted},i);return}t.el=e.el,t.targetStart=e.targetStart;const O=t.anchor=e.anchor,F=t.target=e.target,$=t.targetAnchor=e.targetAnchor,V=Vt(e.props),R=V?n:F,b=V?O:$;if(o==="svg"||pr(F)?o="svg":(o==="mathml"||gr(F))&&(o="mathml"),g?(y(e.dynamicChildren,g,R,r,i,o,l),Qs(e,t,!0)):c||h(e,t,R,b,r,i,o,l,!1),N)V?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):un(t,n,O,f,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const I=t.target=xs(t.props,S);I&&un(t,I,null,f,0)}else V&&un(t,F,$,f,1);Sn(t,N)}},remove(e,t,n,{um:s,o:{remove:r}},i){const{shapeFlag:o,children:l,anchor:c,targetStart:f,targetAnchor:a,target:h,props:y}=e;if(h&&(r(f),r(a)),i&&r(c),o&16){const v=i||!Vt(y);for(let S=0;S{e.isMounted=!0}),Ki(()=>{e.isUnmounting=!0}),e}const Re=[Function,Array],ji={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Re,onEnter:Re,onAfterEnter:Re,onEnterCancelled:Re,onBeforeLeave:Re,onLeave:Re,onAfterLeave:Re,onLeaveCancelled:Re,onBeforeAppear:Re,onAppear:Re,onAfterAppear:Re,onAppearCancelled:Re},Vi=e=>{const t=e.subTree;return t.component?Vi(t.component):t},Wl={name:"BaseTransition",props:ji,setup(e,{slots:t}){const n=qn(),s=Bl();return()=>{const r=t.default&&Bi(t.default(),!0);if(!r||!r.length)return;const i=Ui(r),o=J(e),{mode:l}=o;if(s.isLeaving)return ts(i);const c=mr(i);if(!c)return ts(i);let f=Es(c,o,s,n,h=>f=h);c.type!==ve&&Yt(c,f);let a=n.subTree&&mr(n.subTree);if(a&&a.type!==ve&&!ut(c,a)&&Vi(n).type!==ve){let h=Es(a,o,s,n);if(Yt(a,h),l==="out-in"&&c.type!==ve)return s.isLeaving=!0,h.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete h.afterLeave,a=void 0},ts(i);l==="in-out"&&c.type!==ve?h.delayLeave=(y,v,S)=>{const _=ki(s,a);_[String(a.key)]=a,y[Ze]=()=>{v(),y[Ze]=void 0,delete f.delayedLeave,a=void 0},f.delayedLeave=()=>{S(),delete f.delayedLeave,a=void 0}}:a=void 0}else a&&(a=void 0);return i}}};function Ui(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==ve){t=n;break}}return t}const Kl=Wl;function ki(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function Es(e,t,n,s,r){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:f,onAfterEnter:a,onEnterCancelled:h,onBeforeLeave:y,onLeave:v,onAfterLeave:S,onLeaveCancelled:_,onBeforeAppear:K,onAppear:N,onAfterAppear:j,onAppearCancelled:p}=t,g=String(e.key),O=ki(n,e),F=(R,b)=>{R&&He(R,s,9,b)},$=(R,b)=>{const I=b[1];F(R,b),W(R)?R.every(x=>x.length<=1)&&I():R.length<=1&&I()},V={mode:o,persisted:l,beforeEnter(R){let b=c;if(!n.isMounted)if(i)b=K||c;else return;R[Ze]&&R[Ze](!0);const I=O[g];I&&ut(e,I)&&I.el[Ze]&&I.el[Ze](),F(b,[R])},enter(R){let b=f,I=a,x=h;if(!n.isMounted)if(i)b=N||f,I=j||a,x=p||h;else return;let B=!1;const se=R[dn]=le=>{B||(B=!0,le?F(x,[R]):F(I,[R]),V.delayedLeave&&V.delayedLeave(),R[dn]=void 0)};b?$(b,[R,se]):se()},leave(R,b){const I=String(e.key);if(R[dn]&&R[dn](!0),n.isUnmounting)return b();F(y,[R]);let x=!1;const B=R[Ze]=se=>{x||(x=!0,b(),se?F(_,[R]):F(S,[R]),R[Ze]=void 0,O[I]===e&&delete O[I])};O[I]=e,v?$(v,[R,B]):B()},clone(R){const b=Es(R,t,n,s,r);return r&&r(b),b}};return V}function ts(e){if(sn(e))return e=nt(e),e.children=null,e}function mr(e){if(!sn(e))return Hi(e.type)&&e.children?Ui(e.children):e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&q(n.default))return n.default()}}function Yt(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Yt(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Bi(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;iXt(S,t&&(W(t)?t[_]:t),n,s,r));return}if(pt(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&Xt(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?Gn(s.component):s.el,o=r?null:i,{i:l,r:c}=e,f=t&&t.r,a=l.refs===Z?l.refs={}:l.refs,h=l.setupState,y=J(h),v=h===Z?()=>!1:S=>z(y,S);if(f!=null&&f!==c&&(re(f)?(a[f]=null,v(f)&&(h[f]=null)):fe(f)&&(f.value=null)),q(c))tn(c,l,12,[o,a]);else{const S=re(c),_=fe(c);if(S||_){const K=()=>{if(e.f){const N=S?v(c)?h[c]:a[c]:c.value;r?W(N)&&Hs(N,i):W(N)?N.includes(i)||N.push(i):S?(a[c]=[i],v(c)&&(h[c]=a[c])):(c.value=[i],e.k&&(a[e.k]=c.value))}else S?(a[c]=o,v(c)&&(h[c]=o)):_&&(c.value=o,e.k&&(a[e.k]=o))};o?(K.id=-1,be(K,n)):K()}}}let yr=!1;const bt=()=>{yr||(console.error("Hydration completed but contains mismatches."),yr=!0)},ql=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",Gl=e=>e.namespaceURI.includes("MathML"),hn=e=>{if(e.nodeType===1){if(ql(e))return"svg";if(Gl(e))return"mathml"}},xt=e=>e.nodeType===8;function Yl(e){const{mt:t,p:n,o:{patchProp:s,createText:r,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:f}}=e,a=(p,g)=>{if(!g.hasChildNodes()){n(null,p,g),On(),g._vnode=p;return}h(g.firstChild,p,null,null,null),On(),g._vnode=p},h=(p,g,O,F,$,V=!1)=>{V=V||!!g.dynamicChildren;const R=xt(p)&&p.data==="[",b=()=>_(p,g,O,F,$,R),{type:I,ref:x,shapeFlag:B,patchFlag:se}=g;let le=p.nodeType;g.el=p,se===-2&&(V=!1,g.dynamicChildren=null);let U=null;switch(I){case gt:le!==3?g.children===""?(c(g.el=r(""),o(p),p),U=p):U=b():(p.data!==g.children&&(bt(),p.data=g.children),U=i(p));break;case ve:j(p)?(U=i(p),N(g.el=p.content.firstChild,p,O)):le!==8||R?U=b():U=i(p);break;case kt:if(R&&(p=i(p),le=p.nodeType),le===1||le===3){U=p;const Y=!g.children.length;for(let D=0;D{V=V||!!g.dynamicChildren;const{type:R,props:b,patchFlag:I,shapeFlag:x,dirs:B,transition:se}=g,le=R==="input"||R==="option";if(le||I!==-1){B&&Ue(g,null,O,"created");let U=!1;if(j(p)){U=co(null,se)&&O&&O.vnode.props&&O.vnode.props.appear;const D=p.content.firstChild;U&&se.beforeEnter(D),N(D,p,O),g.el=p=D}if(x&16&&!(b&&(b.innerHTML||b.textContent))){let D=v(p.firstChild,g,p,O,F,$,V);for(;D;){pn(p,1)||bt();const he=D;D=D.nextSibling,l(he)}}else if(x&8){let D=g.children;D[0]===` +`&&(p.tagName==="PRE"||p.tagName==="TEXTAREA")&&(D=D.slice(1)),p.textContent!==D&&(pn(p,0)||bt(),p.textContent=g.children)}if(b){if(le||!V||I&48){const D=p.tagName.includes("-");for(const he in b)(le&&(he.endsWith("value")||he==="indeterminate")||en(he)&&!Ct(he)||he[0]==="."||D)&&s(p,he,null,b[he],void 0,O)}else if(b.onClick)s(p,"onClick",null,b.onClick,void 0,O);else if(I&4&&ht(b.style))for(const D in b.style)b.style[D]}let Y;(Y=b&&b.onVnodeBeforeMount)&&Oe(Y,O,g),B&&Ue(g,null,O,"beforeMount"),((Y=b&&b.onVnodeMounted)||B||U)&&go(()=>{Y&&Oe(Y,O,g),U&&se.enter(p),B&&Ue(g,null,O,"mounted")},F)}return p.nextSibling},v=(p,g,O,F,$,V,R)=>{R=R||!!g.dynamicChildren;const b=g.children,I=b.length;for(let x=0;x{const{slotScopeIds:R}=g;R&&($=$?$.concat(R):R);const b=o(p),I=v(i(p),g,b,O,F,$,V);return I&&xt(I)&&I.data==="]"?i(g.anchor=I):(bt(),c(g.anchor=f("]"),b,I),I)},_=(p,g,O,F,$,V)=>{if(pn(p.parentElement,1)||bt(),g.el=null,V){const I=K(p);for(;;){const x=i(p);if(x&&x!==I)l(x);else break}}const R=i(p),b=o(p);return l(p),n(null,g,b,R,O,F,hn(b),$),O&&(O.vnode.el=g.el,ho(O,g.el)),R},K=(p,g="[",O="]")=>{let F=0;for(;p;)if(p=i(p),p&&xt(p)&&(p.data===g&&F++,p.data===O)){if(F===0)return i(p);F--}return p},N=(p,g,O)=>{const F=g.parentNode;F&&F.replaceChild(p,g);let $=O;for(;$;)$.vnode.el===g&&($.vnode.el=$.subTree.el=p),$=$.parent},j=p=>p.nodeType===1&&p.tagName==="TEMPLATE";return[a,h]}const vr="data-allow-mismatch",Xl={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function pn(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(vr);)e=e.parentElement;const n=e&&e.getAttribute(vr);if(n==null)return!1;if(n==="")return!0;{const s=n.split(",");return t===0&&s.includes("children")?!0:n.split(",").includes(Xl[t])}}Hn().requestIdleCallback;Hn().cancelIdleCallback;function Jl(e,t){if(xt(e)&&e.data==="["){let n=1,s=e.nextSibling;for(;s;){if(s.nodeType===1){if(t(s)===!1)break}else if(xt(s))if(s.data==="]"){if(--n===0)break}else s.data==="["&&n++;s=s.nextSibling}}else t(e)}const pt=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function wf(e){q(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:s,delay:r=200,hydrate:i,timeout:o,suspensible:l=!0,onError:c}=e;let f=null,a,h=0;const y=()=>(h++,f=null,v()),v=()=>{let S;return f||(S=f=t().catch(_=>{if(_=_ instanceof Error?_:new Error(String(_)),c)return new Promise((K,N)=>{c(_,()=>K(y()),()=>N(_),h+1)});throw _}).then(_=>S!==f&&f?f:(_&&(_.__esModule||_[Symbol.toStringTag]==="Module")&&(_=_.default),a=_,_)))};return Ys({name:"AsyncComponentWrapper",__asyncLoader:v,__asyncHydrate(S,_,K){const N=i?()=>{const j=i(K,p=>Jl(S,p));j&&(_.bum||(_.bum=[])).push(j)}:K;a?N():v().then(()=>!_.isUnmounted&&N())},get __asyncResolved(){return a},setup(){const S=ue;if(Xs(S),a)return()=>ns(a,S);const _=p=>{f=null,nn(p,S,13,!s)};if(l&&S.suspense||Mt)return v().then(p=>()=>ns(p,S)).catch(p=>(_(p),()=>s?ce(s,{error:p}):null));const K=oe(!1),N=oe(),j=oe(!!r);return r&&setTimeout(()=>{j.value=!1},r),o!=null&&setTimeout(()=>{if(!K.value&&!N.value){const p=new Error(`Async component timed out after ${o}ms.`);_(p),N.value=p}},o),v().then(()=>{K.value=!0,S.parent&&sn(S.parent.vnode)&&S.parent.update()}).catch(p=>{_(p),N.value=p}),()=>{if(K.value&&a)return ns(a,S);if(N.value&&s)return ce(s,{error:N.value});if(n&&!j.value)return ce(n)}}})}function ns(e,t){const{ref:n,props:s,children:r,ce:i}=t.vnode,o=ce(e,s,r);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const sn=e=>e.type.__isKeepAlive;function zl(e,t){Wi(e,"a",t)}function Ql(e,t){Wi(e,"da",t)}function Wi(e,t,n=ue){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(kn(t,s,n),n){let r=n.parent;for(;r&&r.parent;)sn(r.parent.vnode)&&Zl(s,t,n,r),r=r.parent}}function Zl(e,t,n,s){const r=kn(t,e,s,!0);Bn(()=>{Hs(s[t],r)},n)}function kn(e,t,n=ue,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{rt();const l=rn(n),c=He(t,n,e,o);return l(),it(),c});return s?r.unshift(i):r.push(i),i}}const Je=e=>(t,n=ue)=>{(!Mt||e==="sp")&&kn(e,(...s)=>t(...s),n)},ec=Je("bm"),Lt=Je("m"),tc=Je("bu"),nc=Je("u"),Ki=Je("bum"),Bn=Je("um"),sc=Je("sp"),rc=Je("rtg"),ic=Je("rtc");function oc(e,t=ue){kn("ec",e,t)}const qi="components";function Sf(e,t){return Yi(qi,e,!0,t)||e}const Gi=Symbol.for("v-ndc");function xf(e){return re(e)?Yi(qi,e,!1)||e:e||Gi}function Yi(e,t,n=!0,s=!1){const r=de||ue;if(r){const i=r.type;{const l=Wc(i,!1);if(l&&(l===t||l===Le(t)||l===Fn(Le(t))))return i}const o=_r(r[e]||i[e],t)||_r(r.appContext[e],t);return!o&&s?i:o}}function _r(e,t){return e&&(e[t]||e[Le(t)]||e[Fn(Le(t))])}function Ef(e,t,n,s){let r;const i=n,o=W(e);if(o||re(e)){const l=o&&ht(e);let c=!1;l&&(c=!Pe(e),e=Dn(e)),r=new Array(e.length);for(let f=0,a=e.length;ft(l,c,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,f=l.length;czt(t)?!(t.type===ve||t.type===xe&&!Xi(t.children)):!0)?e:null}function Cf(e,t){const n={};for(const s in e)n[/[A-Z]/.test(s)?`on:${s}`:_n(s)]=e[s];return n}const Ts=e=>e?bo(e)?Gn(e):Ts(e.parent):null,Ut=ae(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ts(e.parent),$root:e=>Ts(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Js(e),$forceUpdate:e=>e.f||(e.f=()=>{Gs(e.update)}),$nextTick:e=>e.n||(e.n=Un.bind(e.proxy)),$watch:e=>Rc.bind(e)}),ss=(e,t)=>e!==Z&&!e.__isScriptSetup&&z(e,t),lc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;let f;if(t[0]!=="$"){const v=o[t];if(v!==void 0)switch(v){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(ss(s,t))return o[t]=1,s[t];if(r!==Z&&z(r,t))return o[t]=2,r[t];if((f=e.propsOptions[0])&&z(f,t))return o[t]=3,i[t];if(n!==Z&&z(n,t))return o[t]=4,n[t];Cs&&(o[t]=0)}}const a=Ut[t];let h,y;if(a)return t==="$attrs"&&me(e.attrs,"get",""),a(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==Z&&z(n,t))return o[t]=4,n[t];if(y=c.config.globalProperties,z(y,t))return y[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return ss(r,t)?(r[t]=n,!0):s!==Z&&z(s,t)?(s[t]=n,!0):z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:i}},o){let l;return!!n[o]||e!==Z&&z(e,o)||ss(t,o)||(l=i[0])&&z(l,o)||z(s,o)||z(Ut,o)||z(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Af(){return cc().slots}function cc(){const e=qn();return e.setupContext||(e.setupContext=So(e))}function br(e){return W(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Cs=!0;function ac(e){const t=Js(e),n=e.proxy,s=e.ctx;Cs=!1,t.beforeCreate&&wr(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:f,created:a,beforeMount:h,mounted:y,beforeUpdate:v,updated:S,activated:_,deactivated:K,beforeDestroy:N,beforeUnmount:j,destroyed:p,unmounted:g,render:O,renderTracked:F,renderTriggered:$,errorCaptured:V,serverPrefetch:R,expose:b,inheritAttrs:I,components:x,directives:B,filters:se}=t;if(f&&fc(f,s,null),o)for(const Y in o){const D=o[Y];q(D)&&(s[Y]=D.bind(n))}if(r){const Y=r.call(n,n);ne(Y)&&(e.data=jn(Y))}if(Cs=!0,i)for(const Y in i){const D=i[Y],he=q(D)?D.bind(n,n):q(D.get)?D.get.bind(n,n):ke,on=!q(D)&&q(D.set)?D.set.bind(n):ke,ot=ie({get:he,set:on});Object.defineProperty(s,Y,{enumerable:!0,configurable:!0,get:()=>ot.value,set:De=>ot.value=De})}if(l)for(const Y in l)Ji(l[Y],s,n,Y);if(c){const Y=q(c)?c.call(n):c;Reflect.ownKeys(Y).forEach(D=>{mc(D,Y[D])})}a&&wr(a,e,"c");function U(Y,D){W(D)?D.forEach(he=>Y(he.bind(n))):D&&Y(D.bind(n))}if(U(ec,h),U(Lt,y),U(tc,v),U(nc,S),U(zl,_),U(Ql,K),U(oc,V),U(ic,F),U(rc,$),U(Ki,j),U(Bn,g),U(sc,R),W(b))if(b.length){const Y=e.exposed||(e.exposed={});b.forEach(D=>{Object.defineProperty(Y,D,{get:()=>n[D],set:he=>n[D]=he})})}else e.exposed||(e.exposed={});O&&e.render===ke&&(e.render=O),I!=null&&(e.inheritAttrs=I),x&&(e.components=x),B&&(e.directives=B),R&&Xs(e)}function fc(e,t,n=ke){W(e)&&(e=As(e));for(const s in e){const r=e[s];let i;ne(r)?"default"in r?i=Ot(r.from||s,r.default,!0):i=Ot(r.from||s):i=Ot(r),fe(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function wr(e,t,n){He(W(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function Ji(e,t,n,s){let r=s.includes(".")?fo(n,s):()=>n[s];if(re(e)){const i=t[e];q(i)&&Fe(r,i)}else if(q(e))Fe(r,e.bind(n));else if(ne(e))if(W(e))e.forEach(i=>Ji(i,t,n,s));else{const i=q(e.handler)?e.handler.bind(n):t[e.handler];q(i)&&Fe(r,i,e)}}function Js(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(f=>Pn(c,f,o,!0)),Pn(c,t,o)),ne(t)&&i.set(t,c),c}function Pn(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&Pn(e,i,n,!0),r&&r.forEach(o=>Pn(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=uc[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const uc={data:Sr,props:xr,emits:xr,methods:$t,computed:$t,beforeCreate:_e,created:_e,beforeMount:_e,mounted:_e,beforeUpdate:_e,updated:_e,beforeDestroy:_e,beforeUnmount:_e,destroyed:_e,unmounted:_e,activated:_e,deactivated:_e,errorCaptured:_e,serverPrefetch:_e,components:$t,directives:$t,watch:hc,provide:Sr,inject:dc};function Sr(e,t){return t?e?function(){return ae(q(e)?e.call(this,this):e,q(t)?t.call(this,this):t)}:t:e}function dc(e,t){return $t(As(e),As(t))}function As(e){if(W(e)){const t={};for(let n=0;n1)return n&&q(t)?t.call(s&&s.proxy):t}}const Qi={},Zi=()=>Object.create(Qi),eo=e=>Object.getPrototypeOf(e)===Qi;function yc(e,t,n,s=!1){const r={},i=Zi();e.propsDefaults=Object.create(null),to(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:Tl(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function vc(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=J(r),[c]=e.propsOptions;let f=!1;if((s||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[y,v]=no(h,t,!0);ae(o,y),v&&l.push(...v)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!c)return ne(e)&&s.set(e,Et),Et;if(W(i))for(let a=0;ae[0]==="_"||e==="$stable",zs=e=>W(e)?e.map(Me):[Me(e)],bc=(e,t,n)=>{if(t._n)return t;const s=Ul((...r)=>zs(t(...r)),n);return s._c=!1,s},ro=(e,t,n)=>{const s=e._ctx;for(const r in e){if(so(r))continue;const i=e[r];if(q(i))t[r]=bc(r,i,s);else if(i!=null){const o=zs(i);t[r]=()=>o}}},io=(e,t)=>{const n=zs(t);e.slots.default=()=>n},oo=(e,t,n)=>{for(const s in t)(n||s!=="_")&&(e[s]=t[s])},wc=(e,t,n)=>{const s=e.slots=Zi();if(e.vnode.shapeFlag&32){const r=t._;r?(oo(s,t,n),n&&ai(s,"_",r,!0)):ro(t,s)}else t&&io(e,t)},Sc=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=Z;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:oo(r,t,n):(i=!t.$stable,ro(t,r)),o=t}else t&&(io(e,t),o={default:1});if(i)for(const l in r)!so(l)&&o[l]==null&&delete r[l]},be=go;function xc(e){return lo(e)}function Ec(e){return lo(e,Yl)}function lo(e,t){const n=Hn();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:f,setElementText:a,parentNode:h,nextSibling:y,setScopeId:v=ke,insertStaticContent:S}=e,_=(u,d,m,T=null,w=null,E=null,P=void 0,M=null,A=!!d.dynamicChildren)=>{if(u===d)return;u&&!ut(u,d)&&(T=ln(u),De(u,w,E,!0),u=null),d.patchFlag===-2&&(A=!1,d.dynamicChildren=null);const{type:C,ref:k,shapeFlag:L}=d;switch(C){case gt:K(u,d,m,T);break;case ve:N(u,d,m,T);break;case kt:u==null&&j(d,m,T,P);break;case xe:x(u,d,m,T,w,E,P,M,A);break;default:L&1?O(u,d,m,T,w,E,P,M,A):L&6?B(u,d,m,T,w,E,P,M,A):(L&64||L&128)&&C.process(u,d,m,T,w,E,P,M,A,vt)}k!=null&&w&&Xt(k,u&&u.ref,E,d||u,!d)},K=(u,d,m,T)=>{if(u==null)s(d.el=l(d.children),m,T);else{const w=d.el=u.el;d.children!==u.children&&f(w,d.children)}},N=(u,d,m,T)=>{u==null?s(d.el=c(d.children||""),m,T):d.el=u.el},j=(u,d,m,T)=>{[u.el,u.anchor]=S(u.children,d,m,T,u.el,u.anchor)},p=({el:u,anchor:d},m,T)=>{let w;for(;u&&u!==d;)w=y(u),s(u,m,T),u=w;s(d,m,T)},g=({el:u,anchor:d})=>{let m;for(;u&&u!==d;)m=y(u),r(u),u=m;r(d)},O=(u,d,m,T,w,E,P,M,A)=>{d.type==="svg"?P="svg":d.type==="math"&&(P="mathml"),u==null?F(d,m,T,w,E,P,M,A):R(u,d,w,E,P,M,A)},F=(u,d,m,T,w,E,P,M)=>{let A,C;const{props:k,shapeFlag:L,transition:H,dirs:G}=u;if(A=u.el=o(u.type,E,k&&k.is,k),L&8?a(A,u.children):L&16&&V(u.children,A,null,T,w,rs(u,E),P,M),G&&Ue(u,null,T,"created"),$(A,u,u.scopeId,P,T),k){for(const ee in k)ee!=="value"&&!Ct(ee)&&i(A,ee,null,k[ee],E,T);"value"in k&&i(A,"value",null,k.value,E),(C=k.onVnodeBeforeMount)&&Oe(C,T,u)}G&&Ue(u,null,T,"beforeMount");const X=co(w,H);X&&H.beforeEnter(A),s(A,d,m),((C=k&&k.onVnodeMounted)||X||G)&&be(()=>{C&&Oe(C,T,u),X&&H.enter(A),G&&Ue(u,null,T,"mounted")},w)},$=(u,d,m,T,w)=>{if(m&&v(u,m),T)for(let E=0;E{for(let C=A;C{const M=d.el=u.el;let{patchFlag:A,dynamicChildren:C,dirs:k}=d;A|=u.patchFlag&16;const L=u.props||Z,H=d.props||Z;let G;if(m&<(m,!1),(G=H.onVnodeBeforeUpdate)&&Oe(G,m,d,u),k&&Ue(d,u,m,"beforeUpdate"),m&<(m,!0),(L.innerHTML&&H.innerHTML==null||L.textContent&&H.textContent==null)&&a(M,""),C?b(u.dynamicChildren,C,M,m,T,rs(d,w),E):P||D(u,d,M,null,m,T,rs(d,w),E,!1),A>0){if(A&16)I(M,L,H,m,w);else if(A&2&&L.class!==H.class&&i(M,"class",null,H.class,w),A&4&&i(M,"style",L.style,H.style,w),A&8){const X=d.dynamicProps;for(let ee=0;ee{G&&Oe(G,m,d,u),k&&Ue(d,u,m,"updated")},T)},b=(u,d,m,T,w,E,P)=>{for(let M=0;M{if(d!==m){if(d!==Z)for(const E in d)!Ct(E)&&!(E in m)&&i(u,E,d[E],null,w,T);for(const E in m){if(Ct(E))continue;const P=m[E],M=d[E];P!==M&&E!=="value"&&i(u,E,M,P,w,T)}"value"in m&&i(u,"value",d.value,m.value,w)}},x=(u,d,m,T,w,E,P,M,A)=>{const C=d.el=u?u.el:l(""),k=d.anchor=u?u.anchor:l("");let{patchFlag:L,dynamicChildren:H,slotScopeIds:G}=d;G&&(M=M?M.concat(G):G),u==null?(s(C,m,T),s(k,m,T),V(d.children||[],m,k,w,E,P,M,A)):L>0&&L&64&&H&&u.dynamicChildren?(b(u.dynamicChildren,H,m,w,E,P,M),(d.key!=null||w&&d===w.subTree)&&Qs(u,d,!0)):D(u,d,m,k,w,E,P,M,A)},B=(u,d,m,T,w,E,P,M,A)=>{d.slotScopeIds=M,u==null?d.shapeFlag&512?w.ctx.activate(d,m,T,P,A):se(d,m,T,w,E,P,A):le(u,d,A)},se=(u,d,m,T,w,E,P)=>{const M=u.component=Vc(u,T,w);if(sn(u)&&(M.ctx.renderer=vt),Uc(M,!1,P),M.asyncDep){if(w&&w.registerDep(M,U,P),!u.el){const A=M.subTree=ce(ve);N(null,A,d,m)}}else U(M,u,d,m,w,E,P)},le=(u,d,m)=>{const T=d.component=u.component;if(Ic(u,d,m))if(T.asyncDep&&!T.asyncResolved){Y(T,d,m);return}else T.next=d,T.update();else d.el=u.el,T.vnode=d},U=(u,d,m,T,w,E,P)=>{const M=()=>{if(u.isMounted){let{next:L,bu:H,u:G,parent:X,vnode:ee}=u;{const Te=ao(u);if(Te){L&&(L.el=ee.el,Y(u,L,P)),Te.asyncDep.then(()=>{u.isUnmounted||M()});return}}let Q=L,Ee;lt(u,!1),L?(L.el=ee.el,Y(u,L,P)):L=ee,H&&bn(H),(Ee=L.props&&L.props.onVnodeBeforeUpdate)&&Oe(Ee,X,L,ee),lt(u,!0);const pe=is(u),Ie=u.subTree;u.subTree=pe,_(Ie,pe,h(Ie.el),ln(Ie),u,w,E),L.el=pe.el,Q===null&&ho(u,pe.el),G&&be(G,w),(Ee=L.props&&L.props.onVnodeUpdated)&&be(()=>Oe(Ee,X,L,ee),w)}else{let L;const{el:H,props:G}=d,{bm:X,m:ee,parent:Q,root:Ee,type:pe}=u,Ie=pt(d);if(lt(u,!1),X&&bn(X),!Ie&&(L=G&&G.onVnodeBeforeMount)&&Oe(L,Q,d),lt(u,!0),H&&Jn){const Te=()=>{u.subTree=is(u),Jn(H,u.subTree,u,w,null)};Ie&&pe.__asyncHydrate?pe.__asyncHydrate(H,u,Te):Te()}else{Ee.ce&&Ee.ce._injectChildStyle(pe);const Te=u.subTree=is(u);_(null,Te,m,T,u,w,E),d.el=Te.el}if(ee&&be(ee,w),!Ie&&(L=G&&G.onVnodeMounted)){const Te=d;be(()=>Oe(L,Q,Te),w)}(d.shapeFlag&256||Q&&pt(Q.vnode)&&Q.vnode.shapeFlag&256)&&u.a&&be(u.a,w),u.isMounted=!0,d=m=T=null}};u.scope.on();const A=u.effect=new pi(M);u.scope.off();const C=u.update=A.run.bind(A),k=u.job=A.runIfDirty.bind(A);k.i=u,k.id=u.uid,A.scheduler=()=>Gs(k),lt(u,!0),C()},Y=(u,d,m)=>{d.component=u;const T=u.vnode.props;u.vnode=d,u.next=null,vc(u,d.props,T,m),Sc(u,d.children,m),rt(),dr(u),it()},D=(u,d,m,T,w,E,P,M,A=!1)=>{const C=u&&u.children,k=u?u.shapeFlag:0,L=d.children,{patchFlag:H,shapeFlag:G}=d;if(H>0){if(H&128){on(C,L,m,T,w,E,P,M,A);return}else if(H&256){he(C,L,m,T,w,E,P,M,A);return}}G&8?(k&16&&It(C,w,E),L!==C&&a(m,L)):k&16?G&16?on(C,L,m,T,w,E,P,M,A):It(C,w,E,!0):(k&8&&a(m,""),G&16&&V(L,m,T,w,E,P,M,A))},he=(u,d,m,T,w,E,P,M,A)=>{u=u||Et,d=d||Et;const C=u.length,k=d.length,L=Math.min(C,k);let H;for(H=0;Hk?It(u,w,E,!0,!1,L):V(d,m,T,w,E,P,M,A,L)},on=(u,d,m,T,w,E,P,M,A)=>{let C=0;const k=d.length;let L=u.length-1,H=k-1;for(;C<=L&&C<=H;){const G=u[C],X=d[C]=A?et(d[C]):Me(d[C]);if(ut(G,X))_(G,X,m,null,w,E,P,M,A);else break;C++}for(;C<=L&&C<=H;){const G=u[L],X=d[H]=A?et(d[H]):Me(d[H]);if(ut(G,X))_(G,X,m,null,w,E,P,M,A);else break;L--,H--}if(C>L){if(C<=H){const G=H+1,X=GH)for(;C<=L;)De(u[C],w,E,!0),C++;else{const G=C,X=C,ee=new Map;for(C=X;C<=H;C++){const Ce=d[C]=A?et(d[C]):Me(d[C]);Ce.key!=null&&ee.set(Ce.key,C)}let Q,Ee=0;const pe=H-X+1;let Ie=!1,Te=0;const Nt=new Array(pe);for(C=0;C=pe){De(Ce,w,E,!0);continue}let je;if(Ce.key!=null)je=ee.get(Ce.key);else for(Q=X;Q<=H;Q++)if(Nt[Q-X]===0&&ut(Ce,d[Q])){je=Q;break}je===void 0?De(Ce,w,E,!0):(Nt[je-X]=C+1,je>=Te?Te=je:Ie=!0,_(Ce,d[je],m,null,w,E,P,M,A),Ee++)}const lr=Ie?Tc(Nt):Et;for(Q=lr.length-1,C=pe-1;C>=0;C--){const Ce=X+C,je=d[Ce],cr=Ce+1{const{el:E,type:P,transition:M,children:A,shapeFlag:C}=u;if(C&6){ot(u.component.subTree,d,m,T);return}if(C&128){u.suspense.move(d,m,T);return}if(C&64){P.move(u,d,m,vt);return}if(P===xe){s(E,d,m);for(let L=0;LM.enter(E),w);else{const{leave:L,delayLeave:H,afterLeave:G}=M,X=()=>s(E,d,m),ee=()=>{L(E,()=>{X(),G&&G()})};H?H(E,X,ee):ee()}else s(E,d,m)},De=(u,d,m,T=!1,w=!1)=>{const{type:E,props:P,ref:M,children:A,dynamicChildren:C,shapeFlag:k,patchFlag:L,dirs:H,cacheIndex:G}=u;if(L===-2&&(w=!1),M!=null&&Xt(M,null,m,u,!0),G!=null&&(d.renderCache[G]=void 0),k&256){d.ctx.deactivate(u);return}const X=k&1&&H,ee=!pt(u);let Q;if(ee&&(Q=P&&P.onVnodeBeforeUnmount)&&Oe(Q,d,u),k&6)Wo(u.component,m,T);else{if(k&128){u.suspense.unmount(m,T);return}X&&Ue(u,null,d,"beforeUnmount"),k&64?u.type.remove(u,d,m,vt,T):C&&!C.hasOnce&&(E!==xe||L>0&&L&64)?It(C,d,m,!1,!0):(E===xe&&L&384||!w&&k&16)&&It(A,d,m),T&&ir(u)}(ee&&(Q=P&&P.onVnodeUnmounted)||X)&&be(()=>{Q&&Oe(Q,d,u),X&&Ue(u,null,d,"unmounted")},m)},ir=u=>{const{type:d,el:m,anchor:T,transition:w}=u;if(d===xe){Bo(m,T);return}if(d===kt){g(u);return}const E=()=>{r(m),w&&!w.persisted&&w.afterLeave&&w.afterLeave()};if(u.shapeFlag&1&&w&&!w.persisted){const{leave:P,delayLeave:M}=w,A=()=>P(m,E);M?M(u.el,E,A):A()}else E()},Bo=(u,d)=>{let m;for(;u!==d;)m=y(u),r(u),u=m;r(d)},Wo=(u,d,m)=>{const{bum:T,scope:w,job:E,subTree:P,um:M,m:A,a:C}=u;Tr(A),Tr(C),T&&bn(T),w.stop(),E&&(E.flags|=8,De(P,u,d,m)),M&&be(M,d),be(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},It=(u,d,m,T=!1,w=!1,E=0)=>{for(let P=E;P{if(u.shapeFlag&6)return ln(u.component.subTree);if(u.shapeFlag&128)return u.suspense.next();const d=y(u.anchor||u.el),m=d&&d[Fi];return m?y(m):d};let Yn=!1;const or=(u,d,m)=>{u==null?d._vnode&&De(d._vnode,null,null,!0):_(d._vnode||null,u,d,null,null,null,m),d._vnode=u,Yn||(Yn=!0,dr(),On(),Yn=!1)},vt={p:_,um:De,m:ot,r:ir,mt:se,mc:V,pc:D,pbc:b,n:ln,o:e};let Xn,Jn;return t&&([Xn,Jn]=t(vt)),{render:or,hydrate:Xn,createApp:gc(or,Xn)}}function rs({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function lt({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function co(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Qs(e,t,n=!1){const s=e.children,r=t.children;if(W(s)&&W(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function ao(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:ao(t)}function Tr(e){if(e)for(let t=0;tOt(Cc);function Zs(e,t){return Wn(e,null,t)}function Rf(e,t){return Wn(e,null,{flush:"post"})}function Fe(e,t,n){return Wn(e,t,n)}function Wn(e,t,n=Z){const{immediate:s,deep:r,flush:i,once:o}=n,l=ae({},n),c=t&&s||!t&&i!=="post";let f;if(Mt){if(i==="sync"){const v=Ac();f=v.__watcherHandles||(v.__watcherHandles=[])}else if(!c){const v=()=>{};return v.stop=ke,v.resume=ke,v.pause=ke,v}}const a=ue;l.call=(v,S,_)=>He(v,a,S,_);let h=!1;i==="post"?l.scheduler=v=>{be(v,a&&a.suspense)}:i!=="sync"&&(h=!0,l.scheduler=(v,S)=>{S?v():Gs(v)}),l.augmentJob=v=>{t&&(v.flags|=4),h&&(v.flags|=2,a&&(v.id=a.uid,v.i=a))};const y=$l(e,t,l);return Mt&&(f?f.push(y):c&&y()),y}function Rc(e,t,n){const s=this.proxy,r=re(e)?e.includes(".")?fo(s,e):()=>s[e]:e.bind(s,s);let i;q(t)?i=t:(i=t.handler,n=t);const o=rn(this),l=Wn(r,i.bind(s),n);return o(),l}function fo(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;rt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Le(t)}Modifiers`]||e[`${st(t)}Modifiers`];function Mc(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||Z;let r=n;const i=t.startsWith("update:"),o=i&&Oc(s,t.slice(7));o&&(o.trim&&(r=n.map(a=>re(a)?a.trim():a)),o.number&&(r=n.map(vs)));let l,c=s[l=_n(t)]||s[l=_n(Le(t))];!c&&i&&(c=s[l=_n(st(t))]),c&&He(c,e,6,r);const f=s[l+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,He(f,e,6,r)}}function uo(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!q(e)){const c=f=>{const a=uo(f,t,!0);a&&(l=!0,ae(o,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(ne(e)&&s.set(e,null),null):(W(i)?i.forEach(c=>o[c]=null):ae(o,i),ne(e)&&s.set(e,o),o)}function Kn(e,t){return!e||!en(t)?!1:(t=t.slice(2).replace(/Once$/,""),z(e,t[0].toLowerCase()+t.slice(1))||z(e,st(t))||z(e,t))}function is(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:c,render:f,renderCache:a,props:h,data:y,setupState:v,ctx:S,inheritAttrs:_}=e,K=Mn(e);let N,j;try{if(n.shapeFlag&4){const g=r||s,O=g;N=Me(f.call(O,g,a,h,v,y,S)),j=l}else{const g=t;N=Me(g.length>1?g(h,{attrs:l,slots:o,emit:c}):g(h,null)),j=t.props?l:Pc(l)}}catch(g){Bt.length=0,nn(g,e,1),N=ce(ve)}let p=N;if(j&&_!==!1){const g=Object.keys(j),{shapeFlag:O}=p;g.length&&O&7&&(i&&g.some(Fs)&&(j=Lc(j,i)),p=nt(p,j,!1,!0))}return n.dirs&&(p=nt(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&Yt(p,n.transition),N=p,Mn(K),N}const Pc=e=>{let t;for(const n in e)(n==="class"||n==="style"||en(n))&&((t||(t={}))[n]=e[n]);return t},Lc=(e,t)=>{const n={};for(const s in e)(!Fs(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function Ic(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,f=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?Cr(s,o,f):!!o;if(c&8){const a=t.dynamicProps;for(let h=0;he.__isSuspense;function go(e,t){t&&t.pendingBranch?W(e)?t.effects.push(...e):t.effects.push(e):Vl(e)}const xe=Symbol.for("v-fgt"),gt=Symbol.for("v-txt"),ve=Symbol.for("v-cmt"),kt=Symbol.for("v-stc"),Bt=[];let Ae=null;function Os(e=!1){Bt.push(Ae=e?null:[])}function Nc(){Bt.pop(),Ae=Bt[Bt.length-1]||null}let Jt=1;function Ar(e,t=!1){Jt+=e,e<0&&Ae&&t&&(Ae.hasOnce=!0)}function mo(e){return e.dynamicChildren=Jt>0?Ae||Et:null,Nc(),Jt>0&&Ae&&Ae.push(e),e}function Of(e,t,n,s,r,i){return mo(vo(e,t,n,s,r,i,!0))}function Ms(e,t,n,s,r){return mo(ce(e,t,n,s,r,!0))}function zt(e){return e?e.__v_isVNode===!0:!1}function ut(e,t){return e.type===t.type&&e.key===t.key}const yo=({key:e})=>e??null,xn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?re(e)||fe(e)||q(e)?{i:de,r:e,k:t,f:!!n}:e:null);function vo(e,t=null,n=null,s=0,r=null,i=e===xe?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&yo(t),ref:t&&xn(t),scopeId:Ni,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:de};return l?(er(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=re(n)?8:16),Jt>0&&!o&&Ae&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ae.push(c),c}const ce=Fc;function Fc(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===Gi)&&(e=ve),zt(e)){const l=nt(e,t,!0);return n&&er(l,n),Jt>0&&!i&&Ae&&(l.shapeFlag&6?Ae[Ae.indexOf(e)]=l:Ae.push(l)),l.patchFlag=-2,l}if(Kc(e)&&(e=e.__vccOpts),t){t=Hc(t);let{class:l,style:c}=t;l&&!re(l)&&(t.class=js(l)),ne(c)&&(Ks(c)&&!W(c)&&(c=ae({},c)),t.style=Ds(c))}const o=re(e)?1:po(e)?128:Hi(e)?64:ne(e)?4:q(e)?2:0;return vo(e,t,n,s,r,o,i,!0)}function Hc(e){return e?Ks(e)||eo(e)?ae({},e):e:null}function nt(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:c}=e,f=t?$c(r||{},t):r,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:f,key:f&&yo(f),ref:t&&t.ref?n&&i?W(i)?i.concat(xn(t)):[i,xn(t)]:xn(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==xe?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&nt(e.ssContent),ssFallback:e.ssFallback&&nt(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&s&&Yt(a,c.clone(a)),a}function _o(e=" ",t=0){return ce(gt,null,e,t)}function Mf(e,t){const n=ce(kt,null,e);return n.staticCount=t,n}function Pf(e="",t=!1){return t?(Os(),Ms(ve,null,e)):ce(ve,null,e)}function Me(e){return e==null||typeof e=="boolean"?ce(ve):W(e)?ce(xe,null,e.slice()):zt(e)?et(e):ce(gt,null,String(e))}function et(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:nt(e)}function er(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(W(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),er(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!eo(t)?t._ctx=de:r===3&&de&&(de.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else q(t)?(t={default:t,_ctx:de},n=32):(t=String(t),s&64?(n=16,t=[_o(t)]):n=8);e.children=t,e.shapeFlag|=n}function $c(...e){const t={};for(let n=0;nue||de;let Ln,Ps;{const e=Hn(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};Ln=t("__VUE_INSTANCE_SETTERS__",n=>ue=n),Ps=t("__VUE_SSR_SETTERS__",n=>Mt=n)}const rn=e=>{const t=ue;return Ln(e),e.scope.on(),()=>{e.scope.off(),Ln(t)}},Rr=()=>{ue&&ue.scope.off(),Ln(null)};function bo(e){return e.vnode.shapeFlag&4}let Mt=!1;function Uc(e,t=!1,n=!1){t&&Ps(t);const{props:s,children:r}=e.vnode,i=bo(e);yc(e,s,i,t),wc(e,r,n);const o=i?kc(e,t):void 0;return t&&Ps(!1),o}function kc(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,lc);const{setup:s}=n;if(s){rt();const r=e.setupContext=s.length>1?So(e):null,i=rn(e),o=tn(s,e,0,[e.props,r]),l=oi(o);if(it(),i(),(l||e.sp)&&!pt(e)&&Xs(e),l){if(o.then(Rr,Rr),t)return o.then(c=>{Or(e,c,t)}).catch(c=>{nn(c,e,0)});e.asyncDep=o}else Or(e,o,t)}else wo(e,t)}function Or(e,t,n){q(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ne(t)&&(e.setupState=Mi(t)),wo(e,n)}let Mr;function wo(e,t,n){const s=e.type;if(!e.render){if(!t&&Mr&&!s.render){const r=s.template||Js(e).template;if(r){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=s,f=ae(ae({isCustomElement:i,delimiters:l},o),c);s.render=Mr(r,f)}}e.render=s.render||ke}{const r=rn(e);rt();try{ac(e)}finally{it(),r()}}}const Bc={get(e,t){return me(e,"get",""),e[t]}};function So(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,Bc),slots:e.slots,emit:e.emit,expose:t}}function Gn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Mi(wn(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Ut)return Ut[n](e)},has(t,n){return n in t||n in Ut}})):e.proxy}function Wc(e,t=!0){return q(e)?e.displayName||e.name:e.name||t&&e.__name}function Kc(e){return q(e)&&"__vccOpts"in e}const ie=(e,t)=>Fl(e,t,Mt);function Ls(e,t,n){const s=arguments.length;return s===2?ne(t)&&!W(t)?zt(t)?ce(e,null,[t]):ce(e,t):ce(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&zt(n)&&(n=[n]),ce(e,t,n))}const qc="3.5.13";/** +* @vue/runtime-dom v3.5.13 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Is;const Pr=typeof window<"u"&&window.trustedTypes;if(Pr)try{Is=Pr.createPolicy("vue",{createHTML:e=>e})}catch{}const xo=Is?e=>Is.createHTML(e):e=>e,Gc="http://www.w3.org/2000/svg",Yc="http://www.w3.org/1998/Math/MathML",qe=typeof document<"u"?document:null,Lr=qe&&qe.createElement("template"),Xc={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?qe.createElementNS(Gc,e):t==="mathml"?qe.createElementNS(Yc,e):n?qe.createElement(e,{is:n}):qe.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>qe.createTextNode(e),createComment:e=>qe.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>qe.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{Lr.innerHTML=xo(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=Lr.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},ze="transition",Ht="animation",Qt=Symbol("_vtc"),Eo={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Jc=ae({},ji,Eo),zc=e=>(e.displayName="Transition",e.props=Jc,e),Lf=zc((e,{slots:t})=>Ls(Kl,Qc(e),t)),ct=(e,t=[])=>{W(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ir=e=>e?W(e)?e.some(t=>t.length>1):e.length>1:!1;function Qc(e){const t={};for(const x in e)x in Eo||(t[x]=e[x]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:f=o,appearToClass:a=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:y=`${n}-leave-active`,leaveToClass:v=`${n}-leave-to`}=e,S=Zc(r),_=S&&S[0],K=S&&S[1],{onBeforeEnter:N,onEnter:j,onEnterCancelled:p,onLeave:g,onLeaveCancelled:O,onBeforeAppear:F=N,onAppear:$=j,onAppearCancelled:V=p}=t,R=(x,B,se,le)=>{x._enterCancelled=le,at(x,B?a:l),at(x,B?f:o),se&&se()},b=(x,B)=>{x._isLeaving=!1,at(x,h),at(x,v),at(x,y),B&&B()},I=x=>(B,se)=>{const le=x?$:j,U=()=>R(B,x,se);ct(le,[B,U]),Nr(()=>{at(B,x?c:i),Ke(B,x?a:l),Ir(le)||Fr(B,s,_,U)})};return ae(t,{onBeforeEnter(x){ct(N,[x]),Ke(x,i),Ke(x,o)},onBeforeAppear(x){ct(F,[x]),Ke(x,c),Ke(x,f)},onEnter:I(!1),onAppear:I(!0),onLeave(x,B){x._isLeaving=!0;const se=()=>b(x,B);Ke(x,h),x._enterCancelled?(Ke(x,y),Dr()):(Dr(),Ke(x,y)),Nr(()=>{x._isLeaving&&(at(x,h),Ke(x,v),Ir(g)||Fr(x,s,K,se))}),ct(g,[x,se])},onEnterCancelled(x){R(x,!1,void 0,!0),ct(p,[x])},onAppearCancelled(x){R(x,!0,void 0,!0),ct(V,[x])},onLeaveCancelled(x){b(x),ct(O,[x])}})}function Zc(e){if(e==null)return null;if(ne(e))return[os(e.enter),os(e.leave)];{const t=os(e);return[t,t]}}function os(e){return Jo(e)}function Ke(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[Qt]||(e[Qt]=new Set)).add(t)}function at(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[Qt];n&&(n.delete(t),n.size||(e[Qt]=void 0))}function Nr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let ea=0;function Fr(e,t,n,s){const r=e._endId=++ea,i=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=ta(e,t);if(!o)return s();const f=o+"end";let a=0;const h=()=>{e.removeEventListener(f,y),i()},y=v=>{v.target===e&&++a>=c&&h()};setTimeout(()=>{a(n[S]||"").split(", "),r=s(`${ze}Delay`),i=s(`${ze}Duration`),o=Hr(r,i),l=s(`${Ht}Delay`),c=s(`${Ht}Duration`),f=Hr(l,c);let a=null,h=0,y=0;t===ze?o>0&&(a=ze,h=o,y=i.length):t===Ht?f>0&&(a=Ht,h=f,y=c.length):(h=Math.max(o,f),a=h>0?o>f?ze:Ht:null,y=a?a===ze?i.length:c.length:0);const v=a===ze&&/\b(transform|all)(,|$)/.test(s(`${ze}Property`).toString());return{type:a,timeout:h,propCount:y,hasTransform:v}}function Hr(e,t){for(;e.length$r(n)+$r(e[s])))}function $r(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Dr(){return document.body.offsetHeight}function na(e,t,n){const s=e[Qt];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const jr=Symbol("_vod"),sa=Symbol("_vsh"),ra=Symbol(""),ia=/(^|;)\s*display\s*:/;function oa(e,t,n){const s=e.style,r=re(n);let i=!1;if(n&&!r){if(t)if(re(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&En(s,l,"")}else for(const o in t)n[o]==null&&En(s,o,"");for(const o in n)o==="display"&&(i=!0),En(s,o,n[o])}else if(r){if(t!==n){const o=s[ra];o&&(n+=";"+o),s.cssText=n,i=ia.test(n)}}else t&&e.removeAttribute("style");jr in e&&(e[jr]=i?s.display:"",e[sa]&&(s.display="none"))}const Vr=/\s*!important$/;function En(e,t,n){if(W(n))n.forEach(s=>En(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=la(e,t);Vr.test(n)?e.setProperty(st(s),n.replace(Vr,""),"important"):e[s]=n}}const Ur=["Webkit","Moz","ms"],ls={};function la(e,t){const n=ls[t];if(n)return n;let s=Le(t);if(s!=="filter"&&s in e)return ls[t]=s;s=Fn(s);for(let r=0;rcs||(ua.then(()=>cs=0),cs=Date.now());function ha(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;He(pa(s,n.value),t,5,[s])};return n.value=e,n.attached=da(),n}function pa(e,t){if(W(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const Gr=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,ga=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?na(e,s,o):t==="style"?oa(e,n,s):en(t)?Fs(t)||aa(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):ma(e,t,s,o))?(Wr(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Br(e,t,s,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!re(s))?Wr(e,Le(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),Br(e,t,s,o))};function ma(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&Gr(t)&&q(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return Gr(t)&&re(n)?!1:t in e}const Yr=e=>{const t=e.props["onUpdate:modelValue"]||!1;return W(t)?n=>bn(t,n):t};function ya(e){e.target.composing=!0}function Xr(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const as=Symbol("_assign"),If={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e[as]=Yr(r);const i=s||r.props&&r.props.type==="number";St(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=vs(l)),e[as](l)}),n&&St(e,"change",()=>{e.value=e.value.trim()}),t||(St(e,"compositionstart",ya),St(e,"compositionend",Xr),St(e,"change",Xr))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:i}},o){if(e[as]=Yr(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?vs(e.value):e.value,c=t??"";l!==c&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===c)||(e.value=c))}},va=["ctrl","shift","alt","meta"],_a={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>va.some(n=>e[`${n}Key`]&&!t.includes(n))},Nf=(e,t)=>{const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(r,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=r=>{if(!("key"in r))return;const i=st(r.key);if(t.some(o=>o===i||ba[o]===i))return e(r)})},To=ae({patchProp:ga},Xc);let Wt,Jr=!1;function wa(){return Wt||(Wt=xc(To))}function Sa(){return Wt=Jr?Wt:Ec(To),Jr=!0,Wt}const Hf=(...e)=>{const t=wa().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Ao(s);if(!r)return;const i=t._component;!q(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=n(r,!1,Co(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t},$f=(...e)=>{const t=Sa().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Ao(s);if(r)return n(r,!0,Co(r))},t};function Co(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Ao(e){return re(e)?document.querySelector(e):e}const Df=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n},xa=window.__VP_SITE_DATA__;function tr(e){return hi()?(il(e),!0):!1}function Be(e){return typeof e=="function"?e():Oi(e)}const Ro=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const jf=e=>e!=null,Ea=Object.prototype.toString,Ta=e=>Ea.call(e)==="[object Object]",Zt=()=>{},zr=Ca();function Ca(){var e,t;return Ro&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function Aa(e,t){function n(...s){return new Promise((r,i)=>{Promise.resolve(e(()=>t.apply(this,s),{fn:t,thisArg:this,args:s})).then(r).catch(i)})}return n}const Oo=e=>e();function Ra(e,t={}){let n,s,r=Zt;const i=l=>{clearTimeout(l),r(),r=Zt};return l=>{const c=Be(e),f=Be(t.maxWait);return n&&i(n),c<=0||f!==void 0&&f<=0?(s&&(i(s),s=null),Promise.resolve(l())):new Promise((a,h)=>{r=t.rejectOnCancel?h:a,f&&!s&&(s=setTimeout(()=>{n&&i(n),s=null,a(l())},f)),n=setTimeout(()=>{s&&i(s),s=null,a(l())},c)})}}function Oa(e=Oo){const t=oe(!0);function n(){t.value=!1}function s(){t.value=!0}const r=(...i)=>{t.value&&e(...i)};return{isActive:Vn(t),pause:n,resume:s,eventFilter:r}}function Ma(e){return qn()}function Mo(...e){if(e.length!==1)return Ll(...e);const t=e[0];return typeof t=="function"?Vn(Ol(()=>({get:t,set:Zt}))):oe(t)}function Po(e,t,n={}){const{eventFilter:s=Oo,...r}=n;return Fe(e,Aa(s,t),r)}function Pa(e,t,n={}){const{eventFilter:s,...r}=n,{eventFilter:i,pause:o,resume:l,isActive:c}=Oa(s);return{stop:Po(e,t,{...r,eventFilter:i}),pause:o,resume:l,isActive:c}}function nr(e,t=!0,n){Ma()?Lt(e,n):t?e():Un(e)}function Vf(e,t,n={}){const{debounce:s=0,maxWait:r=void 0,...i}=n;return Po(e,t,{...i,eventFilter:Ra(s,{maxWait:r})})}function Uf(e,t,n){let s;fe(n)?s={evaluating:n}:s={};const{lazy:r=!1,evaluating:i=void 0,shallow:o=!0,onError:l=Zt}=s,c=oe(!r),f=o?qs(t):oe(t);let a=0;return Zs(async h=>{if(!c.value)return;a++;const y=a;let v=!1;i&&Promise.resolve().then(()=>{i.value=!0});try{const S=await e(_=>{h(()=>{i&&(i.value=!1),v||_()})});y===a&&(f.value=S)}catch(S){l(S)}finally{i&&y===a&&(i.value=!1),v=!0}}),r?ie(()=>(c.value=!0,f.value)):f}const $e=Ro?window:void 0;function Lo(e){var t;const n=Be(e);return(t=n==null?void 0:n.$el)!=null?t:n}function Pt(...e){let t,n,s,r;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,s,r]=e,t=$e):[t,n,s,r]=e,!t)return Zt;Array.isArray(n)||(n=[n]),Array.isArray(s)||(s=[s]);const i=[],o=()=>{i.forEach(a=>a()),i.length=0},l=(a,h,y,v)=>(a.addEventListener(h,y,v),()=>a.removeEventListener(h,y,v)),c=Fe(()=>[Lo(t),Be(r)],([a,h])=>{if(o(),!a)return;const y=Ta(h)?{...h}:h;i.push(...n.flatMap(v=>s.map(S=>l(a,v,S,y))))},{immediate:!0,flush:"post"}),f=()=>{c(),o()};return tr(f),f}function La(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function kf(...e){let t,n,s={};e.length===3?(t=e[0],n=e[1],s=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],s=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:r=$e,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=s,c=La(t);return Pt(r,i,a=>{a.repeat&&Be(l)||c(a)&&n(a)},o)}function Ia(){const e=oe(!1),t=qn();return t&&Lt(()=>{e.value=!0},t),e}function Na(e){const t=Ia();return ie(()=>(t.value,!!e()))}function Io(e,t={}){const{window:n=$e}=t,s=Na(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let r;const i=oe(!1),o=f=>{i.value=f.matches},l=()=>{r&&("removeEventListener"in r?r.removeEventListener("change",o):r.removeListener(o))},c=Zs(()=>{s.value&&(l(),r=n.matchMedia(Be(e)),"addEventListener"in r?r.addEventListener("change",o):r.addListener(o),i.value=r.matches)});return tr(()=>{c(),l(),r=void 0}),i}const gn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},mn="__vueuse_ssr_handlers__",Fa=Ha();function Ha(){return mn in gn||(gn[mn]=gn[mn]||{}),gn[mn]}function No(e,t){return Fa[e]||t}function sr(e){return Io("(prefers-color-scheme: dark)",e)}function $a(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const Da={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},Qr="vueuse-storage";function rr(e,t,n,s={}){var r;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:f=!1,shallow:a,window:h=$e,eventFilter:y,onError:v=b=>{console.error(b)},initOnMounted:S}=s,_=(a?qs:oe)(typeof t=="function"?t():t);if(!n)try{n=No("getDefaultStorage",()=>{var b;return(b=$e)==null?void 0:b.localStorage})()}catch(b){v(b)}if(!n)return _;const K=Be(t),N=$a(K),j=(r=s.serializer)!=null?r:Da[N],{pause:p,resume:g}=Pa(_,()=>F(_.value),{flush:i,deep:o,eventFilter:y});h&&l&&nr(()=>{n instanceof Storage?Pt(h,"storage",V):Pt(h,Qr,R),S&&V()}),S||V();function O(b,I){if(h){const x={key:e,oldValue:b,newValue:I,storageArea:n};h.dispatchEvent(n instanceof Storage?new StorageEvent("storage",x):new CustomEvent(Qr,{detail:x}))}}function F(b){try{const I=n.getItem(e);if(b==null)O(I,null),n.removeItem(e);else{const x=j.write(b);I!==x&&(n.setItem(e,x),O(I,x))}}catch(I){v(I)}}function $(b){const I=b?b.newValue:n.getItem(e);if(I==null)return c&&K!=null&&n.setItem(e,j.write(K)),K;if(!b&&f){const x=j.read(I);return typeof f=="function"?f(x,K):N==="object"&&!Array.isArray(x)?{...K,...x}:x}else return typeof I!="string"?I:j.read(I)}function V(b){if(!(b&&b.storageArea!==n)){if(b&&b.key==null){_.value=K;return}if(!(b&&b.key!==e)){p();try{(b==null?void 0:b.newValue)!==j.write(_.value)&&(_.value=$(b))}catch(I){v(I)}finally{b?Un(g):g()}}}}function R(b){V(b.detail)}return _}const ja="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";function Va(e={}){const{selector:t="html",attribute:n="class",initialValue:s="auto",window:r=$e,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:f,disableTransition:a=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},y=sr({window:r}),v=ie(()=>y.value?"dark":"light"),S=c||(o==null?Mo(s):rr(o,s,i,{window:r,listenToStorageChanges:l})),_=ie(()=>S.value==="auto"?v.value:S.value),K=No("updateHTMLAttrs",(g,O,F)=>{const $=typeof g=="string"?r==null?void 0:r.document.querySelector(g):Lo(g);if(!$)return;const V=new Set,R=new Set;let b=null;if(O==="class"){const x=F.split(/\s/g);Object.values(h).flatMap(B=>(B||"").split(/\s/g)).filter(Boolean).forEach(B=>{x.includes(B)?V.add(B):R.add(B)})}else b={key:O,value:F};if(V.size===0&&R.size===0&&b===null)return;let I;a&&(I=r.document.createElement("style"),I.appendChild(document.createTextNode(ja)),r.document.head.appendChild(I));for(const x of V)$.classList.add(x);for(const x of R)$.classList.remove(x);b&&$.setAttribute(b.key,b.value),a&&(r.getComputedStyle(I).opacity,document.head.removeChild(I))});function N(g){var O;K(t,n,(O=h[g])!=null?O:g)}function j(g){e.onChanged?e.onChanged(g,N):N(g)}Fe(_,j,{flush:"post",immediate:!0}),nr(()=>j(_.value));const p=ie({get(){return f?S.value:_.value},set(g){S.value=g}});try{return Object.assign(p,{store:S,system:v,state:_})}catch{return p}}function Ua(e={}){const{valueDark:t="dark",valueLight:n="",window:s=$e}=e,r=Va({...e,onChanged:(l,c)=>{var f;e.onChanged?(f=e.onChanged)==null||f.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),i=ie(()=>r.system?r.system.value:sr({window:s}).value?"dark":"light");return ie({get(){return r.value==="dark"},set(l){const c=l?"dark":"light";i.value===c?r.value="auto":r.value=c}})}function fs(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function Bf(e,t,n={}){const{window:s=$e}=n;return rr(e,t,s==null?void 0:s.localStorage,n)}function Fo(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const us=new WeakMap;function Wf(e,t=!1){const n=oe(t);let s=null,r="";Fe(Mo(e),l=>{const c=fs(Be(l));if(c){const f=c;if(us.get(f)||us.set(f,f.style.overflow),f.style.overflow!=="hidden"&&(r=f.style.overflow),f.style.overflow==="hidden")return n.value=!0;if(n.value)return f.style.overflow="hidden"}},{immediate:!0});const i=()=>{const l=fs(Be(e));!l||n.value||(zr&&(s=Pt(l,"touchmove",c=>{ka(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=fs(Be(e));!l||!n.value||(zr&&(s==null||s()),l.style.overflow=r,us.delete(l),n.value=!1)};return tr(o),ie({get(){return n.value},set(l){l?i():o()}})}function Kf(e,t,n={}){const{window:s=$e}=n;return rr(e,t,s==null?void 0:s.sessionStorage,n)}function qf(e={}){const{window:t=$e,behavior:n="auto"}=e;if(!t)return{x:oe(0),y:oe(0)};const s=oe(t.scrollX),r=oe(t.scrollY),i=ie({get(){return s.value},set(l){scrollTo({left:l,behavior:n})}}),o=ie({get(){return r.value},set(l){scrollTo({top:l,behavior:n})}});return Pt(t,"scroll",()=>{s.value=t.scrollX,r.value=t.scrollY},{capture:!1,passive:!0}),{x:i,y:o}}function Gf(e={}){const{window:t=$e,initialWidth:n=Number.POSITIVE_INFINITY,initialHeight:s=Number.POSITIVE_INFINITY,listenOrientation:r=!0,includeScrollbar:i=!0,type:o="inner"}=e,l=oe(n),c=oe(s),f=()=>{t&&(o==="outer"?(l.value=t.outerWidth,c.value=t.outerHeight):i?(l.value=t.innerWidth,c.value=t.innerHeight):(l.value=t.document.documentElement.clientWidth,c.value=t.document.documentElement.clientHeight))};if(f(),nr(f),Pt("resize",f,{passive:!0}),r){const a=Io("(orientation: portrait)");Fe(a,()=>f())}return{width:l,height:c}}const ds={BASE_URL:"/",DEV:!1,MODE:"production",PROD:!0,SSR:!1};var hs={};const Ho=/^(?:[a-z]+:|\/\/)/i,Ba="vitepress-theme-appearance",Wa=/#.*$/,Ka=/[?#].*$/,qa=/(?:(^|\/)index)?\.(?:md|html)$/,ge=typeof document<"u",$o={relativePath:"404.md",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function Ga(e,t,n=!1){if(t===void 0)return!1;if(e=Zr(`/${e}`),n)return new RegExp(t).test(e);if(Zr(t)!==e)return!1;const s=t.match(Wa);return s?(ge?location.hash:"")===s[0]:!0}function Zr(e){return decodeURI(e).replace(Ka,"").replace(qa,"$1")}function Ya(e){return Ho.test(e)}function Xa(e,t){return Object.keys((e==null?void 0:e.locales)||{}).find(n=>n!=="root"&&!Ya(n)&&Ga(t,`/${n}/`,!0))||"root"}function Ja(e,t){var s,r,i,o,l,c,f;const n=Xa(e,t);return Object.assign({},e,{localeIndex:n,lang:((s=e.locales[n])==null?void 0:s.lang)??e.lang,dir:((r=e.locales[n])==null?void 0:r.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:jo(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(f=e.locales[n])==null?void 0:f.themeConfig}})}function Do(e,t){const n=t.title||e.title,s=t.titleTemplate??e.titleTemplate;if(typeof s=="string"&&s.includes(":title"))return s.replace(/:title/g,n);const r=za(e.title,s);return n===r.slice(3)?n:`${n}${r}`}function za(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function Qa(e,t){const[n,s]=t;if(n!=="meta")return!1;const r=Object.entries(s)[0];return r==null?!1:e.some(([i,o])=>i===n&&o[r[0]]===r[1])}function jo(e,t){return[...e.filter(n=>!Qa(t,n)),...t]}const Za=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,ef=/^[a-z]:/i;function ei(e){const t=ef.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(Za,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const ps=new Set;function tf(e){if(ps.size===0){const n=typeof process=="object"&&(hs==null?void 0:hs.VITE_EXTRA_EXTENSIONS)||(ds==null?void 0:ds.VITE_EXTRA_EXTENSIONS)||"";("3g2,3gp,aac,ai,apng,au,avif,bin,bmp,cer,class,conf,crl,css,csv,dll,doc,eps,epub,exe,gif,gz,ics,ief,jar,jpe,jpeg,jpg,js,json,jsonld,m4a,man,mid,midi,mjs,mov,mp2,mp3,mp4,mpe,mpeg,mpg,mpp,oga,ogg,ogv,ogx,opus,otf,p10,p7c,p7m,p7s,pdf,png,ps,qt,roff,rtf,rtx,ser,svg,t,tif,tiff,tr,ts,tsv,ttf,txt,vtt,wav,weba,webm,webp,woff,woff2,xhtml,xml,yaml,yml,zip"+(n&&typeof n=="string"?","+n:"")).split(",").forEach(s=>ps.add(s))}const t=e.split(".").pop();return t==null||!ps.has(t.toLowerCase())}function Yf(e){return e.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")}const nf=Symbol(),mt=qs(xa);function Xf(e){const t=ie(()=>Ja(mt.value,e.data.relativePath)),n=t.value.appearance,s=n==="force-dark"?oe(!0):n==="force-auto"?sr():n?Ua({storageKey:Ba,initialValue:()=>n==="dark"?"dark":"auto",...typeof n=="object"?n:{}}):oe(!1),r=oe(ge?location.hash:"");return ge&&window.addEventListener("hashchange",()=>{r.value=location.hash}),Fe(()=>e.data,()=>{r.value=ge?location.hash:""}),{site:t,theme:ie(()=>t.value.themeConfig),page:ie(()=>e.data),frontmatter:ie(()=>e.data.frontmatter),params:ie(()=>e.data.params),lang:ie(()=>t.value.lang),dir:ie(()=>e.data.frontmatter.dir||t.value.dir),localeIndex:ie(()=>t.value.localeIndex||"root"),title:ie(()=>Do(t.value,e.data)),description:ie(()=>e.data.description||t.value.description),isDark:s,hash:ie(()=>r.value)}}function sf(){const e=Ot(nf);if(!e)throw new Error("vitepress data not properly injected in app");return e}function rf(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function ti(e){return Ho.test(e)||!e.startsWith("/")?e:rf(mt.value.base,e)}function of(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),ge){const n="/";t=ei(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let s=__VP_HASH_MAP__[t.toLowerCase()];if(s||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",s=__VP_HASH_MAP__[t.toLowerCase()]),!s)return null;t=`${n}assets/${t}.${s}.js`}else t=`./${ei(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let Tn=[];function Jf(e){Tn.push(e),Bn(()=>{Tn=Tn.filter(t=>t!==e)})}function lf(){let e=mt.value.scrollOffset,t=0,n=24;if(typeof e=="object"&&"padding"in e&&(n=e.padding,e=e.selector),typeof e=="number")t=e;else if(typeof e=="string")t=ni(e,n);else if(Array.isArray(e))for(const s of e){const r=ni(s,n);if(r){t=r;break}}return t}function ni(e,t){const n=document.querySelector(e);if(!n)return 0;const s=n.getBoundingClientRect().bottom;return s<0?0:s+t}const cf=Symbol(),Vo="http://a.com",af=()=>({path:"/",component:null,data:$o});function zf(e,t){const n=jn(af()),s={route:n,go:r};async function r(l=ge?location.href:"/"){var c,f;l=gs(l),await((c=s.onBeforeRouteChange)==null?void 0:c.call(s,l))!==!1&&(ge&&l!==gs(location.href)&&(history.replaceState({scrollPosition:window.scrollY},""),history.pushState({},"",l)),await o(l),await((f=s.onAfterRouteChanged)==null?void 0:f.call(s,l)))}let i=null;async function o(l,c=0,f=!1){var y,v;if(await((y=s.onBeforePageLoad)==null?void 0:y.call(s,l))===!1)return;const a=new URL(l,Vo),h=i=a.pathname;try{let S=await e(h);if(!S)throw new Error(`Page not found: ${h}`);if(i===h){i=null;const{default:_,__pageData:K}=S;if(!_)throw new Error(`Invalid route component: ${_}`);await((v=s.onAfterPageLoad)==null?void 0:v.call(s,l)),n.path=ge?h:ti(h),n.component=wn(_),n.data=wn(K),ge&&Un(()=>{let N=mt.value.base+K.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!mt.value.cleanUrls&&!N.endsWith("/")&&(N+=".html"),N!==a.pathname&&(a.pathname=N,l=N+a.search+a.hash,history.replaceState({},"",l)),a.hash&&!c){let j=null;try{j=document.getElementById(decodeURIComponent(a.hash).slice(1))}catch(p){console.warn(p)}if(j){si(j,a.hash);return}}window.scrollTo(0,c)})}}catch(S){if(!/fetch|Page not found/.test(S.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(S),!f)try{const _=await fetch(mt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await _.json(),await o(l,c,!0);return}catch{}if(i===h){i=null,n.path=ge?h:ti(h),n.component=t?wn(t):null;const _=ge?h.replace(/(^|\/)$/,"$1index").replace(/(\.html)?$/,".md").replace(/^\//,""):"404.md";n.data={...$o,relativePath:_}}}}return ge&&(history.state===null&&history.replaceState({},""),window.addEventListener("click",l=>{if(l.defaultPrevented||!(l.target instanceof Element)||l.target.closest("button")||l.button!==0||l.ctrlKey||l.shiftKey||l.altKey||l.metaKey)return;const c=l.target.closest("a");if(!c||c.closest(".vp-raw")||c.hasAttribute("download")||c.hasAttribute("target"))return;const f=c.getAttribute("href")??(c instanceof SVGAElement?c.getAttribute("xlink:href"):null);if(f==null)return;const{href:a,origin:h,pathname:y,hash:v,search:S}=new URL(f,c.baseURI),_=new URL(location.href);h===_.origin&&tf(y)&&(l.preventDefault(),y===_.pathname&&S===_.search?(v!==_.hash&&(history.pushState({},"",a),window.dispatchEvent(new HashChangeEvent("hashchange",{oldURL:_.href,newURL:a}))),v?si(c,v,c.classList.contains("header-anchor")):window.scrollTo(0,0)):r(a))},{capture:!0}),window.addEventListener("popstate",async l=>{var c;l.state!==null&&(await o(gs(location.href),l.state&&l.state.scrollPosition||0),(c=s.onAfterRouteChanged)==null||c.call(s,location.href))}),window.addEventListener("hashchange",l=>{l.preventDefault()})),s}function ff(){const e=Ot(cf);if(!e)throw new Error("useRouter() is called without provider.");return e}function Uo(){return ff().route}function si(e,t,n=!1){let s=null;try{s=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(r){console.warn(r)}if(s){let r=function(){!n||Math.abs(o-window.scrollY)>window.innerHeight?window.scrollTo(0,o):window.scrollTo({left:0,top:o,behavior:"smooth"})};const i=parseInt(window.getComputedStyle(s).paddingTop,10),o=window.scrollY+s.getBoundingClientRect().top-lf()+i;requestAnimationFrame(r)}}function gs(e){const t=new URL(e,Vo);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),mt.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const yn=()=>Tn.forEach(e=>e()),Qf=Ys({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Uo(),{frontmatter:n,site:s}=sf();return Fe(n,yn,{deep:!0,flush:"post"}),()=>Ls(e.as,s.value.contentProps??{style:{position:"relative"}},[t.component?Ls(t.component,{onVnodeMounted:yn,onVnodeUpdated:yn,onVnodeUnmounted:yn}):"404 Page Not Found"])}}),uf="modulepreload",df=function(e){return"/"+e},ri={},Zf=function(t,n,s){let r=Promise.resolve();if(n&&n.length>0){document.getElementsByTagName("link");const o=document.querySelector("meta[property=csp-nonce]"),l=(o==null?void 0:o.nonce)||(o==null?void 0:o.getAttribute("nonce"));r=Promise.allSettled(n.map(c=>{if(c=df(c),c in ri)return;ri[c]=!0;const f=c.endsWith(".css"),a=f?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${c}"]${a}`))return;const h=document.createElement("link");if(h.rel=f?"stylesheet":uf,f||(h.as="script"),h.crossOrigin="",h.href=c,l&&h.setAttribute("nonce",l),document.head.appendChild(h),f)return new Promise((y,v)=>{h.addEventListener("load",y),h.addEventListener("error",()=>v(new Error(`Unable to preload CSS for ${c}`)))})}))}function i(o){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=o,window.dispatchEvent(l),!l.defaultPrevented)throw o}return r.then(o=>{for(const l of o||[])l.status==="rejected"&&i(l.reason);return t().catch(i)})},eu=Ys({setup(e,{slots:t}){const n=oe(!1);return Lt(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function tu(){ge&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const s=(n=t.parentElement)==null?void 0:n.parentElement;if(!s)return;const r=Array.from(s.querySelectorAll("input")).indexOf(t);if(r<0)return;const i=s.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(f=>f.classList.contains("active"));if(!o)return;const l=i.children[r];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=s==null?void 0:s.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function nu(){if(ge){const e=new WeakMap;window.addEventListener("click",t=>{var s;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const r=n.parentElement,i=(s=n.nextElementSibling)==null?void 0:s.nextElementSibling;if(!r||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(r.className),l=[".vp-copy-ignore",".diff.remove"],c=i.cloneNode(!0);c.querySelectorAll(l.join(",")).forEach(a=>a.remove());let f=c.textContent||"";o&&(f=f.replace(/^ *(\$|>) /gm,"").trim()),hf(f).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const a=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,a)})}})}}async function hf(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const s=document.getSelection(),r=s?s.rangeCount>0&&s.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),r&&(s.removeAllRanges(),s.addRange(r)),n&&n.focus()}}function su(e,t){let n=!0,s=[];const r=i=>{if(n){n=!1,i.forEach(l=>{const c=ms(l);for(const f of document.head.children)if(f.isEqualNode(c)){s.push(f);return}});return}const o=i.map(ms);s.forEach((l,c)=>{const f=o.findIndex(a=>a==null?void 0:a.isEqualNode(l??null));f!==-1?delete o[f]:(l==null||l.remove(),delete s[c])}),o.forEach(l=>l&&document.head.appendChild(l)),s=[...s,...o].filter(Boolean)};Zs(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[],f=Do(o,i);f!==document.title&&(document.title=f);const a=l||o.description;let h=document.querySelector("meta[name=description]");h?h.getAttribute("content")!==a&&h.setAttribute("content",a):ms(["meta",{name:"description",content:a}]),r(jo(o.head,gf(c)))})}function ms([e,t,n]){const s=document.createElement(e);for(const r in t)s.setAttribute(r,t[r]);return n&&(s.innerHTML=n),e==="script"&&t.async==null&&(s.async=!1),s}function pf(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function gf(e){return e.filter(t=>!pf(t))}const ys=new Set,ko=()=>document.createElement("link"),mf=e=>{const t=ko();t.rel="prefetch",t.href=e,document.head.appendChild(t)},yf=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let vn;const vf=ge&&(vn=ko())&&vn.relList&&vn.relList.supports&&vn.relList.supports("prefetch")?mf:yf;function ru(){if(!ge||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const s=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!ys.has(c)){ys.add(c);const f=of(c);f&&vf(f)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):ys.add(l))})})};Lt(s);const r=Uo();Fe(()=>r.path,s),Bn(()=>{n&&n.disconnect()})}export{Ki as $,lf as A,Sf as B,Ef as C,qs as D,Jf as E,xe as F,ce as G,xf as H,Ho as I,Uo as J,$c as K,Ot as L,Gf as M,Ds as N,kf as O,Un as P,qf as Q,ge as R,Vn as S,Lf as T,wf as U,Zf as V,Wf as W,mc as X,Ff as Y,Cf as Z,Df as _,_o as a,Nf as a0,Af as a1,Mf as a2,su as a3,cf as a4,Xf as a5,nf as a6,Qf as a7,eu as a8,mt as a9,$f as aa,zf as ab,of as ac,ru as ad,nu as ae,tu as af,Ls as ag,Be as ah,Lo as ai,jf as aj,tr as ak,Uf as al,Kf as am,Bf as an,Vf as ao,ff as ap,Pt as aq,_f as ar,If as as,fe as at,bf as au,wn as av,Hf as aw,Yf as ax,Ms as b,Of as c,Ys as d,Pf as e,tf as f,ti as g,ie as h,Ya as i,vo as j,Oi as k,Ga as l,Io as m,js as n,Os as o,oe as p,Fe as q,Tf as r,Zs as s,sl as t,sf as u,Lt as v,Ul as w,Bn as x,Rf as y,nc as z}; diff --git a/assets/chunks/theme.Cb3KoOiM.js b/assets/chunks/theme.Cb3KoOiM.js new file mode 100644 index 00000000..cdf892fd --- /dev/null +++ b/assets/chunks/theme.Cb3KoOiM.js @@ -0,0 +1,2 @@ +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/chunks/VPLocalSearchBox.Blc1mzWh.js","assets/chunks/framework.BQmytedh.js"])))=>i.map(i=>d[i]); +import{d as m,o as a,c as u,r as c,n as M,a as z,t as I,b as k,w as p,e as h,T as ue,_ as g,u as He,i as Be,f as Ee,g as de,h as y,j as d,k as r,l as K,m as ae,p as T,q as D,s as Y,v as j,x as ve,y as pe,z as Fe,A as De,B as W,F as w,C as H,D as $e,E as Q,G as _,H as E,I as ye,J as Z,K as U,L as x,M as Oe,N as Pe,O as re,P as Le,Q as Ve,R as ee,S as Ge,U as Ue,V as je,W as Se,X as Te,Y as ze,Z as Ke,$ as We,a0 as qe,a1 as Re}from"./framework.BQmytedh.js";const Je=m({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(s){return(e,t)=>(a(),u("span",{class:M(["VPBadge",e.type])},[c(e.$slots,"default",{},()=>[z(I(e.text),1)])],2))}}),Xe={key:0,class:"VPBackdrop"},Ye=m({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(s){return(e,t)=>(a(),k(ue,{name:"fade"},{default:p(()=>[e.show?(a(),u("div",Xe)):h("",!0)]),_:1}))}}),Qe=g(Ye,[["__scopeId","data-v-54a304ca"]]),L=He;function Ze(s,e){let t,o=!1;return()=>{t&&clearTimeout(t),o?t=setTimeout(s,e):(s(),(o=!0)&&setTimeout(()=>o=!1,e))}}function ie(s){return/^\//.test(s)?s:`/${s}`}function fe(s){const{pathname:e,search:t,hash:o,protocol:n}=new URL(s,"http://a.com");if(Be(s)||s.startsWith("#")||!n.startsWith("http")||!Ee(e))return s;const{site:i}=L(),l=e.endsWith("/")||e.endsWith(".html")?s:s.replace(/(?:(^\.+)\/)?.*$/,`$1${e.replace(/(\.md)?$/,i.value.cleanUrls?"":".html")}${t}${o}`);return de(l)}function R({correspondingLink:s=!1}={}){const{site:e,localeIndex:t,page:o,theme:n,hash:i}=L(),l=y(()=>{var v,$;return{label:(v=e.value.locales[t.value])==null?void 0:v.label,link:(($=e.value.locales[t.value])==null?void 0:$.link)||(t.value==="root"?"/":`/${t.value}/`)}});return{localeLinks:y(()=>Object.entries(e.value.locales).flatMap(([v,$])=>l.value.label===$.label?[]:{text:$.label,link:xe($.link||(v==="root"?"/":`/${v}/`),n.value.i18nRouting!==!1&&s,o.value.relativePath.slice(l.value.link.length-1),!e.value.cleanUrls)+i.value})),currentLang:l}}function xe(s,e,t,o){return e?s.replace(/\/$/,"")+ie(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,o?".html":"")):s}const et={class:"NotFound"},tt={class:"code"},nt={class:"title"},ot={class:"quote"},st={class:"action"},at=["href","aria-label"],rt=m({__name:"NotFound",setup(s){const{theme:e}=L(),{currentLang:t}=R();return(o,n)=>{var i,l,f,v,$;return a(),u("div",et,[d("p",tt,I(((i=r(e).notFound)==null?void 0:i.code)??"404"),1),d("h1",nt,I(((l=r(e).notFound)==null?void 0:l.title)??"PAGE NOT FOUND"),1),n[0]||(n[0]=d("div",{class:"divider"},null,-1)),d("blockquote",ot,I(((f=r(e).notFound)==null?void 0:f.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),d("div",st,[d("a",{class:"link",href:r(de)(r(t).link),"aria-label":((v=r(e).notFound)==null?void 0:v.linkLabel)??"go to home"},I((($=r(e).notFound)==null?void 0:$.linkText)??"Take me home"),9,at)])])}}}),it=g(rt,[["__scopeId","data-v-6ff51ddd"]]);function Ne(s,e){if(Array.isArray(s))return J(s);if(s==null)return[];e=ie(e);const t=Object.keys(s).sort((n,i)=>i.split("/").length-n.split("/").length).find(n=>e.startsWith(ie(n))),o=t?s[t]:[];return Array.isArray(o)?J(o):J(o.items,o.base)}function lt(s){const e=[];let t=0;for(const o in s){const n=s[o];if(n.items){t=e.push(n);continue}e[t]||e.push({items:[]}),e[t].items.push(n)}return e}function ct(s){const e=[];function t(o){for(const n of o)n.text&&n.link&&e.push({text:n.text,link:n.link,docFooterText:n.docFooterText}),n.items&&t(n.items)}return t(s),e}function le(s,e){return Array.isArray(e)?e.some(t=>le(s,t)):K(s,e.link)?!0:e.items?le(s,e.items):!1}function J(s,e){return[...s].map(t=>{const o={...t},n=o.base||e;return n&&o.link&&(o.link=n+o.link),o.items&&(o.items=J(o.items,n)),o})}function O(){const{frontmatter:s,page:e,theme:t}=L(),o=ae("(min-width: 960px)"),n=T(!1),i=y(()=>{const C=t.value.sidebar,S=e.value.relativePath;return C?Ne(C,S):[]}),l=T(i.value);D(i,(C,S)=>{JSON.stringify(C)!==JSON.stringify(S)&&(l.value=i.value)});const f=y(()=>s.value.sidebar!==!1&&l.value.length>0&&s.value.layout!=="home"),v=y(()=>$?s.value.aside==null?t.value.aside==="left":s.value.aside==="left":!1),$=y(()=>s.value.layout==="home"?!1:s.value.aside!=null?!!s.value.aside:t.value.aside!==!1),V=y(()=>f.value&&o.value),b=y(()=>f.value?lt(l.value):[]);function P(){n.value=!0}function N(){n.value=!1}function A(){n.value?N():P()}return{isOpen:n,sidebar:l,sidebarGroups:b,hasSidebar:f,hasAside:$,leftAside:v,isSidebarEnabled:V,open:P,close:N,toggle:A}}function ut(s,e){let t;Y(()=>{t=s.value?document.activeElement:void 0}),j(()=>{window.addEventListener("keyup",o)}),ve(()=>{window.removeEventListener("keyup",o)});function o(n){n.key==="Escape"&&s.value&&(e(),t==null||t.focus())}}function dt(s){const{page:e,hash:t}=L(),o=T(!1),n=y(()=>s.value.collapsed!=null),i=y(()=>!!s.value.link),l=T(!1),f=()=>{l.value=K(e.value.relativePath,s.value.link)};D([e,s,t],f),j(f);const v=y(()=>l.value?!0:s.value.items?le(e.value.relativePath,s.value.items):!1),$=y(()=>!!(s.value.items&&s.value.items.length));Y(()=>{o.value=!!(n.value&&s.value.collapsed)}),pe(()=>{(l.value||v.value)&&(o.value=!1)});function V(){n.value&&(o.value=!o.value)}return{collapsed:o,collapsible:n,isLink:i,isActiveLink:l,hasActiveLink:v,hasChildren:$,toggle:V}}function vt(){const{hasSidebar:s}=O(),e=ae("(min-width: 960px)"),t=ae("(min-width: 1280px)");return{isAsideEnabled:y(()=>!t.value&&!e.value?!1:s.value?t.value:e.value)}}const ce=[];function Me(s){return typeof s.outline=="object"&&!Array.isArray(s.outline)&&s.outline.label||s.outlineTitle||"On this page"}function he(s){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const o=Number(t.tagName[1]);return{element:t,title:pt(t),link:"#"+t.id,level:o}});return ft(e,s)}function pt(s){let e="";for(const t of s.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor")||t.classList.contains("ignore-header"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function ft(s,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[o,n]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;return _t(s,o,n)}function ht(s,e){const{isAsideEnabled:t}=vt(),o=Ze(i,100);let n=null;j(()=>{requestAnimationFrame(i),window.addEventListener("scroll",o)}),Fe(()=>{l(location.hash)}),ve(()=>{window.removeEventListener("scroll",o)});function i(){if(!t.value)return;const f=window.scrollY,v=window.innerHeight,$=document.body.offsetHeight,V=Math.abs(f+v-$)<1,b=ce.map(({element:N,link:A})=>({link:A,top:mt(N)})).filter(({top:N})=>!Number.isNaN(N)).sort((N,A)=>N.top-A.top);if(!b.length){l(null);return}if(f<1){l(null);return}if(V){l(b[b.length-1].link);return}let P=null;for(const{link:N,top:A}of b){if(A>f+De()+4)break;P=N}l(P)}function l(f){n&&n.classList.remove("active"),f==null?n=null:n=s.value.querySelector(`a[href="${decodeURIComponent(f)}"]`);const v=n;v?(v.classList.add("active"),e.value.style.top=v.offsetTop+39+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function mt(s){let e=0;for(;s!==document.body;){if(s===null)return NaN;e+=s.offsetTop,s=s.offsetParent}return e}function _t(s,e,t){ce.length=0;const o=[],n=[];return s.forEach(i=>{const l={...i,children:[]};let f=n[n.length-1];for(;f&&f.level>=l.level;)n.pop(),f=n[n.length-1];if(l.element.classList.contains("ignore-header")||f&&"shouldIgnore"in f){n.push({level:l.level,shouldIgnore:!0});return}l.level>t||l.level{const n=W("VPDocOutlineItem",!0);return a(),u("ul",{class:M(["VPDocOutlineItem",t.root?"root":"nested"])},[(a(!0),u(w,null,H(t.headers,({children:i,link:l,title:f})=>(a(),u("li",null,[d("a",{class:"outline-link",href:l,onClick:e,title:f},I(f),9,kt),i!=null&&i.length?(a(),k(n,{key:0,headers:i},null,8,["headers"])):h("",!0)]))),256))],2)}}}),Ie=g(bt,[["__scopeId","data-v-53c99d69"]]),gt={class:"content"},$t={"aria-level":"2",class:"outline-title",id:"doc-outline-aria-label",role:"heading"},yt=m({__name:"VPDocAsideOutline",setup(s){const{frontmatter:e,theme:t}=L(),o=$e([]);Q(()=>{o.value=he(e.value.outline??t.value.outline)});const n=T(),i=T();return ht(n,i),(l,f)=>(a(),u("nav",{"aria-labelledby":"doc-outline-aria-label",class:M(["VPDocAsideOutline",{"has-outline":o.value.length>0}]),ref_key:"container",ref:n},[d("div",gt,[d("div",{class:"outline-marker",ref_key:"marker",ref:i},null,512),d("div",$t,I(r(Me)(r(t))),1),_(Ie,{headers:o.value,root:!0},null,8,["headers"])])],2))}}),Pt=g(yt,[["__scopeId","data-v-f610f197"]]),Lt={class:"VPDocAsideCarbonAds"},Vt=m({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(s){const e=()=>null;return(t,o)=>(a(),u("div",Lt,[_(r(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),St={class:"VPDocAside"},Tt=m({__name:"VPDocAside",setup(s){const{theme:e}=L();return(t,o)=>(a(),u("div",St,[c(t.$slots,"aside-top",{},void 0,!0),c(t.$slots,"aside-outline-before",{},void 0,!0),_(Pt),c(t.$slots,"aside-outline-after",{},void 0,!0),o[0]||(o[0]=d("div",{class:"spacer"},null,-1)),c(t.$slots,"aside-ads-before",{},void 0,!0),r(e).carbonAds?(a(),k(Vt,{key:0,"carbon-ads":r(e).carbonAds},null,8,["carbon-ads"])):h("",!0),c(t.$slots,"aside-ads-after",{},void 0,!0),c(t.$slots,"aside-bottom",{},void 0,!0)]))}}),Nt=g(Tt,[["__scopeId","data-v-cb998dce"]]);function Mt(){const{theme:s,page:e}=L();return y(()=>{const{text:t="Edit this page",pattern:o=""}=s.value.editLink||{};let n;return typeof o=="function"?n=o(e.value):n=o.replace(/:path/g,e.value.filePath),{url:n,text:t}})}function It(){const{page:s,theme:e,frontmatter:t}=L();return y(()=>{var $,V,b,P,N,A,C,S;const o=Ne(e.value.sidebar,s.value.relativePath),n=ct(o),i=wt(n,B=>B.link.replace(/[?#].*$/,"")),l=i.findIndex(B=>K(s.value.relativePath,B.link)),f=(($=e.value.docFooter)==null?void 0:$.prev)===!1&&!t.value.prev||t.value.prev===!1,v=((V=e.value.docFooter)==null?void 0:V.next)===!1&&!t.value.next||t.value.next===!1;return{prev:f?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((b=i[l-1])==null?void 0:b.docFooterText)??((P=i[l-1])==null?void 0:P.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((N=i[l-1])==null?void 0:N.link)},next:v?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((A=i[l+1])==null?void 0:A.docFooterText)??((C=i[l+1])==null?void 0:C.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((S=i[l+1])==null?void 0:S.link)}}})}function wt(s,e){const t=new Set;return s.filter(o=>{const n=e(o);return t.has(n)?!1:t.add(n)})}const F=m({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(s){const e=s,t=y(()=>e.tag??(e.href?"a":"span")),o=y(()=>e.href&&ye.test(e.href)||e.target==="_blank");return(n,i)=>(a(),k(E(t.value),{class:M(["VPLink",{link:n.href,"vp-external-link-icon":o.value,"no-icon":n.noIcon}]),href:n.href?r(fe)(n.href):void 0,target:n.target??(o.value?"_blank":void 0),rel:n.rel??(o.value?"noreferrer":void 0)},{default:p(()=>[c(n.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),At={class:"VPLastUpdated"},Ct=["datetime"],Ht=m({__name:"VPDocFooterLastUpdated",setup(s){const{theme:e,page:t,lang:o}=L(),n=y(()=>new Date(t.value.lastUpdated)),i=y(()=>n.value.toISOString()),l=T("");return j(()=>{Y(()=>{var f,v,$;l.value=new Intl.DateTimeFormat((v=(f=e.value.lastUpdated)==null?void 0:f.formatOptions)!=null&&v.forceLocale?o.value:void 0,(($=e.value.lastUpdated)==null?void 0:$.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(n.value)})}),(f,v)=>{var $;return a(),u("p",At,[z(I((($=r(e).lastUpdated)==null?void 0:$.text)||r(e).lastUpdatedText||"Last updated")+": ",1),d("time",{datetime:i.value},I(l.value),9,Ct)])}}}),Bt=g(Ht,[["__scopeId","data-v-1bb0c8a8"]]),Et={key:0,class:"VPDocFooter"},Ft={key:0,class:"edit-info"},Dt={key:0,class:"edit-link"},Ot={key:1,class:"last-updated"},Gt={key:1,class:"prev-next","aria-labelledby":"doc-footer-aria-label"},Ut={class:"pager"},jt=["innerHTML"],zt=["innerHTML"],Kt={class:"pager"},Wt=["innerHTML"],qt=["innerHTML"],Rt=m({__name:"VPDocFooter",setup(s){const{theme:e,page:t,frontmatter:o}=L(),n=Mt(),i=It(),l=y(()=>e.value.editLink&&o.value.editLink!==!1),f=y(()=>t.value.lastUpdated),v=y(()=>l.value||f.value||i.value.prev||i.value.next);return($,V)=>{var b,P,N,A;return v.value?(a(),u("footer",Et,[c($.$slots,"doc-footer-before",{},void 0,!0),l.value||f.value?(a(),u("div",Ft,[l.value?(a(),u("div",Dt,[_(F,{class:"edit-link-button",href:r(n).url,"no-icon":!0},{default:p(()=>[V[0]||(V[0]=d("span",{class:"vpi-square-pen edit-link-icon"},null,-1)),z(" "+I(r(n).text),1)]),_:1},8,["href"])])):h("",!0),f.value?(a(),u("div",Ot,[_(Bt)])):h("",!0)])):h("",!0),(b=r(i).prev)!=null&&b.link||(P=r(i).next)!=null&&P.link?(a(),u("nav",Gt,[V[1]||(V[1]=d("span",{class:"visually-hidden",id:"doc-footer-aria-label"},"Pager",-1)),d("div",Ut,[(N=r(i).prev)!=null&&N.link?(a(),k(F,{key:0,class:"pager-link prev",href:r(i).prev.link},{default:p(()=>{var C;return[d("span",{class:"desc",innerHTML:((C=r(e).docFooter)==null?void 0:C.prev)||"Previous page"},null,8,jt),d("span",{class:"title",innerHTML:r(i).prev.text},null,8,zt)]}),_:1},8,["href"])):h("",!0)]),d("div",Kt,[(A=r(i).next)!=null&&A.link?(a(),k(F,{key:0,class:"pager-link next",href:r(i).next.link},{default:p(()=>{var C;return[d("span",{class:"desc",innerHTML:((C=r(e).docFooter)==null?void 0:C.next)||"Next page"},null,8,Wt),d("span",{class:"title",innerHTML:r(i).next.text},null,8,qt)]}),_:1},8,["href"])):h("",!0)])])):h("",!0)])):h("",!0)}}}),Jt=g(Rt,[["__scopeId","data-v-1bcd8184"]]),Xt={class:"container"},Yt={class:"aside-container"},Qt={class:"aside-content"},Zt={class:"content"},xt={class:"content-container"},en={class:"main"},tn=m({__name:"VPDoc",setup(s){const{theme:e}=L(),t=Z(),{hasSidebar:o,hasAside:n,leftAside:i}=O(),l=y(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(f,v)=>{const $=W("Content");return a(),u("div",{class:M(["VPDoc",{"has-sidebar":r(o),"has-aside":r(n)}])},[c(f.$slots,"doc-top",{},void 0,!0),d("div",Xt,[r(n)?(a(),u("div",{key:0,class:M(["aside",{"left-aside":r(i)}])},[v[0]||(v[0]=d("div",{class:"aside-curtain"},null,-1)),d("div",Yt,[d("div",Qt,[_(Nt,null,{"aside-top":p(()=>[c(f.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[c(f.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[c(f.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[c(f.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[c(f.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[c(f.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):h("",!0),d("div",Zt,[d("div",xt,[c(f.$slots,"doc-before",{},void 0,!0),d("main",en,[_($,{class:M(["vp-doc",[l.value,r(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),_(Jt,null,{"doc-footer-before":p(()=>[c(f.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),c(f.$slots,"doc-after",{},void 0,!0)])])]),c(f.$slots,"doc-bottom",{},void 0,!0)],2)}}}),nn=g(tn,[["__scopeId","data-v-e6f2a212"]]),on=m({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{},target:{},rel:{}},setup(s){const e=s,t=y(()=>e.href&&ye.test(e.href)),o=y(()=>e.tag||(e.href?"a":"button"));return(n,i)=>(a(),k(E(o.value),{class:M(["VPButton",[n.size,n.theme]]),href:n.href?r(fe)(n.href):void 0,target:e.target??(t.value?"_blank":void 0),rel:e.rel??(t.value?"noreferrer":void 0)},{default:p(()=>[z(I(n.text),1)]),_:1},8,["class","href","target","rel"]))}}),sn=g(on,[["__scopeId","data-v-93dc4167"]]),an=["src","alt"],rn=m({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(s){return(e,t)=>{const o=W("VPImage",!0);return e.image?(a(),u(w,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),u("img",U({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:r(de)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,an)):(a(),u(w,{key:1},[_(o,U({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),_(o,U({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):h("",!0)}}}),X=g(rn,[["__scopeId","data-v-ab19afbb"]]),ln={class:"container"},cn={class:"main"},un={key:0,class:"name"},dn=["innerHTML"],vn=["innerHTML"],pn=["innerHTML"],fn={key:0,class:"actions"},hn={key:0,class:"image"},mn={class:"image-container"},_n=m({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(s){const e=x("hero-image-slot-exists");return(t,o)=>(a(),u("div",{class:M(["VPHero",{"has-image":t.image||r(e)}])},[d("div",ln,[d("div",cn,[c(t.$slots,"home-hero-info-before",{},void 0,!0),c(t.$slots,"home-hero-info",{},()=>[t.name?(a(),u("h1",un,[d("span",{innerHTML:t.name,class:"clip"},null,8,dn)])):h("",!0),t.text?(a(),u("p",{key:1,innerHTML:t.text,class:"text"},null,8,vn)):h("",!0),t.tagline?(a(),u("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,pn)):h("",!0)],!0),c(t.$slots,"home-hero-info-after",{},void 0,!0),t.actions?(a(),u("div",fn,[(a(!0),u(w,null,H(t.actions,n=>(a(),u("div",{key:n.link,class:"action"},[_(sn,{tag:"a",size:"medium",theme:n.theme,text:n.text,href:n.link,target:n.target,rel:n.rel},null,8,["theme","text","href","target","rel"])]))),128))])):h("",!0),c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),t.image||r(e)?(a(),u("div",hn,[d("div",mn,[o[0]||(o[0]=d("div",{class:"image-bg"},null,-1)),c(t.$slots,"home-hero-image",{},()=>[t.image?(a(),k(X,{key:0,class:"image-src",image:t.image},null,8,["image"])):h("",!0)],!0)])])):h("",!0)])],2))}}),kn=g(_n,[["__scopeId","data-v-b10c5094"]]),bn=m({__name:"VPHomeHero",setup(s){const{frontmatter:e}=L();return(t,o)=>r(e).hero?(a(),k(kn,{key:0,class:"VPHomeHero",name:r(e).hero.name,text:r(e).hero.text,tagline:r(e).hero.tagline,image:r(e).hero.image,actions:r(e).hero.actions},{"home-hero-info-before":p(()=>[c(t.$slots,"home-hero-info-before")]),"home-hero-info":p(()=>[c(t.$slots,"home-hero-info")]),"home-hero-info-after":p(()=>[c(t.$slots,"home-hero-info-after")]),"home-hero-actions-after":p(()=>[c(t.$slots,"home-hero-actions-after")]),"home-hero-image":p(()=>[c(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):h("",!0)}}),gn={class:"box"},$n={key:0,class:"icon"},yn=["innerHTML"],Pn=["innerHTML"],Ln=["innerHTML"],Vn={key:4,class:"link-text"},Sn={class:"link-text-value"},Tn=m({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(s){return(e,t)=>(a(),k(F,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:p(()=>[d("article",gn,[typeof e.icon=="object"&&e.icon.wrap?(a(),u("div",$n,[_(X,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),k(X,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),u("div",{key:2,class:"icon",innerHTML:e.icon},null,8,yn)):h("",!0),d("h2",{class:"title",innerHTML:e.title},null,8,Pn),e.details?(a(),u("p",{key:3,class:"details",innerHTML:e.details},null,8,Ln)):h("",!0),e.linkText?(a(),u("div",Vn,[d("p",Sn,[z(I(e.linkText)+" ",1),t[0]||(t[0]=d("span",{class:"vpi-arrow-right link-text-icon"},null,-1))])])):h("",!0)])]),_:1},8,["href","rel","target","tag"]))}}),Nn=g(Tn,[["__scopeId","data-v-bd37d1a2"]]),Mn={key:0,class:"VPFeatures"},In={class:"container"},wn={class:"items"},An=m({__name:"VPFeatures",props:{features:{}},setup(s){const e=s,t=y(()=>{const o=e.features.length;if(o){if(o===2)return"grid-2";if(o===3)return"grid-3";if(o%3===0)return"grid-6";if(o>3)return"grid-4"}else return});return(o,n)=>o.features?(a(),u("div",Mn,[d("div",In,[d("div",wn,[(a(!0),u(w,null,H(o.features,i=>(a(),u("div",{key:i.title,class:M(["item",[t.value]])},[_(Nn,{icon:i.icon,title:i.title,details:i.details,link:i.link,"link-text":i.linkText,rel:i.rel,target:i.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):h("",!0)}}),Cn=g(An,[["__scopeId","data-v-b1eea84a"]]),Hn=m({__name:"VPHomeFeatures",setup(s){const{frontmatter:e}=L();return(t,o)=>r(e).features?(a(),k(Cn,{key:0,class:"VPHomeFeatures",features:r(e).features},null,8,["features"])):h("",!0)}}),Bn=m({__name:"VPHomeContent",setup(s){const{width:e}=Oe({initialWidth:0,includeScrollbar:!1});return(t,o)=>(a(),u("div",{class:"vp-doc container",style:Pe(r(e)?{"--vp-offset":`calc(50% - ${r(e)/2}px)`}:{})},[c(t.$slots,"default",{},void 0,!0)],4))}}),En=g(Bn,[["__scopeId","data-v-c141a4bd"]]),Fn={class:"VPHome"},Dn=m({__name:"VPHome",setup(s){const{frontmatter:e}=L();return(t,o)=>{const n=W("Content");return a(),u("div",Fn,[c(t.$slots,"home-hero-before",{},void 0,!0),_(bn,null,{"home-hero-info-before":p(()=>[c(t.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":p(()=>[c(t.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":p(()=>[c(t.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":p(()=>[c(t.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":p(()=>[c(t.$slots,"home-hero-image",{},void 0,!0)]),_:3}),c(t.$slots,"home-hero-after",{},void 0,!0),c(t.$slots,"home-features-before",{},void 0,!0),_(Hn),c(t.$slots,"home-features-after",{},void 0,!0),r(e).markdownStyles!==!1?(a(),k(En,{key:0},{default:p(()=>[_(n)]),_:1})):(a(),k(n,{key:1}))])}}}),On=g(Dn,[["__scopeId","data-v-07b1ad08"]]),Gn={},Un={class:"VPPage"};function jn(s,e){const t=W("Content");return a(),u("div",Un,[c(s.$slots,"page-top"),_(t),c(s.$slots,"page-bottom")])}const zn=g(Gn,[["render",jn]]),Kn=m({__name:"VPContent",setup(s){const{page:e,frontmatter:t}=L(),{hasSidebar:o}=O();return(n,i)=>(a(),u("div",{class:M(["VPContent",{"has-sidebar":r(o),"is-home":r(t).layout==="home"}]),id:"VPContent"},[r(e).isNotFound?c(n.$slots,"not-found",{key:0},()=>[_(it)],!0):r(t).layout==="page"?(a(),k(zn,{key:1},{"page-top":p(()=>[c(n.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[c(n.$slots,"page-bottom",{},void 0,!0)]),_:3})):r(t).layout==="home"?(a(),k(On,{key:2},{"home-hero-before":p(()=>[c(n.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":p(()=>[c(n.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":p(()=>[c(n.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":p(()=>[c(n.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":p(()=>[c(n.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":p(()=>[c(n.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[c(n.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[c(n.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[c(n.$slots,"home-features-after",{},void 0,!0)]),_:3})):r(t).layout&&r(t).layout!=="doc"?(a(),k(E(r(t).layout),{key:3})):(a(),k(nn,{key:4},{"doc-top":p(()=>[c(n.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[c(n.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":p(()=>[c(n.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[c(n.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[c(n.$slots,"doc-after",{},void 0,!0)]),"aside-top":p(()=>[c(n.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":p(()=>[c(n.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[c(n.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[c(n.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[c(n.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":p(()=>[c(n.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}}),Wn=g(Kn,[["__scopeId","data-v-9a6c75ad"]]),qn={class:"container"},Rn=["innerHTML"],Jn=["innerHTML"],Xn=m({__name:"VPFooter",setup(s){const{theme:e,frontmatter:t}=L(),{hasSidebar:o}=O();return(n,i)=>r(e).footer&&r(t).footer!==!1?(a(),u("footer",{key:0,class:M(["VPFooter",{"has-sidebar":r(o)}])},[d("div",qn,[r(e).footer.message?(a(),u("p",{key:0,class:"message",innerHTML:r(e).footer.message},null,8,Rn)):h("",!0),r(e).footer.copyright?(a(),u("p",{key:1,class:"copyright",innerHTML:r(e).footer.copyright},null,8,Jn)):h("",!0)])],2)):h("",!0)}}),Yn=g(Xn,[["__scopeId","data-v-566314d4"]]);function Qn(){const{theme:s,frontmatter:e}=L(),t=$e([]),o=y(()=>t.value.length>0);return Q(()=>{t.value=he(e.value.outline??s.value.outline)}),{headers:t,hasLocalNav:o}}const Zn={class:"menu-text"},xn={class:"header"},eo={class:"outline"},to=m({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(s){const e=s,{theme:t}=L(),o=T(!1),n=T(0),i=T(),l=T();function f(b){var P;(P=i.value)!=null&&P.contains(b.target)||(o.value=!1)}D(o,b=>{if(b){document.addEventListener("click",f);return}document.removeEventListener("click",f)}),re("Escape",()=>{o.value=!1}),Q(()=>{o.value=!1});function v(){o.value=!o.value,n.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function $(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Le(()=>{o.value=!1}))}function V(){o.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,P)=>(a(),u("div",{class:"VPLocalNavOutlineDropdown",style:Pe({"--vp-vh":n.value+"px"}),ref_key:"main",ref:i},[b.headers.length>0?(a(),u("button",{key:0,onClick:v,class:M({open:o.value})},[d("span",Zn,I(r(Me)(r(t))),1),P[0]||(P[0]=d("span",{class:"vpi-chevron-right icon"},null,-1))],2)):(a(),u("button",{key:1,onClick:V},I(r(t).returnToTopLabel||"Return to top"),1)),_(ue,{name:"flyout"},{default:p(()=>[o.value?(a(),u("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:$},[d("div",xn,[d("a",{class:"top-link",href:"#",onClick:V},I(r(t).returnToTopLabel||"Return to top"),1)]),d("div",eo,[_(Ie,{headers:b.headers},null,8,["headers"])])],512)):h("",!0)]),_:1})],4))}}),no=g(to,[["__scopeId","data-v-883964e0"]]),oo={class:"container"},so=["aria-expanded"],ao={class:"menu-text"},ro=m({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(s){const{theme:e,frontmatter:t}=L(),{hasSidebar:o}=O(),{headers:n}=Qn(),{y:i}=Ve(),l=T(0);j(()=>{l.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),Q(()=>{n.value=he(t.value.outline??e.value.outline)});const f=y(()=>n.value.length===0),v=y(()=>f.value&&!o.value),$=y(()=>({VPLocalNav:!0,"has-sidebar":o.value,empty:f.value,fixed:v.value}));return(V,b)=>r(t).layout!=="home"&&(!v.value||r(i)>=l.value)?(a(),u("div",{key:0,class:M($.value)},[d("div",oo,[r(o)?(a(),u("button",{key:0,class:"menu","aria-expanded":V.open,"aria-controls":"VPSidebarNav",onClick:b[0]||(b[0]=P=>V.$emit("open-menu"))},[b[1]||(b[1]=d("span",{class:"vpi-align-left menu-icon"},null,-1)),d("span",ao,I(r(e).sidebarMenuLabel||"Menu"),1)],8,so)):h("",!0),_(no,{headers:r(n),navHeight:l.value},null,8,["headers","navHeight"])])],2)):h("",!0)}}),io=g(ro,[["__scopeId","data-v-2488c25a"]]);function lo(){const s=T(!1);function e(){s.value=!0,window.addEventListener("resize",n)}function t(){s.value=!1,window.removeEventListener("resize",n)}function o(){s.value?t():e()}function n(){window.outerWidth>=768&&t()}const i=Z();return D(()=>i.path,t),{isScreenOpen:s,openScreen:e,closeScreen:t,toggleScreen:o}}const co={},uo={class:"VPSwitch",type:"button",role:"switch"},vo={class:"check"},po={key:0,class:"icon"};function fo(s,e){return a(),u("button",uo,[d("span",vo,[s.$slots.default?(a(),u("span",po,[c(s.$slots,"default",{},void 0,!0)])):h("",!0)])])}const ho=g(co,[["render",fo],["__scopeId","data-v-b4ccac88"]]),mo=m({__name:"VPSwitchAppearance",setup(s){const{isDark:e,theme:t}=L(),o=x("toggle-appearance",()=>{e.value=!e.value}),n=T("");return pe(()=>{n.value=e.value?t.value.lightModeSwitchTitle||"Switch to light theme":t.value.darkModeSwitchTitle||"Switch to dark theme"}),(i,l)=>(a(),k(ho,{title:n.value,class:"VPSwitchAppearance","aria-checked":r(e),onClick:r(o)},{default:p(()=>l[0]||(l[0]=[d("span",{class:"vpi-sun sun"},null,-1),d("span",{class:"vpi-moon moon"},null,-1)])),_:1},8,["title","aria-checked","onClick"]))}}),me=g(mo,[["__scopeId","data-v-be9742d9"]]),_o={key:0,class:"VPNavBarAppearance"},ko=m({__name:"VPNavBarAppearance",setup(s){const{site:e}=L();return(t,o)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",_o,[_(me)])):h("",!0)}}),bo=g(ko,[["__scopeId","data-v-3f90c1a5"]]),_e=T();let we=!1,se=0;function go(s){const e=T(!1);if(ee){!we&&$o(),se++;const t=D(_e,o=>{var n,i,l;o===s.el.value||(n=s.el.value)!=null&&n.contains(o)?(e.value=!0,(i=s.onFocus)==null||i.call(s)):(e.value=!1,(l=s.onBlur)==null||l.call(s))});ve(()=>{t(),se--,se||yo()})}return Ge(e)}function $o(){document.addEventListener("focusin",Ae),we=!0,_e.value=document.activeElement}function yo(){document.removeEventListener("focusin",Ae)}function Ae(){_e.value=document.activeElement}const Po={class:"VPMenuLink"},Lo=["innerHTML"],Vo=m({__name:"VPMenuLink",props:{item:{}},setup(s){const{page:e}=L();return(t,o)=>(a(),u("div",Po,[_(F,{class:M({active:r(K)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon},{default:p(()=>[d("span",{innerHTML:t.item.text},null,8,Lo)]),_:1},8,["class","href","target","rel","no-icon"])]))}}),te=g(Vo,[["__scopeId","data-v-7eeeb2dc"]]),So={class:"VPMenuGroup"},To={key:0,class:"title"},No=m({__name:"VPMenuGroup",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),u("div",So,[e.text?(a(),u("p",To,I(e.text),1)):h("",!0),(a(!0),u(w,null,H(e.items,o=>(a(),u(w,null,["link"in o?(a(),k(te,{key:0,item:o},null,8,["item"])):h("",!0)],64))),256))]))}}),Mo=g(No,[["__scopeId","data-v-a6b0397c"]]),Io={class:"VPMenu"},wo={key:0,class:"items"},Ao=m({__name:"VPMenu",props:{items:{}},setup(s){return(e,t)=>(a(),u("div",Io,[e.items?(a(),u("div",wo,[(a(!0),u(w,null,H(e.items,o=>(a(),u(w,{key:JSON.stringify(o)},["link"in o?(a(),k(te,{key:0,item:o},null,8,["item"])):"component"in o?(a(),k(E(o.component),U({key:1,ref_for:!0},o.props),null,16)):(a(),k(Mo,{key:2,text:o.text,items:o.items},null,8,["text","items"]))],64))),128))])):h("",!0),c(e.$slots,"default",{},void 0,!0)]))}}),Co=g(Ao,[["__scopeId","data-v-20ed86d6"]]),Ho=["aria-expanded","aria-label"],Bo={key:0,class:"text"},Eo=["innerHTML"],Fo={key:1,class:"vpi-more-horizontal icon"},Do={class:"menu"},Oo=m({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(s){const e=T(!1),t=T();go({el:t,onBlur:o});function o(){e.value=!1}return(n,i)=>(a(),u("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:i[1]||(i[1]=l=>e.value=!0),onMouseleave:i[2]||(i[2]=l=>e.value=!1)},[d("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":n.label,onClick:i[0]||(i[0]=l=>e.value=!e.value)},[n.button||n.icon?(a(),u("span",Bo,[n.icon?(a(),u("span",{key:0,class:M([n.icon,"option-icon"])},null,2)):h("",!0),n.button?(a(),u("span",{key:1,innerHTML:n.button},null,8,Eo)):h("",!0),i[3]||(i[3]=d("span",{class:"vpi-chevron-down text-icon"},null,-1))])):(a(),u("span",Fo))],8,Ho),d("div",Do,[_(Co,{items:n.items},{default:p(()=>[c(n.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}}),ke=g(Oo,[["__scopeId","data-v-bfe7971f"]]),Go=["href","aria-label","innerHTML"],Uo=m({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(s){const e=s,t=T();j(async()=>{var i;await Le();const n=(i=t.value)==null?void 0:i.children[0];n instanceof HTMLElement&&n.className.startsWith("vpi-social-")&&(getComputedStyle(n).maskImage||getComputedStyle(n).webkitMaskImage)==="none"&&n.style.setProperty("--icon",`url('https://api.iconify.design/simple-icons/${e.icon}.svg')`)});const o=y(()=>typeof e.icon=="object"?e.icon.svg:``);return(n,i)=>(a(),u("a",{ref_key:"el",ref:t,class:"VPSocialLink no-icon",href:n.link,"aria-label":n.ariaLabel??(typeof n.icon=="string"?n.icon:""),target:"_blank",rel:"noopener",innerHTML:o.value},null,8,Go))}}),jo=g(Uo,[["__scopeId","data-v-60a9a2d3"]]),zo={class:"VPSocialLinks"},Ko=m({__name:"VPSocialLinks",props:{links:{}},setup(s){return(e,t)=>(a(),u("div",zo,[(a(!0),u(w,null,H(e.links,({link:o,icon:n,ariaLabel:i})=>(a(),k(jo,{key:o,icon:n,link:o,ariaLabel:i},null,8,["icon","link","ariaLabel"]))),128))]))}}),be=g(Ko,[["__scopeId","data-v-e71e869c"]]),Wo={key:0,class:"group translations"},qo={class:"trans-title"},Ro={key:1,class:"group"},Jo={class:"item appearance"},Xo={class:"label"},Yo={class:"appearance-action"},Qo={key:2,class:"group"},Zo={class:"item social-links"},xo=m({__name:"VPNavBarExtra",setup(s){const{site:e,theme:t}=L(),{localeLinks:o,currentLang:n}=R({correspondingLink:!0}),i=y(()=>o.value.length&&n.value.label||e.value.appearance||t.value.socialLinks);return(l,f)=>i.value?(a(),k(ke,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:p(()=>[r(o).length&&r(n).label?(a(),u("div",Wo,[d("p",qo,I(r(n).label),1),(a(!0),u(w,null,H(r(o),v=>(a(),k(te,{key:v.link,item:v},null,8,["item"]))),128))])):h("",!0),r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",Ro,[d("div",Jo,[d("p",Xo,I(r(t).darkModeSwitchLabel||"Appearance"),1),d("div",Yo,[_(me)])])])):h("",!0),r(t).socialLinks?(a(),u("div",Qo,[d("div",Zo,[_(be,{class:"social-links-list",links:r(t).socialLinks},null,8,["links"])])])):h("",!0)]),_:1})):h("",!0)}}),es=g(xo,[["__scopeId","data-v-f953d92f"]]),ts=["aria-expanded"],ns=m({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(s){return(e,t)=>(a(),u("button",{type:"button",class:M(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=o=>e.$emit("click"))},t[1]||(t[1]=[d("span",{class:"container"},[d("span",{class:"top"}),d("span",{class:"middle"}),d("span",{class:"bottom"})],-1)]),10,ts))}}),os=g(ns,[["__scopeId","data-v-6bee1efd"]]),ss=["innerHTML"],as=m({__name:"VPNavBarMenuLink",props:{item:{}},setup(s){const{page:e}=L();return(t,o)=>(a(),k(F,{class:M({VPNavBarMenuLink:!0,active:r(K)(r(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,tabindex:"0"},{default:p(()=>[d("span",{innerHTML:t.item.text},null,8,ss)]),_:1},8,["class","href","target","rel","no-icon"]))}}),rs=g(as,[["__scopeId","data-v-815115f5"]]),is=m({__name:"VPNavBarMenuGroup",props:{item:{}},setup(s){const e=s,{page:t}=L(),o=i=>"component"in i?!1:"link"in i?K(t.value.relativePath,i.link,!!e.item.activeMatch):i.items.some(o),n=y(()=>o(e.item));return(i,l)=>(a(),k(ke,{class:M({VPNavBarMenuGroup:!0,active:r(K)(r(t).relativePath,i.item.activeMatch,!!i.item.activeMatch)||n.value}),button:i.item.text,items:i.item.items},null,8,["class","button","items"]))}}),ls={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},cs=m({__name:"VPNavBarMenu",setup(s){const{theme:e}=L();return(t,o)=>r(e).nav?(a(),u("nav",ls,[o[0]||(o[0]=d("span",{id:"main-nav-aria-label",class:"visually-hidden"}," Main Navigation ",-1)),(a(!0),u(w,null,H(r(e).nav,n=>(a(),u(w,{key:JSON.stringify(n)},["link"in n?(a(),k(rs,{key:0,item:n},null,8,["item"])):"component"in n?(a(),k(E(n.component),U({key:1,ref_for:!0},n.props),null,16)):(a(),k(is,{key:2,item:n},null,8,["item"]))],64))),128))])):h("",!0)}}),us=g(cs,[["__scopeId","data-v-afb2845e"]]);function ds(s){const{localeIndex:e,theme:t}=L();function o(n){var A,C,S;const i=n.split("."),l=(A=t.value.search)==null?void 0:A.options,f=l&&typeof l=="object",v=f&&((S=(C=l.locales)==null?void 0:C[e.value])==null?void 0:S.translations)||null,$=f&&l.translations||null;let V=v,b=$,P=s;const N=i.pop();for(const B of i){let G=null;const q=P==null?void 0:P[B];q&&(G=P=q);const ne=b==null?void 0:b[B];ne&&(G=b=ne);const oe=V==null?void 0:V[B];oe&&(G=V=oe),q||(P=G),ne||(b=G),oe||(V=G)}return(V==null?void 0:V[N])??(b==null?void 0:b[N])??(P==null?void 0:P[N])??""}return o}const vs=["aria-label"],ps={class:"DocSearch-Button-Container"},fs={class:"DocSearch-Button-Placeholder"},ge=m({__name:"VPNavBarSearchButton",setup(s){const t=ds({button:{buttonText:"Search",buttonAriaLabel:"Search"}});return(o,n)=>(a(),u("button",{type:"button",class:"DocSearch DocSearch-Button","aria-label":r(t)("button.buttonAriaLabel")},[d("span",ps,[n[0]||(n[0]=d("span",{class:"vp-icon DocSearch-Search-Icon"},null,-1)),d("span",fs,I(r(t)("button.buttonText")),1)]),n[1]||(n[1]=d("span",{class:"DocSearch-Button-Keys"},[d("kbd",{class:"DocSearch-Button-Key"}),d("kbd",{class:"DocSearch-Button-Key"},"K")],-1))],8,vs))}}),hs={class:"VPNavBarSearch"},ms={id:"local-search"},_s={key:1,id:"docsearch"},ks=m({__name:"VPNavBarSearch",setup(s){const e=Ue(()=>je(()=>import("./VPLocalSearchBox.Blc1mzWh.js"),__vite__mapDeps([0,1]))),t=()=>null,{theme:o}=L(),n=T(!1),i=T(!1);j(()=>{});function l(){n.value||(n.value=!0,setTimeout(f,16))}function f(){const b=new Event("keydown");b.key="k",b.metaKey=!0,window.dispatchEvent(b),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||f()},16)}function v(b){const P=b.target,N=P.tagName;return P.isContentEditable||N==="INPUT"||N==="SELECT"||N==="TEXTAREA"}const $=T(!1);re("k",b=>{(b.ctrlKey||b.metaKey)&&(b.preventDefault(),$.value=!0)}),re("/",b=>{v(b)||(b.preventDefault(),$.value=!0)});const V="local";return(b,P)=>{var N;return a(),u("div",hs,[r(V)==="local"?(a(),u(w,{key:0},[$.value?(a(),k(r(e),{key:0,onClose:P[0]||(P[0]=A=>$.value=!1)})):h("",!0),d("div",ms,[_(ge,{onClick:P[1]||(P[1]=A=>$.value=!0)})])],64)):r(V)==="algolia"?(a(),u(w,{key:1},[n.value?(a(),k(r(t),{key:0,algolia:((N=r(o).search)==null?void 0:N.options)??r(o).algolia,onVnodeBeforeMount:P[2]||(P[2]=A=>i.value=!0)},null,8,["algolia"])):h("",!0),i.value?h("",!0):(a(),u("div",_s,[_(ge,{onClick:l})]))],64)):h("",!0)])}}}),bs=m({__name:"VPNavBarSocialLinks",setup(s){const{theme:e}=L();return(t,o)=>r(e).socialLinks?(a(),k(be,{key:0,class:"VPNavBarSocialLinks",links:r(e).socialLinks},null,8,["links"])):h("",!0)}}),gs=g(bs,[["__scopeId","data-v-ef6192dc"]]),$s=["href","rel","target"],ys=["innerHTML"],Ps={key:2},Ls=m({__name:"VPNavBarTitle",setup(s){const{site:e,theme:t}=L(),{hasSidebar:o}=O(),{currentLang:n}=R(),i=y(()=>{var v;return typeof t.value.logoLink=="string"?t.value.logoLink:(v=t.value.logoLink)==null?void 0:v.link}),l=y(()=>{var v;return typeof t.value.logoLink=="string"||(v=t.value.logoLink)==null?void 0:v.rel}),f=y(()=>{var v;return typeof t.value.logoLink=="string"||(v=t.value.logoLink)==null?void 0:v.target});return(v,$)=>(a(),u("div",{class:M(["VPNavBarTitle",{"has-sidebar":r(o)}])},[d("a",{class:"title",href:i.value??r(fe)(r(n).link),rel:l.value,target:f.value},[c(v.$slots,"nav-bar-title-before",{},void 0,!0),r(t).logo?(a(),k(X,{key:0,class:"logo",image:r(t).logo},null,8,["image"])):h("",!0),r(t).siteTitle?(a(),u("span",{key:1,innerHTML:r(t).siteTitle},null,8,ys)):r(t).siteTitle===void 0?(a(),u("span",Ps,I(r(e).title),1)):h("",!0),c(v.$slots,"nav-bar-title-after",{},void 0,!0)],8,$s)],2))}}),Vs=g(Ls,[["__scopeId","data-v-9f43907a"]]),Ss={class:"items"},Ts={class:"title"},Ns=m({__name:"VPNavBarTranslations",setup(s){const{theme:e}=L(),{localeLinks:t,currentLang:o}=R({correspondingLink:!0});return(n,i)=>r(t).length&&r(o).label?(a(),k(ke,{key:0,class:"VPNavBarTranslations",icon:"vpi-languages",label:r(e).langMenuLabel||"Change language"},{default:p(()=>[d("div",Ss,[d("p",Ts,I(r(o).label),1),(a(!0),u(w,null,H(r(t),l=>(a(),k(te,{key:l.link,item:l},null,8,["item"]))),128))])]),_:1},8,["label"])):h("",!0)}}),Ms=g(Ns,[["__scopeId","data-v-acee064b"]]),Is={class:"wrapper"},ws={class:"container"},As={class:"title"},Cs={class:"content"},Hs={class:"content-body"},Bs=m({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(s){const e=s,{y:t}=Ve(),{hasSidebar:o}=O(),{frontmatter:n}=L(),i=T({});return pe(()=>{i.value={"has-sidebar":o.value,home:n.value.layout==="home",top:t.value===0,"screen-open":e.isScreenOpen}}),(l,f)=>(a(),u("div",{class:M(["VPNavBar",i.value])},[d("div",Is,[d("div",ws,[d("div",As,[_(Vs,null,{"nav-bar-title-before":p(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),d("div",Cs,[d("div",Hs,[c(l.$slots,"nav-bar-content-before",{},void 0,!0),_(ks,{class:"search"}),_(us,{class:"menu"}),_(Ms,{class:"translations"}),_(bo,{class:"appearance"}),_(gs,{class:"social-links"}),_(es,{class:"extra"}),c(l.$slots,"nav-bar-content-after",{},void 0,!0),_(os,{class:"hamburger",active:l.isScreenOpen,onClick:f[0]||(f[0]=v=>l.$emit("toggle-screen"))},null,8,["active"])])])])]),f[1]||(f[1]=d("div",{class:"divider"},[d("div",{class:"divider-line"})],-1))],2))}}),Es=g(Bs,[["__scopeId","data-v-9fd4d1dd"]]),Fs={key:0,class:"VPNavScreenAppearance"},Ds={class:"text"},Os=m({__name:"VPNavScreenAppearance",setup(s){const{site:e,theme:t}=L();return(o,n)=>r(e).appearance&&r(e).appearance!=="force-dark"&&r(e).appearance!=="force-auto"?(a(),u("div",Fs,[d("p",Ds,I(r(t).darkModeSwitchLabel||"Appearance"),1),_(me)])):h("",!0)}}),Gs=g(Os,[["__scopeId","data-v-a3e2920d"]]),Us=["innerHTML"],js=m({__name:"VPNavScreenMenuLink",props:{item:{}},setup(s){const e=x("close-screen");return(t,o)=>(a(),k(F,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:r(e)},{default:p(()=>[d("span",{innerHTML:t.item.text},null,8,Us)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),zs=g(js,[["__scopeId","data-v-fa963d97"]]),Ks=["innerHTML"],Ws=m({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(s){const e=x("close-screen");return(t,o)=>(a(),k(F,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,"no-icon":t.item.noIcon,onClick:r(e)},{default:p(()=>[d("span",{innerHTML:t.item.text},null,8,Ks)]),_:1},8,["href","target","rel","no-icon","onClick"]))}}),Ce=g(Ws,[["__scopeId","data-v-e04f3e85"]]),qs={class:"VPNavScreenMenuGroupSection"},Rs={key:0,class:"title"},Js=m({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(s){return(e,t)=>(a(),u("div",qs,[e.text?(a(),u("p",Rs,I(e.text),1)):h("",!0),(a(!0),u(w,null,H(e.items,o=>(a(),k(Ce,{key:o.text,item:o},null,8,["item"]))),128))]))}}),Xs=g(Js,[["__scopeId","data-v-f60dbfa7"]]),Ys=["aria-controls","aria-expanded"],Qs=["innerHTML"],Zs=["id"],xs={key:0,class:"item"},ea={key:1,class:"item"},ta={key:2,class:"group"},na=m({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(s){const e=s,t=T(!1),o=y(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function n(){t.value=!t.value}return(i,l)=>(a(),u("div",{class:M(["VPNavScreenMenuGroup",{open:t.value}])},[d("button",{class:"button","aria-controls":o.value,"aria-expanded":t.value,onClick:n},[d("span",{class:"button-text",innerHTML:i.text},null,8,Qs),l[0]||(l[0]=d("span",{class:"vpi-plus button-icon"},null,-1))],8,Ys),d("div",{id:o.value,class:"items"},[(a(!0),u(w,null,H(i.items,f=>(a(),u(w,{key:JSON.stringify(f)},["link"in f?(a(),u("div",xs,[_(Ce,{item:f},null,8,["item"])])):"component"in f?(a(),u("div",ea,[(a(),k(E(f.component),U({ref_for:!0},f.props,{"screen-menu":""}),null,16))])):(a(),u("div",ta,[_(Xs,{text:f.text,items:f.items},null,8,["text","items"])]))],64))),128))],8,Zs)],2))}}),oa=g(na,[["__scopeId","data-v-d99bfeec"]]),sa={key:0,class:"VPNavScreenMenu"},aa=m({__name:"VPNavScreenMenu",setup(s){const{theme:e}=L();return(t,o)=>r(e).nav?(a(),u("nav",sa,[(a(!0),u(w,null,H(r(e).nav,n=>(a(),u(w,{key:JSON.stringify(n)},["link"in n?(a(),k(zs,{key:0,item:n},null,8,["item"])):"component"in n?(a(),k(E(n.component),U({key:1,ref_for:!0},n.props,{"screen-menu":""}),null,16)):(a(),k(oa,{key:2,text:n.text||"",items:n.items},null,8,["text","items"]))],64))),128))])):h("",!0)}}),ra=m({__name:"VPNavScreenSocialLinks",setup(s){const{theme:e}=L();return(t,o)=>r(e).socialLinks?(a(),k(be,{key:0,class:"VPNavScreenSocialLinks",links:r(e).socialLinks},null,8,["links"])):h("",!0)}}),ia={class:"list"},la=m({__name:"VPNavScreenTranslations",setup(s){const{localeLinks:e,currentLang:t}=R({correspondingLink:!0}),o=T(!1);function n(){o.value=!o.value}return(i,l)=>r(e).length&&r(t).label?(a(),u("div",{key:0,class:M(["VPNavScreenTranslations",{open:o.value}])},[d("button",{class:"title",onClick:n},[l[0]||(l[0]=d("span",{class:"vpi-languages icon lang"},null,-1)),z(" "+I(r(t).label)+" ",1),l[1]||(l[1]=d("span",{class:"vpi-chevron-down icon chevron"},null,-1))]),d("ul",ia,[(a(!0),u(w,null,H(r(e),f=>(a(),u("li",{key:f.link,class:"item"},[_(F,{class:"link",href:f.link},{default:p(()=>[z(I(f.text),1)]),_:2},1032,["href"])]))),128))])],2)):h("",!0)}}),ca=g(la,[["__scopeId","data-v-516e4bc3"]]),ua={class:"container"},da=m({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(s){const e=T(null),t=Se(ee?document.body:null);return(o,n)=>(a(),k(ue,{name:"fade",onEnter:n[0]||(n[0]=i=>t.value=!0),onAfterLeave:n[1]||(n[1]=i=>t.value=!1)},{default:p(()=>[o.open?(a(),u("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[d("div",ua,[c(o.$slots,"nav-screen-content-before",{},void 0,!0),_(aa,{class:"menu"}),_(ca,{class:"translations"}),_(Gs,{class:"appearance"}),_(ra,{class:"social-links"}),c(o.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):h("",!0)]),_:3}))}}),va=g(da,[["__scopeId","data-v-2dd6d0c7"]]),pa={key:0,class:"VPNav"},fa=m({__name:"VPNav",setup(s){const{isScreenOpen:e,closeScreen:t,toggleScreen:o}=lo(),{frontmatter:n}=L(),i=y(()=>n.value.navbar!==!1);return Te("close-screen",t),Y(()=>{ee&&document.documentElement.classList.toggle("hide-nav",!i.value)}),(l,f)=>i.value?(a(),u("header",pa,[_(Es,{"is-screen-open":r(e),onToggleScreen:r(o)},{"nav-bar-title-before":p(()=>[c(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[c(l.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[c(l.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[c(l.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),_(va,{open:r(e)},{"nav-screen-content-before":p(()=>[c(l.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[c(l.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):h("",!0)}}),ha=g(fa,[["__scopeId","data-v-7ad780c2"]]),ma=["role","tabindex"],_a={key:1,class:"items"},ka=m({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(s){const e=s,{collapsed:t,collapsible:o,isLink:n,isActiveLink:i,hasActiveLink:l,hasChildren:f,toggle:v}=dt(y(()=>e.item)),$=y(()=>f.value?"section":"div"),V=y(()=>n.value?"a":"div"),b=y(()=>f.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),P=y(()=>n.value?void 0:"button"),N=y(()=>[[`level-${e.depth}`],{collapsible:o.value},{collapsed:t.value},{"is-link":n.value},{"is-active":i.value},{"has-active":l.value}]);function A(S){"key"in S&&S.key!=="Enter"||!e.item.link&&v()}function C(){e.item.link&&v()}return(S,B)=>{const G=W("VPSidebarItem",!0);return a(),k(E($.value),{class:M(["VPSidebarItem",N.value])},{default:p(()=>[S.item.text?(a(),u("div",U({key:0,class:"item",role:P.value},Ke(S.item.items?{click:A,keydown:A}:{},!0),{tabindex:S.item.items&&0}),[B[1]||(B[1]=d("div",{class:"indicator"},null,-1)),S.item.link?(a(),k(F,{key:0,tag:V.value,class:"link",href:S.item.link,rel:S.item.rel,target:S.item.target},{default:p(()=>[(a(),k(E(b.value),{class:"text",innerHTML:S.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),k(E(b.value),{key:1,class:"text",innerHTML:S.item.text},null,8,["innerHTML"])),S.item.collapsed!=null&&S.item.items&&S.item.items.length?(a(),u("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:C,onKeydown:ze(C,["enter"]),tabindex:"0"},B[0]||(B[0]=[d("span",{class:"vpi-chevron-right caret-icon"},null,-1)]),32)):h("",!0)],16,ma)):h("",!0),S.item.items&&S.item.items.length?(a(),u("div",_a,[S.depth<5?(a(!0),u(w,{key:0},H(S.item.items,q=>(a(),k(G,{key:q.text,item:q,depth:S.depth+1},null,8,["item","depth"]))),128)):h("",!0)])):h("",!0)]),_:1},8,["class"])}}}),ba=g(ka,[["__scopeId","data-v-edd2eed8"]]),ga=m({__name:"VPSidebarGroup",props:{items:{}},setup(s){const e=T(!0);let t=null;return j(()=>{t=setTimeout(()=>{t=null,e.value=!1},300)}),We(()=>{t!=null&&(clearTimeout(t),t=null)}),(o,n)=>(a(!0),u(w,null,H(o.items,i=>(a(),u("div",{key:i.text,class:M(["group",{"no-transition":e.value}])},[_(ba,{item:i,depth:0},null,8,["item"])],2))),128))}}),$a=g(ga,[["__scopeId","data-v-51288d80"]]),ya={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Pa=m({__name:"VPSidebar",props:{open:{type:Boolean}},setup(s){const{sidebarGroups:e,hasSidebar:t}=O(),o=s,n=T(null),i=Se(ee?document.body:null);D([o,n],()=>{var f;o.open?(i.value=!0,(f=n.value)==null||f.focus()):i.value=!1},{immediate:!0,flush:"post"});const l=T(0);return D(e,()=>{l.value+=1},{deep:!0}),(f,v)=>r(t)?(a(),u("aside",{key:0,class:M(["VPSidebar",{open:f.open}]),ref_key:"navEl",ref:n,onClick:v[0]||(v[0]=qe(()=>{},["stop"]))},[v[2]||(v[2]=d("div",{class:"curtain"},null,-1)),d("nav",ya,[v[1]||(v[1]=d("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),c(f.$slots,"sidebar-nav-before",{},void 0,!0),(a(),k($a,{items:r(e),key:l.value},null,8,["items"])),c(f.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):h("",!0)}}),La=g(Pa,[["__scopeId","data-v-42c4c606"]]),Va=m({__name:"VPSkipLink",setup(s){const e=Z(),t=T();D(()=>e.path,()=>t.value.focus());function o({target:n}){const i=document.getElementById(decodeURIComponent(n.hash).slice(1));if(i){const l=()=>{i.removeAttribute("tabindex"),i.removeEventListener("blur",l)};i.setAttribute("tabindex","-1"),i.addEventListener("blur",l),i.focus(),window.scrollTo(0,0)}}return(n,i)=>(a(),u(w,null,[d("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),d("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:o}," Skip to content ")],64))}}),Sa=g(Va,[["__scopeId","data-v-c8291ffa"]]),Ta=m({__name:"Layout",setup(s){const{isOpen:e,open:t,close:o}=O(),n=Z();D(()=>n.path,o),ut(e,o);const{frontmatter:i}=L(),l=Re(),f=y(()=>!!l["home-hero-image"]);return Te("hero-image-slot-exists",f),(v,$)=>{const V=W("Content");return r(i).layout!==!1?(a(),u("div",{key:0,class:M(["Layout",r(i).pageClass])},[c(v.$slots,"layout-top",{},void 0,!0),_(Sa),_(Qe,{class:"backdrop",show:r(e),onClick:r(o)},null,8,["show","onClick"]),_(ha,null,{"nav-bar-title-before":p(()=>[c(v.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[c(v.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[c(v.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[c(v.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":p(()=>[c(v.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[c(v.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),_(io,{open:r(e),onOpenMenu:r(t)},null,8,["open","onOpenMenu"]),_(La,{open:r(e)},{"sidebar-nav-before":p(()=>[c(v.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":p(()=>[c(v.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),_(Wn,null,{"page-top":p(()=>[c(v.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[c(v.$slots,"page-bottom",{},void 0,!0)]),"not-found":p(()=>[c(v.$slots,"not-found",{},void 0,!0)]),"home-hero-before":p(()=>[c(v.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info-before":p(()=>[c(v.$slots,"home-hero-info-before",{},void 0,!0)]),"home-hero-info":p(()=>[c(v.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-info-after":p(()=>[c(v.$slots,"home-hero-info-after",{},void 0,!0)]),"home-hero-actions-after":p(()=>[c(v.$slots,"home-hero-actions-after",{},void 0,!0)]),"home-hero-image":p(()=>[c(v.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[c(v.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[c(v.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[c(v.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":p(()=>[c(v.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[c(v.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[c(v.$slots,"doc-after",{},void 0,!0)]),"doc-top":p(()=>[c(v.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[c(v.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":p(()=>[c(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[c(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[c(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[c(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[c(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[c(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),_(Yn),c(v.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),k(V,{key:1}))}}}),Na=g(Ta,[["__scopeId","data-v-d8b57b2d"]]),Ia={Layout:Na,enhanceApp:({app:s})=>{s.component("Badge",Je)}};export{ds as c,Ia as t,L as u}; diff --git a/assets/contribute_core.md.Dwn6SPRK.js b/assets/contribute_core.md.Dwn6SPRK.js new file mode 100644 index 00000000..214bc256 --- /dev/null +++ b/assets/contribute_core.md.Dwn6SPRK.js @@ -0,0 +1,39 @@ +import{_ as e,c as a,a2 as i,o as t}from"./chunks/framework.BQmytedh.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

asdf core contribution guide.

Initial Setup

Fork asdf on GitHub and/or Git clone the default branch:

shell
# 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:

shell
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:

shell
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:

  • bats-core: Bash Automated Testing System, for unit testing Bash or POSIX compliant scripts.
  • shellcheck: Static analysis tool for shell scripts.
  • shfmt: A shell parser, formatter, and interpreter with bash support; includes shfmt

Development

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:

shell
# 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

Gitignore

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.

gitignore
/installs
+/downloads
+/shims
+repository
+.vagrant
+keyrings
+/tmp
+
+dist/

.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:

sh
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:

sh
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:

json
{
+  "gitlens.advanced.blame.customArguments": [
+    "--ignore-revs-file",
+    ".git-blame-ignore-revs"
+  ]
+}

Bats Testing

Execute tests locally with:

shell
./scripts/test.bash

Before writing tests please read:

Bats Tips

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:

shell
# 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.

Pull Requests, Releases & Conventional Commits

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 change
  • fix: 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.

Docker Images

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.Dwn6SPRK.lean.js b/assets/contribute_core.md.Dwn6SPRK.lean.js new file mode 100644 index 00000000..214bc256 --- /dev/null +++ b/assets/contribute_core.md.Dwn6SPRK.lean.js @@ -0,0 +1,39 @@ +import{_ as e,c as a,a2 as i,o as t}from"./chunks/framework.BQmytedh.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

asdf core contribution guide.

Initial Setup

Fork asdf on GitHub and/or Git clone the default branch:

shell
# 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:

shell
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:

shell
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:

  • bats-core: Bash Automated Testing System, for unit testing Bash or POSIX compliant scripts.
  • shellcheck: Static analysis tool for shell scripts.
  • shfmt: A shell parser, formatter, and interpreter with bash support; includes shfmt

Development

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:

shell
# 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

Gitignore

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.

gitignore
/installs
+/downloads
+/shims
+repository
+.vagrant
+keyrings
+/tmp
+
+dist/

.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:

sh
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:

sh
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:

json
{
+  "gitlens.advanced.blame.customArguments": [
+    "--ignore-revs-file",
+    ".git-blame-ignore-revs"
+  ]
+}

Bats Testing

Execute tests locally with:

shell
./scripts/test.bash

Before writing tests please read:

Bats Tips

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:

shell
# 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.

Pull Requests, Releases & Conventional Commits

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 change
  • fix: 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.

Docker Images

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.BrHjmG2Y.js b/assets/contribute_documentation.md.BrHjmG2Y.js new file mode 100644 index 00000000..fd64bada --- /dev/null +++ b/assets/contribute_documentation.md.BrHjmG2Y.js @@ -0,0 +1,42 @@ +import{_ as i,c as a,a2 as e,o as n}from"./chunks/framework.BQmytedh.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(`

Docs & Site

Documentation & site contribution guide.

Initial Setup

Fork asdf on GitHub and/or Git clone the default branch:

shell
# 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:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

Install the tool version(s) with:

shell
asdf install
  • Node.js: JavaScript runtime built on Chrome's V8 JavaScript engine.

Install Node.js dependencies from docs/package.json:

shell
npm install

Development

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:

@code json{3-5}

To start the local development server:

shell
npm run dev

Format the code before committing:

shell
npm run format

Pull Requests, Releases & Conventional Commits

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>.

Vitepress

Configuration of the site is contained within a few TypeScript files with JS Objects used to represent the config. They are:

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.

I18n

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:

js
// 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:

shell
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.BrHjmG2Y.lean.js b/assets/contribute_documentation.md.BrHjmG2Y.lean.js new file mode 100644 index 00000000..fd64bada --- /dev/null +++ b/assets/contribute_documentation.md.BrHjmG2Y.lean.js @@ -0,0 +1,42 @@ +import{_ as i,c as a,a2 as e,o as n}from"./chunks/framework.BQmytedh.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(`

Docs & Site

Documentation & site contribution guide.

Initial Setup

Fork asdf on GitHub and/or Git clone the default branch:

shell
# 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:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

Install the tool version(s) with:

shell
asdf install
  • Node.js: JavaScript runtime built on Chrome's V8 JavaScript engine.

Install Node.js dependencies from docs/package.json:

shell
npm install

Development

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:

@code json{3-5}

To start the local development server:

shell
npm run dev

Format the code before committing:

shell
npm run format

Pull Requests, Releases & Conventional Commits

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>.

Vitepress

Configuration of the site is contained within a few TypeScript files with JS Objects used to represent the config. They are:

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.

I18n

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:

js
// 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:

shell
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.An0qw423.js b/assets/contribute_first-party-plugins.md.An0qw423.js new file mode 100644 index 00000000..c0831574 --- /dev/null +++ b/assets/contribute_first-party-plugins.md.An0qw423.js @@ -0,0 +1 @@ +import{_ as r,c as t,a2 as a,o as i}from"./chunks/framework.BQmytedh.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('

First-Party Plugins

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:

',5)]))}const g=r(o,[["render",s]]);export{u as __pageData,g as default}; diff --git a/assets/contribute_first-party-plugins.md.An0qw423.lean.js b/assets/contribute_first-party-plugins.md.An0qw423.lean.js new file mode 100644 index 00000000..c0831574 --- /dev/null +++ b/assets/contribute_first-party-plugins.md.An0qw423.lean.js @@ -0,0 +1 @@ +import{_ as r,c as t,a2 as a,o as i}from"./chunks/framework.BQmytedh.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('

First-Party Plugins

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:

',5)]))}const g=r(o,[["render",s]]);export{u as __pageData,g as default}; diff --git a/assets/contribute_github-actions.md.CIAqdwgh.js b/assets/contribute_github-actions.md.CIAqdwgh.js new file mode 100644 index 00000000..793b703c --- /dev/null +++ b/assets/contribute_github-actions.md.CIAqdwgh.js @@ -0,0 +1 @@ +import{_ as i,c as s,j as t,a as e,o as n}from"./chunks/framework.BQmytedh.js";const p=JSON.parse('{"title":"GitHub Actions","description":"","frontmatter":{},"headers":[],"relativePath":"contribute/github-actions.md","filePath":"contribute/github-actions.md","lastUpdated":1627017981000}'),o={name:"contribute/github-actions.md"};function r(c,a,u,d,l,h){return n(),s("div",null,a[0]||(a[0]=[t("h1",{id:"github-actions",tabindex:"-1"},[e("GitHub Actions "),t("a",{class:"header-anchor",href:"#github-actions","aria-label":'Permalink to "GitHub Actions"'},"​")],-1),t("p",null,[e("Thanks for your interest, please see the "),t("a",{href:"https://github.com/asdf-vm/actions",target:"_blank",rel:"noreferrer"},"asdf actions repo"),e(" for their existing Issues, conversations and Contributing Guidelines.")],-1)]))}const f=i(o,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/contribute_github-actions.md.CIAqdwgh.lean.js b/assets/contribute_github-actions.md.CIAqdwgh.lean.js new file mode 100644 index 00000000..793b703c --- /dev/null +++ b/assets/contribute_github-actions.md.CIAqdwgh.lean.js @@ -0,0 +1 @@ +import{_ as i,c as s,j as t,a as e,o as n}from"./chunks/framework.BQmytedh.js";const p=JSON.parse('{"title":"GitHub Actions","description":"","frontmatter":{},"headers":[],"relativePath":"contribute/github-actions.md","filePath":"contribute/github-actions.md","lastUpdated":1627017981000}'),o={name:"contribute/github-actions.md"};function r(c,a,u,d,l,h){return n(),s("div",null,a[0]||(a[0]=[t("h1",{id:"github-actions",tabindex:"-1"},[e("GitHub Actions "),t("a",{class:"header-anchor",href:"#github-actions","aria-label":'Permalink to "GitHub Actions"'},"​")],-1),t("p",null,[e("Thanks for your interest, please see the "),t("a",{href:"https://github.com/asdf-vm/actions",target:"_blank",rel:"noreferrer"},"asdf actions repo"),e(" for their existing Issues, conversations and Contributing Guidelines.")],-1)]))}const f=i(o,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/guide_getting-started.md.BDkIivLD.js b/assets/guide_getting-started.md.BDkIivLD.js new file mode 100644 index 00000000..946802e0 --- /dev/null +++ b/assets/guide_getting-started.md.BDkIivLD.js @@ -0,0 +1,13 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.BQmytedh.js";const c=JSON.parse('{"title":"Getting Started","description":"","frontmatter":{},"headers":[],"relativePath":"guide/getting-started.md","filePath":"guide/getting-started.md","lastUpdated":1734536933000}'),l={name:"guide/getting-started.md"};function n(h,s,o,p,d,r){return t(),a("div",null,s[0]||(s[0]=[e(`

Getting Started

asdf installation involves:

  1. Installing dependencies
  2. Downloading asdf core
  3. Installing asdf
  4. Installing a plugin for each tool/runtime you wish to manage
  5. Installing a version of the tool/runtime
  6. Setting global and project versions via .tool-versions config files

1. Install Dependencies

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).

OSPackage ManagerCommand
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

Note

sudo may be required depending on your system configuration.

2. Download asdf

Official Download

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.15.0

Community Supported Download Methods

We highly recommend using the official git method.

MethodCommand
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper

3. Install asdf

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.

Bash & Git

Add the following to ~/.bashrc:

shell
. "$HOME/.asdf/asdf.sh"

Completions must be configured by adding the following to your .bashrc:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

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:

shell
. "$HOME/.asdf/asdf.sh"

Completions must be configured manually with the following entry in your .bash_profile:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

Add asdf.sh to your ~/.bashrc with:

shell
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:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Bash & Homebrew (macOS)

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:

shell
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:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Bash & Pacman

Add the following to ~/.bashrc:

shell
. /opt/asdf-vm/asdf.sh

bash-completion needs to be installed for the completions to work.

Fish & Git

Add the following to ~/.config/fish/config.fish:

shell
source ~/.asdf/asdf.fish

Completions must be configured manually with the following command:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

Add asdf.fish to your ~/.config/fish/config.fish with:

shell
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

Completions are handled by Homebrew for the Fish shell. Friendly!

Fish & Pacman

Add the following to ~/.config/fish/config.fish:

shell
source /opt/asdf-vm/asdf.fish

Completions are automatically configured on installation by the AUR package.

Elvish & Git

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
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.

Elvish & Homebrew

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
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.

Elvish & Pacman

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
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.

ZSH & Git

Add the following to ~/.zshrc:

shell
. "$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:

shell
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • if you are using a custom compinit setup, ensure compinit is below your sourcing of asdf.sh
  • if you are using a custom compinit setup with a ZSH Framework, ensure compinit is below your sourcing of the framework

Warning

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.

ZSH & Homebrew

Add asdf.sh to your ~/.zshrc with:

shell
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.

ZSH & Pacman

Add the following to ~/.zshrc:

shell
. /opt/asdf-vm/asdf.sh

Completions are placed in a ZSH friendly location, but ZSH must be configured to use the autocompletions.

PowerShell Core & Git

Add the following to ~/.config/powershell/profile.ps1:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

Add asdf.sh to your ~/.config/powershell/profile.ps1 with:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

Add the following to ~/.config/powershell/profile.ps1:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

Add asdf.nu to your ~/.config/nushell/config.nu with:

shell
"\\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

Nushell & Homebrew

Add asdf.nu to your ~/.config/nushell/config.nu with:

shell
"\\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

Nushell & Pacman

Add asdf.nu to your ~/.config/nushell/config.nu with:

shell
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

Completions are automatically configured.

POSIX Shell & Git

Add the following to ~/.profile:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

Add asdf.sh to your ~/.profile with:

shell
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
POSIX Shell & Pacman

Add the following to ~/.profile:

shell
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 forcibly 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.

Core Installation Complete!

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.

4. Install a Plugin

For demonstration purposes we will install & set Node.js via the asdf-nodejs plugin.

Plugin Dependencies

Each plugin has dependencies so we need to check the plugin repo where they should be listed. For asdf-nodejs they are:

OSDependency Installation
Debianapt-get install dirmngr gpg curl gawk
CentOS/ Rocky Linux/ AlmaLinuxyum install gnupg2 curl gawk
macOSbrew install gpg gawk

We should install dependencies first as some Plugins have post-install hooks.

Install the Plugin

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. Install a Version

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:

shell
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.

6. Set a Version

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

Global defaults are managed in $HOME/.tool-versions. Set a global version with:

shell
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

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:

shell
asdf local nodejs latest

$PWD/.tool-versions will then look like:

nodejs 16.5.0

Using Existing Tool Version Files

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.

Guide Complete!

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:

`,82)]))}const g=i(l,[["render",n]]);export{c as __pageData,g as default}; diff --git a/assets/guide_getting-started.md.BDkIivLD.lean.js b/assets/guide_getting-started.md.BDkIivLD.lean.js new file mode 100644 index 00000000..946802e0 --- /dev/null +++ b/assets/guide_getting-started.md.BDkIivLD.lean.js @@ -0,0 +1,13 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.BQmytedh.js";const c=JSON.parse('{"title":"Getting Started","description":"","frontmatter":{},"headers":[],"relativePath":"guide/getting-started.md","filePath":"guide/getting-started.md","lastUpdated":1734536933000}'),l={name:"guide/getting-started.md"};function n(h,s,o,p,d,r){return t(),a("div",null,s[0]||(s[0]=[e(`

Getting Started

asdf installation involves:

  1. Installing dependencies
  2. Downloading asdf core
  3. Installing asdf
  4. Installing a plugin for each tool/runtime you wish to manage
  5. Installing a version of the tool/runtime
  6. Setting global and project versions via .tool-versions config files

1. Install Dependencies

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).

OSPackage ManagerCommand
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

Note

sudo may be required depending on your system configuration.

2. Download asdf

Official Download

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.15.0

Community Supported Download Methods

We highly recommend using the official git method.

MethodCommand
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper

3. Install asdf

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.

Bash & Git

Add the following to ~/.bashrc:

shell
. "$HOME/.asdf/asdf.sh"

Completions must be configured by adding the following to your .bashrc:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

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:

shell
. "$HOME/.asdf/asdf.sh"

Completions must be configured manually with the following entry in your .bash_profile:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

Add asdf.sh to your ~/.bashrc with:

shell
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:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Bash & Homebrew (macOS)

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:

shell
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:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Bash & Pacman

Add the following to ~/.bashrc:

shell
. /opt/asdf-vm/asdf.sh

bash-completion needs to be installed for the completions to work.

Fish & Git

Add the following to ~/.config/fish/config.fish:

shell
source ~/.asdf/asdf.fish

Completions must be configured manually with the following command:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

Add asdf.fish to your ~/.config/fish/config.fish with:

shell
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

Completions are handled by Homebrew for the Fish shell. Friendly!

Fish & Pacman

Add the following to ~/.config/fish/config.fish:

shell
source /opt/asdf-vm/asdf.fish

Completions are automatically configured on installation by the AUR package.

Elvish & Git

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
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.

Elvish & Homebrew

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
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.

Elvish & Pacman

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
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.

ZSH & Git

Add the following to ~/.zshrc:

shell
. "$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:

shell
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • if you are using a custom compinit setup, ensure compinit is below your sourcing of asdf.sh
  • if you are using a custom compinit setup with a ZSH Framework, ensure compinit is below your sourcing of the framework

Warning

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.

ZSH & Homebrew

Add asdf.sh to your ~/.zshrc with:

shell
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.

ZSH & Pacman

Add the following to ~/.zshrc:

shell
. /opt/asdf-vm/asdf.sh

Completions are placed in a ZSH friendly location, but ZSH must be configured to use the autocompletions.

PowerShell Core & Git

Add the following to ~/.config/powershell/profile.ps1:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

Add asdf.sh to your ~/.config/powershell/profile.ps1 with:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

Add the following to ~/.config/powershell/profile.ps1:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

Add asdf.nu to your ~/.config/nushell/config.nu with:

shell
"\\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

Nushell & Homebrew

Add asdf.nu to your ~/.config/nushell/config.nu with:

shell
"\\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

Nushell & Pacman

Add asdf.nu to your ~/.config/nushell/config.nu with:

shell
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

Completions are automatically configured.

POSIX Shell & Git

Add the following to ~/.profile:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

Add asdf.sh to your ~/.profile with:

shell
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
POSIX Shell & Pacman

Add the following to ~/.profile:

shell
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 forcibly 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.

Core Installation Complete!

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.

4. Install a Plugin

For demonstration purposes we will install & set Node.js via the asdf-nodejs plugin.

Plugin Dependencies

Each plugin has dependencies so we need to check the plugin repo where they should be listed. For asdf-nodejs they are:

OSDependency Installation
Debianapt-get install dirmngr gpg curl gawk
CentOS/ Rocky Linux/ AlmaLinuxyum install gnupg2 curl gawk
macOSbrew install gpg gawk

We should install dependencies first as some Plugins have post-install hooks.

Install the Plugin

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. Install a Version

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:

shell
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.

6. Set a Version

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

Global defaults are managed in $HOME/.tool-versions. Set a global version with:

shell
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

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:

shell
asdf local nodejs latest

$PWD/.tool-versions will then look like:

nodejs 16.5.0

Using Existing Tool Version Files

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.

Guide Complete!

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:

`,82)]))}const g=i(l,[["render",n]]);export{c as __pageData,g as default}; diff --git a/assets/guide_introduction.md.BED2HKpc.js b/assets/guide_introduction.md.BED2HKpc.js new file mode 100644 index 00000000..64cdf452 --- /dev/null +++ b/assets/guide_introduction.md.BED2HKpc.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as t,o as n}from"./chunks/framework.BQmytedh.js";const p=JSON.parse('{"title":"Introduction","description":"","frontmatter":{},"headers":[],"relativePath":"guide/introduction.md","filePath":"guide/introduction.md","lastUpdated":1629230537000}'),r={name:"guide/introduction.md"};function i(s,e,d,c,l,h){return n(),o("div",null,e[0]||(e[0]=[t('

Introduction

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.

How It Works

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.

nvm / n / rbenv etc

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.

direnv

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.

Homebrew

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.

NixOS

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.

Why use asdf?

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.

',25)]))}const m=a(r,[["render",i]]);export{p as __pageData,m as default}; diff --git a/assets/guide_introduction.md.BED2HKpc.lean.js b/assets/guide_introduction.md.BED2HKpc.lean.js new file mode 100644 index 00000000..64cdf452 --- /dev/null +++ b/assets/guide_introduction.md.BED2HKpc.lean.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as t,o as n}from"./chunks/framework.BQmytedh.js";const p=JSON.parse('{"title":"Introduction","description":"","frontmatter":{},"headers":[],"relativePath":"guide/introduction.md","filePath":"guide/introduction.md","lastUpdated":1629230537000}'),r={name:"guide/introduction.md"};function i(s,e,d,c,l,h){return n(),o("div",null,e[0]||(e[0]=[t('

Introduction

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.

How It Works

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.

nvm / n / rbenv etc

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.

direnv

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.

Homebrew

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.

NixOS

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.

Why use asdf?

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.

',25)]))}const m=a(r,[["render",i]]);export{p as __pageData,m as default}; diff --git a/assets/guide_upgrading-from-v0-15-to-v0-16.md.BSJSfnUt.js b/assets/guide_upgrading-from-v0-15-to-v0-16.md.BSJSfnUt.js new file mode 100644 index 00000000..c43b3d57 --- /dev/null +++ b/assets/guide_upgrading-from-v0-15-to-v0-16.md.BSJSfnUt.js @@ -0,0 +1 @@ +import{_ as a,c as s,a2 as n,o}from"./chunks/framework.BQmytedh.js";const u=JSON.parse('{"title":"Upgrading From Version 0.15.x to 0.16.0","description":"","frontmatter":{},"headers":[],"relativePath":"guide/upgrading-from-v0-15-to-v0-16.md","filePath":"guide/upgrading-from-v0-15-to-v0-16.md","lastUpdated":1734549004000}'),t={name:"guide/upgrading-from-v0-15-to-v0-16.md"};function i(d,e,l,r,c,h){return o(),s("div",null,e[0]||(e[0]=[n('

Upgrading From Version 0.15.x to 0.16.0

asdf versions 0.15.0 and older were written in Bash and distributed as a set of Bash scripts with the asdf function loaded into your shell. asdf version 0.15.0 is a complete rewrite of asdf in Go. Since it is a complete rewrite there are a number of breaking changes and it is now distributed as a binary rather than a set of scripts.

Breaking Changes

download is now a required callback for plugins

Previously download was optional, now it is required. If a plugin lacks this callback any installs of any version of that plugin will fail.

Hyphenated commands have been removed

asdf version 0.15.0 and earlier supported by hyphenated and non-hyphenated versions of certain commands. With version 0.15.0 only the non-hyphenated versions are supported. The affected commands:

  • asdf list-all -> asdf list all
  • asdf plugin-add -> asdf plugin add
  • asdf plugin-list -> asdf plugin list
  • asdf plugin-list-all -> asdf plugin list all
  • asdf plugin-update -> asdf plugin update
  • asdf plugin-remove -> asdf plugin remove
  • asdf plugin-test -> asdf plugin test
  • asdf shim-versions -> asdf shimversions

asdf global and asdf local commands have been removed

asdf global and asdf local have been removed. The "global" and "local" terminology was wrong and also misleading. asdf doesn't actually support "global" versions that apply everywhere. Any version that was specified with asdf global could easily be overridden by a .tool-versions file in your current directory specifying a different version. This was confusing to users. The plan is to introduce an asdf set command in the near future that better conveys how asdf works and provides similar functionality to asdf global and asdf local.

asdf update command has been removed

Updates can no longer be performed this way. Use your OS package manager or download the latest binary manually. Additionally, the asdf update command present in versions 0.15.0 and older cannot upgrade to version 0.15.0 because the install process has changed. You cannot upgrade to the latest Go implementation using asdf update.

asdf shell command has been removed

This command actually set an environment variable in the user's current shell session. It was able to do this because asdf was actually a shell function, not an executable. The new rewrite removes all shell code from asdf, and it is now a binary rather than a shell function, so setting environment variables directly in the shell is no longer possible.

asdf current has changed

Instead of three columns in the output, with the last being either the location the version is set or a suggested command that could be run to set or install a version. The third column has been split into two columns. The third column now only indicates the source of the version if it is set (typically either version file or environment variable) and the fourth is a boolean indicating whether the specified version is actually installed. If it is not installed, a suggested install command is shown.

Plugin extension commands must now be prefixed with cmd

Previously plugin extension commands could be run like this:

asdf nodejs nodebuild --version

Now they must be prefixed with cmd to avoid causing confusion with built-in commands:

asdf cmd nodejs nodebuild --version

Extension commands have been redesigned

There are a number of breaking changes for plugin extension commands:

  • They must be runnable by exec syscall. If your extension commands are shell scripts in order to be run with exec they must start with a proper shebang line.
  • They can now be binaries or scripts in any language. It no longer makes sense to require a .bash extension as it is misleading.
  • They must have executable permission set.
  • They are no longer sourced by asdf as Bash scripts when they lack executable permission.

Additionally, only the first argument after plugin name is used to determine the extension command to run. This means effectively there is the default command extension command that asdf defaults to when no command matching the first argument after plugin name is found. For example:

foo/\n  lib/commands/\n    command\n    command-bar\n    command-bat-man

Previously these scripts would work like this:

$ asdf cmd foo         # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command`\n$ asdf cmd foo bar     # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bar`\n$ asdf cmd foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man`

Now:

$ asdf cmd foo         # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command`\n$ asdf cmd foo bar     # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bar`\n$ asdf cmd foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command bat man`

Executables Shims Resolve to Must Runnable by syscall.Exec

The most obvious example of this breaking change are scripts that lack a proper shebang line. asdf 0.15.0 and older were implemented in Bash, so as long it was an executable that could be executed with Bash it would run. This mean that scripts lacking a shebang could still be run by asdf exec. With asdf 0.15.x implemented in Go we now invoke executables via Go's syscall.Exec function, which cannot handle scripts lacking a shebang.

In practice this isn't much of a problem. Most shell scripts DO contain a shebang line. If a tool managed by asdf provides scripts that don't have a shebang line one will need to be added to them.

Custom shim templates are no longer supported

This was a rarely used feature. The only plugin maintained by the core team that used it was the Elixir plugin, and it no longer needs it. This feature was originally added so that shim that get evaluated by a program rather than executed contain code that is suitable for evaluation by a particular program (in the case of Elixir this was the iex shell). Upon further investigation it seems this feature only exists because the PATH for executables was sometimes improperly set to include the shims rather than the other executables for the selected version(s).

Installation

Installation of version 0.15.0 is much simpler than previous versions of asdf. It's just three steps:

  • Download the appropriate asdf binary for your operating system/architecture combo and place it in a directory on your $PATH
  • Set ASDF_DATA_DIR to the directory you'd like asdf to install plugins, versions, and shims.
  • Add $ASDF_DATA_DIR/shims to the front of your `$PATH.

If your operating system's package manager already offers asdf 0.15.0 that is probably the best method for installing it. Upgrading asdf is now only possible via OS package managers and manual installation. There is no self-upgrade feature.

Upgrading Without Losing Data

You can upgrade to the latest version of asdf without losing your existing install data. It's the same sequence of steps as above.

1. Download the appropriate asdf binary for your operating system & architecture

Download the binary and place it in a directory on your path. I chose to place the asdf binary in $HOME/bin and then added $HOME/bin to the front of my $PATH:

# In .zshrc, .bashrc, etc...\nexport PATH="$HOME/bin:$PATH"`

2. Set ASDF_DATA_DIR

Run asdf info and copy the line containing the ASDF_DATA_DIR variable:

...\nASDF_DATA_DIR="/home/myuser/.asdf"\n...

In your shell RC file (.zshrc if Zsh, .bashrc if Bash, etc...) add a line to the end setting ASDF_DATA_DIR to that same value:

bash
export ASDF_DATA_DIR="/home/myuser/.asdf"

3. Add $ASDF_DATA_DIR/shims to the front of your `$PATH

In your shell RC file (same file as step #2) add $ASDF_DATA_DIR/shims to the front of your path:

bash
export ASDF_DATA_DIR="/home/myuser/.asdf"\nexport PATH="$ASDF_DATA_DIR/shims:$PATH"

Testing

If you aren't sure if the upgrade to 0.15.0 will break things for you can you can test by installing 0.15.0 in addition to your existing version as described above in "Upgrading Without Losing Data". If it turns out that the upgrade to 0.15.0 breaks things for you simply remove the lines you added to your shell RC file.

',54)]))}const m=a(t,[["render",i]]);export{u as __pageData,m as default}; diff --git a/assets/guide_upgrading-from-v0-15-to-v0-16.md.BSJSfnUt.lean.js b/assets/guide_upgrading-from-v0-15-to-v0-16.md.BSJSfnUt.lean.js new file mode 100644 index 00000000..c43b3d57 --- /dev/null +++ b/assets/guide_upgrading-from-v0-15-to-v0-16.md.BSJSfnUt.lean.js @@ -0,0 +1 @@ +import{_ as a,c as s,a2 as n,o}from"./chunks/framework.BQmytedh.js";const u=JSON.parse('{"title":"Upgrading From Version 0.15.x to 0.16.0","description":"","frontmatter":{},"headers":[],"relativePath":"guide/upgrading-from-v0-15-to-v0-16.md","filePath":"guide/upgrading-from-v0-15-to-v0-16.md","lastUpdated":1734549004000}'),t={name:"guide/upgrading-from-v0-15-to-v0-16.md"};function i(d,e,l,r,c,h){return o(),s("div",null,e[0]||(e[0]=[n('

Upgrading From Version 0.15.x to 0.16.0

asdf versions 0.15.0 and older were written in Bash and distributed as a set of Bash scripts with the asdf function loaded into your shell. asdf version 0.15.0 is a complete rewrite of asdf in Go. Since it is a complete rewrite there are a number of breaking changes and it is now distributed as a binary rather than a set of scripts.

Breaking Changes

download is now a required callback for plugins

Previously download was optional, now it is required. If a plugin lacks this callback any installs of any version of that plugin will fail.

Hyphenated commands have been removed

asdf version 0.15.0 and earlier supported by hyphenated and non-hyphenated versions of certain commands. With version 0.15.0 only the non-hyphenated versions are supported. The affected commands:

  • asdf list-all -> asdf list all
  • asdf plugin-add -> asdf plugin add
  • asdf plugin-list -> asdf plugin list
  • asdf plugin-list-all -> asdf plugin list all
  • asdf plugin-update -> asdf plugin update
  • asdf plugin-remove -> asdf plugin remove
  • asdf plugin-test -> asdf plugin test
  • asdf shim-versions -> asdf shimversions

asdf global and asdf local commands have been removed

asdf global and asdf local have been removed. The "global" and "local" terminology was wrong and also misleading. asdf doesn't actually support "global" versions that apply everywhere. Any version that was specified with asdf global could easily be overridden by a .tool-versions file in your current directory specifying a different version. This was confusing to users. The plan is to introduce an asdf set command in the near future that better conveys how asdf works and provides similar functionality to asdf global and asdf local.

asdf update command has been removed

Updates can no longer be performed this way. Use your OS package manager or download the latest binary manually. Additionally, the asdf update command present in versions 0.15.0 and older cannot upgrade to version 0.15.0 because the install process has changed. You cannot upgrade to the latest Go implementation using asdf update.

asdf shell command has been removed

This command actually set an environment variable in the user's current shell session. It was able to do this because asdf was actually a shell function, not an executable. The new rewrite removes all shell code from asdf, and it is now a binary rather than a shell function, so setting environment variables directly in the shell is no longer possible.

asdf current has changed

Instead of three columns in the output, with the last being either the location the version is set or a suggested command that could be run to set or install a version. The third column has been split into two columns. The third column now only indicates the source of the version if it is set (typically either version file or environment variable) and the fourth is a boolean indicating whether the specified version is actually installed. If it is not installed, a suggested install command is shown.

Plugin extension commands must now be prefixed with cmd

Previously plugin extension commands could be run like this:

asdf nodejs nodebuild --version

Now they must be prefixed with cmd to avoid causing confusion with built-in commands:

asdf cmd nodejs nodebuild --version

Extension commands have been redesigned

There are a number of breaking changes for plugin extension commands:

  • They must be runnable by exec syscall. If your extension commands are shell scripts in order to be run with exec they must start with a proper shebang line.
  • They can now be binaries or scripts in any language. It no longer makes sense to require a .bash extension as it is misleading.
  • They must have executable permission set.
  • They are no longer sourced by asdf as Bash scripts when they lack executable permission.

Additionally, only the first argument after plugin name is used to determine the extension command to run. This means effectively there is the default command extension command that asdf defaults to when no command matching the first argument after plugin name is found. For example:

foo/\n  lib/commands/\n    command\n    command-bar\n    command-bat-man

Previously these scripts would work like this:

$ asdf cmd foo         # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command`\n$ asdf cmd foo bar     # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bar`\n$ asdf cmd foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man`

Now:

$ asdf cmd foo         # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command`\n$ asdf cmd foo bar     # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bar`\n$ asdf cmd foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command bat man`

Executables Shims Resolve to Must Runnable by syscall.Exec

The most obvious example of this breaking change are scripts that lack a proper shebang line. asdf 0.15.0 and older were implemented in Bash, so as long it was an executable that could be executed with Bash it would run. This mean that scripts lacking a shebang could still be run by asdf exec. With asdf 0.15.x implemented in Go we now invoke executables via Go's syscall.Exec function, which cannot handle scripts lacking a shebang.

In practice this isn't much of a problem. Most shell scripts DO contain a shebang line. If a tool managed by asdf provides scripts that don't have a shebang line one will need to be added to them.

Custom shim templates are no longer supported

This was a rarely used feature. The only plugin maintained by the core team that used it was the Elixir plugin, and it no longer needs it. This feature was originally added so that shim that get evaluated by a program rather than executed contain code that is suitable for evaluation by a particular program (in the case of Elixir this was the iex shell). Upon further investigation it seems this feature only exists because the PATH for executables was sometimes improperly set to include the shims rather than the other executables for the selected version(s).

Installation

Installation of version 0.15.0 is much simpler than previous versions of asdf. It's just three steps:

  • Download the appropriate asdf binary for your operating system/architecture combo and place it in a directory on your $PATH
  • Set ASDF_DATA_DIR to the directory you'd like asdf to install plugins, versions, and shims.
  • Add $ASDF_DATA_DIR/shims to the front of your `$PATH.

If your operating system's package manager already offers asdf 0.15.0 that is probably the best method for installing it. Upgrading asdf is now only possible via OS package managers and manual installation. There is no self-upgrade feature.

Upgrading Without Losing Data

You can upgrade to the latest version of asdf without losing your existing install data. It's the same sequence of steps as above.

1. Download the appropriate asdf binary for your operating system & architecture

Download the binary and place it in a directory on your path. I chose to place the asdf binary in $HOME/bin and then added $HOME/bin to the front of my $PATH:

# In .zshrc, .bashrc, etc...\nexport PATH="$HOME/bin:$PATH"`

2. Set ASDF_DATA_DIR

Run asdf info and copy the line containing the ASDF_DATA_DIR variable:

...\nASDF_DATA_DIR="/home/myuser/.asdf"\n...

In your shell RC file (.zshrc if Zsh, .bashrc if Bash, etc...) add a line to the end setting ASDF_DATA_DIR to that same value:

bash
export ASDF_DATA_DIR="/home/myuser/.asdf"

3. Add $ASDF_DATA_DIR/shims to the front of your `$PATH

In your shell RC file (same file as step #2) add $ASDF_DATA_DIR/shims to the front of your path:

bash
export ASDF_DATA_DIR="/home/myuser/.asdf"\nexport PATH="$ASDF_DATA_DIR/shims:$PATH"

Testing

If you aren't sure if the upgrade to 0.15.0 will break things for you can you can test by installing 0.15.0 in addition to your existing version as described above in "Upgrading Without Losing Data". If it turns out that the upgrade to 0.15.0 breaks things for you simply remove the lines you added to your shell RC file.

',54)]))}const m=a(t,[["render",i]]);export{u as __pageData,m as default}; diff --git a/assets/index.md.Bl7STBtd.js b/assets/index.md.Bl7STBtd.js new file mode 100644 index 00000000..14d80acc --- /dev/null +++ b/assets/index.md.Bl7STBtd.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as i}from"./chunks/framework.BQmytedh.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"asdf","text":"The Multiple Runtime Version Manager","tagline":"Manage all your runtime versions with one tool!","actions":[{"theme":"brand","text":"Get Started","link":"/guide/getting-started"},{"theme":"alt","text":"What is asdf?","link":"/guide/introduction"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/asdf-vm/asdf"}]},"features":[{"title":"One Tool","details":"Manage each of your project runtimes with a single CLI tool and command interface.","icon":"🎉"},{"title":"Plugins","details":"Large ecosystem of existing runtimes & tools. Simple API to add support for new tools as you need!","icon":"🔌"},{"title":"Backwards Compatible","details":"Support for existing config files .nvmrc, .node-version, .ruby-version for smooth migration!","icon":"⏮"},{"title":"One Config File","details":".tool-versions to manage all your tools, runtimes and their versions in a single, sharable place.","icon":"📄"},{"title":"Shells","details":"Supports Bash, ZSH, Fish & Elvish with completions available.","icon":"🐚"},{"title":"GitHub Actions","details":"Provides a GitHub Action to install and utilize your .tool-versions in your CI/CD workflows.","icon":"🤖"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1700090238000}'),o={name:"index.md"};function n(a,s,l,r,d,c){return i(),t("div")}const p=e(o,[["render",n]]);export{u as __pageData,p as default}; diff --git a/assets/index.md.Bl7STBtd.lean.js b/assets/index.md.Bl7STBtd.lean.js new file mode 100644 index 00000000..14d80acc --- /dev/null +++ b/assets/index.md.Bl7STBtd.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as i}from"./chunks/framework.BQmytedh.js";const u=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"asdf","text":"The Multiple Runtime Version Manager","tagline":"Manage all your runtime versions with one tool!","actions":[{"theme":"brand","text":"Get Started","link":"/guide/getting-started"},{"theme":"alt","text":"What is asdf?","link":"/guide/introduction"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/asdf-vm/asdf"}]},"features":[{"title":"One Tool","details":"Manage each of your project runtimes with a single CLI tool and command interface.","icon":"🎉"},{"title":"Plugins","details":"Large ecosystem of existing runtimes & tools. Simple API to add support for new tools as you need!","icon":"🔌"},{"title":"Backwards Compatible","details":"Support for existing config files .nvmrc, .node-version, .ruby-version for smooth migration!","icon":"⏮"},{"title":"One Config File","details":".tool-versions to manage all your tools, runtimes and their versions in a single, sharable place.","icon":"📄"},{"title":"Shells","details":"Supports Bash, ZSH, Fish & Elvish with completions available.","icon":"🐚"},{"title":"GitHub Actions","details":"Provides a GitHub Action to install and utilize your .tool-versions in your CI/CD workflows.","icon":"🤖"}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1700090238000}'),o={name:"index.md"};function n(a,s,l,r,d,c){return i(),t("div")}const p=e(o,[["render",n]]);export{u as __pageData,p as default}; diff --git a/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 b/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 new file mode 100644 index 00000000..b6b603d5 Binary files /dev/null and b/assets/inter-italic-cyrillic-ext.r48I6akx.woff2 differ diff --git a/assets/inter-italic-cyrillic.By2_1cv3.woff2 b/assets/inter-italic-cyrillic.By2_1cv3.woff2 new file mode 100644 index 00000000..def40a4f Binary files /dev/null and b/assets/inter-italic-cyrillic.By2_1cv3.woff2 differ diff --git a/assets/inter-italic-greek-ext.1u6EdAuj.woff2 b/assets/inter-italic-greek-ext.1u6EdAuj.woff2 new file mode 100644 index 00000000..e070c3d3 Binary files /dev/null and b/assets/inter-italic-greek-ext.1u6EdAuj.woff2 differ diff --git a/assets/inter-italic-greek.DJ8dCoTZ.woff2 b/assets/inter-italic-greek.DJ8dCoTZ.woff2 new file mode 100644 index 00000000..a3c16ca4 Binary files /dev/null and b/assets/inter-italic-greek.DJ8dCoTZ.woff2 differ diff --git a/assets/inter-italic-latin-ext.CN1xVJS-.woff2 b/assets/inter-italic-latin-ext.CN1xVJS-.woff2 new file mode 100644 index 00000000..2210a899 Binary files /dev/null and b/assets/inter-italic-latin-ext.CN1xVJS-.woff2 differ diff --git a/assets/inter-italic-latin.C2AdPX0b.woff2 b/assets/inter-italic-latin.C2AdPX0b.woff2 new file mode 100644 index 00000000..790d62dc Binary files /dev/null and b/assets/inter-italic-latin.C2AdPX0b.woff2 differ diff --git a/assets/inter-italic-vietnamese.BSbpV94h.woff2 b/assets/inter-italic-vietnamese.BSbpV94h.woff2 new file mode 100644 index 00000000..1eec0775 Binary files /dev/null and b/assets/inter-italic-vietnamese.BSbpV94h.woff2 differ diff --git a/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 b/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 new file mode 100644 index 00000000..2cfe6153 Binary files /dev/null and b/assets/inter-roman-cyrillic-ext.BBPuwvHQ.woff2 differ diff --git a/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 b/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 new file mode 100644 index 00000000..e3886dd1 Binary files /dev/null and b/assets/inter-roman-cyrillic.C5lxZ8CY.woff2 differ diff --git a/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 b/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 new file mode 100644 index 00000000..36d67487 Binary files /dev/null and b/assets/inter-roman-greek-ext.CqjqNYQ-.woff2 differ diff --git a/assets/inter-roman-greek.BBVDIX6e.woff2 b/assets/inter-roman-greek.BBVDIX6e.woff2 new file mode 100644 index 00000000..2bed1e85 Binary files /dev/null and b/assets/inter-roman-greek.BBVDIX6e.woff2 differ diff --git a/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 b/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 new file mode 100644 index 00000000..9a8d1e2b Binary files /dev/null and b/assets/inter-roman-latin-ext.4ZJIpNVo.woff2 differ diff --git a/assets/inter-roman-latin.Di8DUHzh.woff2 b/assets/inter-roman-latin.Di8DUHzh.woff2 new file mode 100644 index 00000000..07d3c53a Binary files /dev/null and b/assets/inter-roman-latin.Di8DUHzh.woff2 differ diff --git a/assets/inter-roman-vietnamese.BjW4sHH5.woff2 b/assets/inter-roman-vietnamese.BjW4sHH5.woff2 new file mode 100644 index 00000000..57bdc22a Binary files /dev/null and b/assets/inter-roman-vietnamese.BjW4sHH5.woff2 differ diff --git a/assets/ja-jp_contribute_core.md.CJW3eeff.js b/assets/ja-jp_contribute_core.md.CJW3eeff.js new file mode 100644 index 00000000..7a499b47 --- /dev/null +++ b/assets/ja-jp_contribute_core.md.CJW3eeff.js @@ -0,0 +1,31 @@ +import{_ as a,c as e,a2 as i,o as t}from"./chunks/framework.BQmytedh.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

これは、asdfコアのコントリビューションガイドです。

初期セットアップ

GitHubでasdfをフォークするか、デフォルトのブランチをGitクローンしてください:

shell
# 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自身でこれらのツールを管理したい場合は、下記のようにプラグインを追加してください:

shell
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の開発に必要なバージョンを、下記のようにインストールします:

shell
asdf install

開発ツールに影響を与える特定の機能を壊す可能性もあるため、ローカルマシンで開発する際は、asdfを使用しないほうが 良いかもしれません 。下記に、使用しているツールを列挙します:

  • bats-core: BashまたはPOSIX準拠のスクリプトを単体テストするための、Bash自動テストシステムです。
  • shellcheck: シェルスクリプトの静的解析ツールです。
  • shfmt: Bashをサポートするシェルパーサ、フォーマッタ、インタプリタです。

開発

インストール済みのasdfに変更を加えずに、あなたが開発した変更内容を試したいときは、$ASDF_DIR変数に、クローンしたリポジトリのパスを設定し、そのディレクトリのbinshimsディレクトリを一時的にパスの先頭へ追加します。

リモートにコミットまたはプッシュする前に、コードをローカルでフォーマット、Lint、およびテストすることを推奨します。その際は、次のスクリプト/コマンドを使用してください:

shell
# 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のドキュメントもご覧ください。

Gitignore

下記は、asdf-vm/asdfリポジトリの.gitignoreファイルです。プロジェクト固有のファイルは無視をしています。使用しているOS、ツール、およびワークフロー固有のファイルは、グローバルな.gitignore構成で無視する必要があります。詳しくはこちらをご覧ください。

@Gitignoreコード

.git-blame-ignore-revs

asdfでは、.git-blame-ignore-revsを使用して、Blameを実行する際のノイズを減らしています。詳しくは、git blameのドキュメントをご覧ください。

git blameを実行するときは、下記のように、このファイルと共に使います:

sh
git blame --ignore-revs-file .git-blame-ignore-revs ./test/install_command.bats

毎回手動でファイルを指定しなくても、gitのオプションで、blameを呼び出すたびにこのファイルを使うように設定することもできます:

sh
git config blame.ignoreRevsFile .git-blame-ignore-revs

このファイルを使用するように、IDEを設定することもできます。例えば、VSCode(およびGitLens)を使う場合は、.vscode/settings.jsonに下記のように記述します:

json
{
+  "gitlens.advanced.blame.customArguments": [
+    "--ignore-revs-file",
+    ".git-blame-ignore-revs"
+  ]
+}

Batsテスト

ローカルでテストを実行するには、下記のようにテストを呼び出します:

shell
./scripts/test.bash

テストを作成する前に、下記項目を一通り参照してください:

Batsのヒント

Batsでのデバッグは、難しいことがあります。-tフラグを指定してTAP出力を有効にすると、テスト実行中に特殊なファイルディスクリプタ>&3を使用して出力を表示できるため、デバッグが簡単になります。例えば次のとおりです:

shell
# 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で説明されています。

プルリクエスト、リリース、Conventional Commits

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>の種類は次のとおりです: featfixdocsstylerefactorperftestbuildcichorerevert

  • !: 破壊的変更を示します
  • fix: セマンティックバージョンのpatchを新しく作成します
  • feat: セマンティックバージョンのminorを新しく作成します
  • <type>!: セマンティックバージョンのmajorを新しく作成します

プルリクエストのタイトルは、このフォーマットに従う必要があります。

ヒント

プルリクエストのタイトルには、Conventional Commit messageのフォーマットを使用してください。

Dockerイメージ

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.CJW3eeff.lean.js b/assets/ja-jp_contribute_core.md.CJW3eeff.lean.js new file mode 100644 index 00000000..7a499b47 --- /dev/null +++ b/assets/ja-jp_contribute_core.md.CJW3eeff.lean.js @@ -0,0 +1,31 @@ +import{_ as a,c as e,a2 as i,o as t}from"./chunks/framework.BQmytedh.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

これは、asdfコアのコントリビューションガイドです。

初期セットアップ

GitHubでasdfをフォークするか、デフォルトのブランチをGitクローンしてください:

shell
# 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自身でこれらのツールを管理したい場合は、下記のようにプラグインを追加してください:

shell
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の開発に必要なバージョンを、下記のようにインストールします:

shell
asdf install

開発ツールに影響を与える特定の機能を壊す可能性もあるため、ローカルマシンで開発する際は、asdfを使用しないほうが 良いかもしれません 。下記に、使用しているツールを列挙します:

  • bats-core: BashまたはPOSIX準拠のスクリプトを単体テストするための、Bash自動テストシステムです。
  • shellcheck: シェルスクリプトの静的解析ツールです。
  • shfmt: Bashをサポートするシェルパーサ、フォーマッタ、インタプリタです。

開発

インストール済みのasdfに変更を加えずに、あなたが開発した変更内容を試したいときは、$ASDF_DIR変数に、クローンしたリポジトリのパスを設定し、そのディレクトリのbinshimsディレクトリを一時的にパスの先頭へ追加します。

リモートにコミットまたはプッシュする前に、コードをローカルでフォーマット、Lint、およびテストすることを推奨します。その際は、次のスクリプト/コマンドを使用してください:

shell
# 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のドキュメントもご覧ください。

Gitignore

下記は、asdf-vm/asdfリポジトリの.gitignoreファイルです。プロジェクト固有のファイルは無視をしています。使用しているOS、ツール、およびワークフロー固有のファイルは、グローバルな.gitignore構成で無視する必要があります。詳しくはこちらをご覧ください。

@Gitignoreコード

.git-blame-ignore-revs

asdfでは、.git-blame-ignore-revsを使用して、Blameを実行する際のノイズを減らしています。詳しくは、git blameのドキュメントをご覧ください。

git blameを実行するときは、下記のように、このファイルと共に使います:

sh
git blame --ignore-revs-file .git-blame-ignore-revs ./test/install_command.bats

毎回手動でファイルを指定しなくても、gitのオプションで、blameを呼び出すたびにこのファイルを使うように設定することもできます:

sh
git config blame.ignoreRevsFile .git-blame-ignore-revs

このファイルを使用するように、IDEを設定することもできます。例えば、VSCode(およびGitLens)を使う場合は、.vscode/settings.jsonに下記のように記述します:

json
{
+  "gitlens.advanced.blame.customArguments": [
+    "--ignore-revs-file",
+    ".git-blame-ignore-revs"
+  ]
+}

Batsテスト

ローカルでテストを実行するには、下記のようにテストを呼び出します:

shell
./scripts/test.bash

テストを作成する前に、下記項目を一通り参照してください:

Batsのヒント

Batsでのデバッグは、難しいことがあります。-tフラグを指定してTAP出力を有効にすると、テスト実行中に特殊なファイルディスクリプタ>&3を使用して出力を表示できるため、デバッグが簡単になります。例えば次のとおりです:

shell
# 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で説明されています。

プルリクエスト、リリース、Conventional Commits

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>の種類は次のとおりです: featfixdocsstylerefactorperftestbuildcichorerevert

  • !: 破壊的変更を示します
  • fix: セマンティックバージョンのpatchを新しく作成します
  • feat: セマンティックバージョンのminorを新しく作成します
  • <type>!: セマンティックバージョンのmajorを新しく作成します

プルリクエストのタイトルは、このフォーマットに従う必要があります。

ヒント

プルリクエストのタイトルには、Conventional Commit messageのフォーマットを使用してください。

Dockerイメージ

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.DpQ3bmph.js b/assets/ja-jp_contribute_documentation.md.DpQ3bmph.js new file mode 100644 index 00000000..7c7f5a10 --- /dev/null +++ b/assets/ja-jp_contribute_documentation.md.DpQ3bmph.js @@ -0,0 +1,42 @@ +import{_ as i,c as a,a2 as n,o as e}from"./chunks/framework.BQmytedh.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クローンしてください:

shell
# 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で管理されています。下記のようにプラグインを追加してください:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

開発に必要なバージョンを、下記のようにインストールします:

shell
asdf install
  • Node.js: ChromeのV8 JavaScriptエンジンをベースに構築されたJavaScriptランタイムです。

docs/package.jsonをもとに、Node.jsの依存関係をインストールしてください:

shell
npm install

開発

VitePress (v2)は、asdfドキュメントサイトを構築するために使用している静的サイトジェネレータ(SSG)です。類似ツールであるDocsify.jsやVuePressに代わってVitePressが採用されたのは、ユーザがJavaScriptを使用できない、または有効にしていない場合に、HTMLのみのフォールバックをサポートしたいからでした。これは、DocsifyとVitePressがVuePressに急速に取って代わっていた場合には不可能でした。これ以外の機能セットはほとんど同じで、最小限の構成でMarkdownファイルを書くことに重点を置いています。

package.jsonには、開発に必要なスクリプトが含まれています:

@package.jsonのコード

ローカルの開発サーバを起動するには、次のように実行します:

shell
npm run dev

コミットする前にコードをフォーマットするには、次のように実行します:

shell
npm run format

プルリクエスト、リリース、Conventional Commits

asdfは、プルリクエストタイトルのConventional Commitsに依存する自動リリースパイプラインを使用しています。詳しくは、コアのコントリビューションガイドのドキュメントに記述されています。

ドキュメントの変更に関するプルリクエストを作成する場合、プルリクエストのタイトルは、Conventional Commit typeをdocsとして、docs: <description>というフォーマットで作成するようにしてください。

Vitepress

サイトの構成設定は、構成を示すために使用されるJSオブジェクト含んだ、いくつかのTypeScriptファイルに記述されています。以下のとおりです:

  • docs/.vitepress/config.js: サイトのルート構成ファイルです。仕様については、VitePressのドキュメントをご覧ください。

ルート構成ファイルを簡素化するために、 Navバーサイドバー の構成を示す大きなJSオブジェクトについては、別ファイルに切り出されており、かつ、ロケールごとに分類されています。次の両方のファイルを参照してください:

  • docs/.vitepress/navbars.js
  • docs/.vitepress/sidebars.js

これらの構成設定に関する公式ドキュメントは、Default Theme Referenceをご覧ください。

I18n

VitePressは、国際化対応に関して最高のサポートを備えています。 ルート構成ファイルであるdocs/.vitepress/config.jsでは、サポートされているロケールとそのURL、ドロップメニューのタイトル、Navバー/サイドバーの構成への参照を定義しています。

Navバー/サイドバーの構成設定は前述の構成ファイルにキャプチャされ、ロケールごとに分類され、個別にエクスポートされます。

各ロケールのMarkdownコンテンツは、ルート構成ファイル内のlocales内のキーと同じ名前のディレクトリ配下に配置する必要があります。ルート構成が下記の場合:

js
// 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ファイルのセットを配置する必要があります:

shell
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.DpQ3bmph.lean.js b/assets/ja-jp_contribute_documentation.md.DpQ3bmph.lean.js new file mode 100644 index 00000000..7c7f5a10 --- /dev/null +++ b/assets/ja-jp_contribute_documentation.md.DpQ3bmph.lean.js @@ -0,0 +1,42 @@ +import{_ as i,c as a,a2 as n,o as e}from"./chunks/framework.BQmytedh.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クローンしてください:

shell
# 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で管理されています。下記のようにプラグインを追加してください:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

開発に必要なバージョンを、下記のようにインストールします:

shell
asdf install
  • Node.js: ChromeのV8 JavaScriptエンジンをベースに構築されたJavaScriptランタイムです。

docs/package.jsonをもとに、Node.jsの依存関係をインストールしてください:

shell
npm install

開発

VitePress (v2)は、asdfドキュメントサイトを構築するために使用している静的サイトジェネレータ(SSG)です。類似ツールであるDocsify.jsやVuePressに代わってVitePressが採用されたのは、ユーザがJavaScriptを使用できない、または有効にしていない場合に、HTMLのみのフォールバックをサポートしたいからでした。これは、DocsifyとVitePressがVuePressに急速に取って代わっていた場合には不可能でした。これ以外の機能セットはほとんど同じで、最小限の構成でMarkdownファイルを書くことに重点を置いています。

package.jsonには、開発に必要なスクリプトが含まれています:

@package.jsonのコード

ローカルの開発サーバを起動するには、次のように実行します:

shell
npm run dev

コミットする前にコードをフォーマットするには、次のように実行します:

shell
npm run format

プルリクエスト、リリース、Conventional Commits

asdfは、プルリクエストタイトルのConventional Commitsに依存する自動リリースパイプラインを使用しています。詳しくは、コアのコントリビューションガイドのドキュメントに記述されています。

ドキュメントの変更に関するプルリクエストを作成する場合、プルリクエストのタイトルは、Conventional Commit typeをdocsとして、docs: <description>というフォーマットで作成するようにしてください。

Vitepress

サイトの構成設定は、構成を示すために使用されるJSオブジェクト含んだ、いくつかのTypeScriptファイルに記述されています。以下のとおりです:

  • docs/.vitepress/config.js: サイトのルート構成ファイルです。仕様については、VitePressのドキュメントをご覧ください。

ルート構成ファイルを簡素化するために、 Navバーサイドバー の構成を示す大きなJSオブジェクトについては、別ファイルに切り出されており、かつ、ロケールごとに分類されています。次の両方のファイルを参照してください:

  • docs/.vitepress/navbars.js
  • docs/.vitepress/sidebars.js

これらの構成設定に関する公式ドキュメントは、Default Theme Referenceをご覧ください。

I18n

VitePressは、国際化対応に関して最高のサポートを備えています。 ルート構成ファイルであるdocs/.vitepress/config.jsでは、サポートされているロケールとそのURL、ドロップメニューのタイトル、Navバー/サイドバーの構成への参照を定義しています。

Navバー/サイドバーの構成設定は前述の構成ファイルにキャプチャされ、ロケールごとに分類され、個別にエクスポートされます。

各ロケールのMarkdownコンテンツは、ルート構成ファイル内のlocales内のキーと同じ名前のディレクトリ配下に配置する必要があります。ルート構成が下記の場合:

js
// 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ファイルのセットを配置する必要があります:

shell
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.CLMHeW36.js b/assets/ja-jp_contribute_first-party-plugins.md.CLMHeW36.js new file mode 100644 index 00000000..2eeb77f1 --- /dev/null +++ b/assets/ja-jp_contribute_first-party-plugins.md.CLMHeW36.js @@ -0,0 +1 @@ +import{_ as a,c as r,a2 as t,o as i}from"./chunks/framework.BQmytedh.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コアチームでは、日々のワークライフに関連するプラグインをいくつか作成しています。これらのプラグインのメンテナンスおよび改善にご協力いただける方を、いつでも歓迎しています。詳しくは、下記リンクから、それぞれのリポジトリを参照してください:

コミュニティプラグインについては、下記をご覧ください:

',5)]))}const h=a(s,[["render",l]]);export{u as __pageData,h as default}; diff --git a/assets/ja-jp_contribute_first-party-plugins.md.CLMHeW36.lean.js b/assets/ja-jp_contribute_first-party-plugins.md.CLMHeW36.lean.js new file mode 100644 index 00000000..2eeb77f1 --- /dev/null +++ b/assets/ja-jp_contribute_first-party-plugins.md.CLMHeW36.lean.js @@ -0,0 +1 @@ +import{_ as a,c as r,a2 as t,o as i}from"./chunks/framework.BQmytedh.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コアチームでは、日々のワークライフに関連するプラグインをいくつか作成しています。これらのプラグインのメンテナンスおよび改善にご協力いただける方を、いつでも歓迎しています。詳しくは、下記リンクから、それぞれのリポジトリを参照してください:

コミュニティプラグインについては、下記をご覧ください:

',5)]))}const h=a(s,[["render",l]]);export{u as __pageData,h as default}; diff --git a/assets/ja-jp_contribute_github-actions.md.CXg4FquL.js b/assets/ja-jp_contribute_github-actions.md.CXg4FquL.js new file mode 100644 index 00000000..943960a4 --- /dev/null +++ b/assets/ja-jp_contribute_github-actions.md.CXg4FquL.js @@ -0,0 +1 @@ +import{_ as i,c as o,j as t,a,o as n}from"./chunks/framework.BQmytedh.js";const h=JSON.parse('{"title":"GitHub Actions","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/contribute/github-actions.md","filePath":"ja-jp/contribute/github-actions.md","lastUpdated":1704890757000}'),s={name:"ja-jp/contribute/github-actions.md"};function r(c,e,d,u,l,p){return n(),o("div",null,e[0]||(e[0]=[t("h1",{id:"github-actions",tabindex:"-1"},[a("GitHub Actions "),t("a",{class:"header-anchor",href:"#github-actions","aria-label":'Permalink to "GitHub Actions"'},"​")],-1),t("p",null,[a("ご興味を持っていただきありがとうございます。既存のイシュー、議論、コントリビューションガイドについては、"),t("a",{href:"https://github.com/asdf-vm/actions",target:"_blank",rel:"noreferrer"},"asdf actions リポジトリ"),a("をご覧ください。")],-1)]))}const f=i(s,[["render",r]]);export{h as __pageData,f as default}; diff --git a/assets/ja-jp_contribute_github-actions.md.CXg4FquL.lean.js b/assets/ja-jp_contribute_github-actions.md.CXg4FquL.lean.js new file mode 100644 index 00000000..943960a4 --- /dev/null +++ b/assets/ja-jp_contribute_github-actions.md.CXg4FquL.lean.js @@ -0,0 +1 @@ +import{_ as i,c as o,j as t,a,o as n}from"./chunks/framework.BQmytedh.js";const h=JSON.parse('{"title":"GitHub Actions","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/contribute/github-actions.md","filePath":"ja-jp/contribute/github-actions.md","lastUpdated":1704890757000}'),s={name:"ja-jp/contribute/github-actions.md"};function r(c,e,d,u,l,p){return n(),o("div",null,e[0]||(e[0]=[t("h1",{id:"github-actions",tabindex:"-1"},[a("GitHub Actions "),t("a",{class:"header-anchor",href:"#github-actions","aria-label":'Permalink to "GitHub Actions"'},"​")],-1),t("p",null,[a("ご興味を持っていただきありがとうございます。既存のイシュー、議論、コントリビューションガイドについては、"),t("a",{href:"https://github.com/asdf-vm/actions",target:"_blank",rel:"noreferrer"},"asdf actions リポジトリ"),a("をご覧ください。")],-1)]))}const f=i(s,[["render",r]]);export{h as __pageData,f as default}; diff --git a/assets/ja-jp_guide_getting-started.md.BJ2dWMQM.js b/assets/ja-jp_guide_getting-started.md.BJ2dWMQM.js new file mode 100644 index 00000000..1604b53f --- /dev/null +++ b/assets/ja-jp_guide_getting-started.md.BJ2dWMQM.js @@ -0,0 +1,13 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.BQmytedh.js";const r=JSON.parse('{"title":"はじめよう","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/guide/getting-started.md","filePath":"ja-jp/guide/getting-started.md","lastUpdated":1734397135000}'),l={name:"ja-jp/guide/getting-started.md"};function h(p,s,n,d,k,o){return t(),a("div",null,s[0]||(s[0]=[e(`

はじめよう

asdfのインストールには次の手順が必要です:

  1. 依存関係のインストール
  2. asdfコアのダウンロード
  3. asdfのインストール
  4. 管理したいツール/ランタイムごとにプラグインをインストール
  5. ツール/ランタイムの特定バージョンをインストール
  6. .tool-versionsファイルで、グローバルまたはプロジェクトのバージョンをセット

1. 依存関係のインストール

asdfの動作にはgitおよびcurlが必要です。以下の表は、 あなたが使用している パッケージマネージャで実行するコマンドの 一部例 です(いくつかのツールは、後の手順で自動的にインストールされます)。

OSパッケージマネージャコマンド
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

備考

お使いのシステムの構成によっては、接頭にsudoが必要となる場合もあります。

2. asdfのダウンロード

公式ダウンロード

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0

コミュニティがサポートするダウンロード方法

理由がない限り、gitコマンドを使用した公式ダウンロードの手順を使用することを強く推奨します。

方法コマンド
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si または好みのAURヘルパーを使用

3. asdfのインストール

あなたが使用しているシェル、OS、およびインストール方法によって、ここでの設定方法が変わります。最も適したものを選択してください。

masOSユーザの方は、この節の最後にあるpath_helperに関する警告を必ず参照してください。

Bash & Git

~/.bashrcに下記の行を追記します:

shell
. "$HOME/.asdf/asdf.sh"

コマンド補完が必要な場合は、.bashrcに下記の行を追記します:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

macOS Catalina以降を使用している場合、デフォルトのシェルはZSHです。Bashに変更していない限り、ZSHの手順を参照してください。

~/.bash_profileに下記の行を追記します:

shell
. "$HOME/.asdf/asdf.sh"

コマンド補完が必要な場合は、.bash_profileに下記の行を追記します:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

下記コマンドで、~/.bashrcasdf.shを追加します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bashrc

コマンド補完が必要な場合は、Homebrewのガイドに従って設定を完了させるか、下記コマンドを実行します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Bash & Homebrew (macOS)

macOS Catalina以降を使用している場合、デフォルトのシェルはZSHです。Bashに変更していない限り、ZSHの手順を参照してください。

下記コマンドで、~/.bash_profileasdf.shを追加します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bash_profile

コマンド補完が必要な場合は、Homebrewのガイドに従って設定を完了させるか、下記コマンドを実行します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Bash & Pacman

~/.bashrcに下記の行を追記します:

shell
. /opt/asdf-vm/asdf.sh

コマンド補完が必要な場合は、bash-completionをインストールします。

Fish & Git

~/.config/fish/config.fishに下記の行を追記します:

shell
source ~/.asdf/asdf.fish

コマンド補完が必要な場合は、下記コマンドを実行します:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

下記コマンドで、~/.config/fish/config.fishasdf.shを追加します:

shell
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

コマンド補完は、Fish shellのHomebrewが担います。親切ですね!

Fish & Pacman

~/.config/fish/config.fishに下記の行を追記します:

shell
source /opt/asdf-vm/asdf.fish

コマンド補完は、AURパッケージのインストール時に自動的に設定されます。

Elvish & Git

下記コマンドで、~/.config/elvish/rc.elvasdf.elvを追加します:

shell
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

コマンド補完は自動的に設定されます。

Elvish & Homebrew

下記コマンドで、~/.config/elvish/rc.elvasdf.elvを追加します:

shell
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

コマンド補完は自動的に設定されます。

Elvish & Pacman

下記コマンドで、~/.config/elvish/rc.elvasdf.elvを追加します:

shell
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

コマンド補完は自動的に設定されます。

ZSH & Git

~/.zshrcに下記の行を追記します:

shell
. "$HOME/.asdf/asdf.sh"

またはasdf for oh-my-zshのようなZSHフレームワークプラグインを使用して、このスクリプトをsourceし、コマンド補完をセットアップします。

コマンド補完は、ZSHフレームワークのasdfプラグインで設定するか、~/.zshrcに下記の行を追記することで設定できます:

shell
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • compinitのセットアップをカスタマイズしている場合は、asdf.shソース以下にcompinitがくるようにしてください。
  • ZSHフレームワークでcompinitのセットアップをカスタマイズしている場合は、フレームワークソース以下にcompinitがくるようにしてください。

警告

ZSHフレームワークを使用している場合、新しいZSHコマンド補完を使用するには、fpath経由で、関連するasdfプラグインの更新が必要となることがあります。Oh-My-ZSH asdfプラグインは、ohmyzsh/ohmyzsh#8837でご覧いただくと分かるとおり、まだ更新されていません。

ZSH & Homebrew

下記コマンドで、~/.zshrcasdf.shを追加します:

shell
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でご覧いただくと分かるとおり、まだ更新されていません。

ZSH & Pacman

~/.zshrcに下記の行を追記します:

shell
. /opt/asdf-vm/asdf.sh

コマンド補完は、ZSHに適した場所に配置されますが、オートコンプリートを使用するようにZSHを設定する必要があります

PowerShell Core & Git

~/.config/powershell/profile.ps1に下記の行を追記します:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

下記コマンドで、~/.config/powershell/profile.ps1asdf.shを追加します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

~/.config/powershell/profile.ps1に下記の行を追記します:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

下記コマンドで、~/.config/nushell/config.nuasdf.nuを追加します:

shell
"\\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

コマンド補完は自動的に設定されます。

Nushell & Homebrew

下記コマンドで、~/.config/nushell/config.nuasdf.nuを追加します:

shell
"\\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

コマンド補完は自動的に設定されます。

Nushell & Pacman

下記コマンドで、~/.config/nushell/config.nuasdf.nuを追加します:

shell
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

コマンド補完は自動的に設定されます。

POSIX Shell & Git

~/.profileに下記の行を追記します:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

下記コマンドで、~/.profileasdf.shを追加します:

shell
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
POSIX Shell & Pacman

~/.profileに下記の行を追記します:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

asdfのスクリプトは、$PATHを設定したあと、かつ、使用中のフレームワーク(oh-my-zsh など)を呼び出したあとに記述する必要があります。

警告

macOSでは、BashまたはZSHシェルを起動すると、自動的にpath_helperというユーティリティが呼び出されます。path_helperPATH(およびMANPATH)内の項目の順番を並び替えることができるため、特定の順序を必要とするツールの動作に、一貫性が無くなってしまいます。これを回避するため、macOSでasdfを利用するときは、強制的にPATHエントリの先頭に追加する(優先度を一番高くする)ようにしてください。これは、ASDF_FORCE_PREPEND環境変数で制御できます。

PATHの変更を反映するために、シェルを再起動してください。たいていの場合、ターミナルのタブを新たに開けばOKです。

コアのインストールが完了!

これで、asdfのコアのインストールは完了です🎉

しかし、asdfが役に立つようになるのは、プラグインをインストールしてからツールをインストールし、バージョンを管理するようになってからです。引き続き、ガイドを進めていきましょう。

4. プラグインのインストール

ここではデモとして、asdf-nodejsプラグインを使用してNode.jsをインストール・設定してみましょう。

プラグインの依存関係

各プラグインには依存関係があるため、プラグインのリポジトリを確認しておきましょう。asdf-nodejsの場合、必要なものは次のとおりです:

OS依存関係インストールコマンド
Debianapt-get install dirmngr gpg curl gawk
CentOS/ Rocky Linux/ AlmaLinuxyum install gnupg2 curl gawk
macOSbrew install gpg gawk

一部のプラグインではインストール後の事後処理でこれらの依存関係が必要となるため、あらかじめインストールしておきましょう。

プラグインのインストール

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. 特定のバージョンのインストール

Node.js用のプラグインをインストールしたので、このツールの特定のバージョンをインストールしましょう。

インストール可能なバージョンはasdf list all nodejsコマンドで確認できますし、特定のメジャーバージョンのサブセットはasdf list all nodejs 14コマンドで確認できます。

最新版をインストールするには、次のコマンドを実行します:

shell
asdf install nodejs latest

備考

asdfでは正確なバージョン番号を指定してください。latestは、現時点での最新バージョンを指定できるasdfのヘルパーです。

6. バージョンをセット

asdfは、カレントディレクトリから上位の$HOMEディレクトリまでに存在するすべての.tool-versionsファイルをもとに、ツールのバージョンを照会します。照会は、asdfで管理するツールを実行した際に、ジャストインタイムで行われます。

警告

ツールで指定されたバージョンが見つからない場合、エラーが発生します。asdf currentコマンドを実行すると、カレントディレクトリにおいてツールのバージョンを解決可能か確認できるため、どのツールが実行に失敗するか検証することができます。

グローバル

グローバルのデフォルト設定は、$HOME/.tool-versionsで管理されます。グローバルのバージョンをセットするには、次のコマンドを実行します:

shell
asdf global nodejs latest

すると、$HOME/.tool-versions内には次のように書き込まれます:

nodejs 16.5.0

一部のOSでは、pythonのように、asdfではなくシステムが管理するツールが既にインストールされていることがあります。それを使用する場合、asdfに対して、バージョン管理をシステムに委任するように指示する必要があります。詳しくは、バージョンのリファレンスをご覧ください。

ローカル

ローカルのバージョン設定は、$PWD/.tool-versionsファイル(カレントディレクトリ内)で定義されます。たいていの場合は、プロジェクトのGitリポジトリ内となるでしょう。対象となるディレクトリで、下記コマンドを実行します:

shell
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つのカテゴリに分けられます:

`,82)]))}const g=i(l,[["render",h]]);export{r as __pageData,g as default}; diff --git a/assets/ja-jp_guide_getting-started.md.BJ2dWMQM.lean.js b/assets/ja-jp_guide_getting-started.md.BJ2dWMQM.lean.js new file mode 100644 index 00000000..1604b53f --- /dev/null +++ b/assets/ja-jp_guide_getting-started.md.BJ2dWMQM.lean.js @@ -0,0 +1,13 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.BQmytedh.js";const r=JSON.parse('{"title":"はじめよう","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/guide/getting-started.md","filePath":"ja-jp/guide/getting-started.md","lastUpdated":1734397135000}'),l={name:"ja-jp/guide/getting-started.md"};function h(p,s,n,d,k,o){return t(),a("div",null,s[0]||(s[0]=[e(`

はじめよう

asdfのインストールには次の手順が必要です:

  1. 依存関係のインストール
  2. asdfコアのダウンロード
  3. asdfのインストール
  4. 管理したいツール/ランタイムごとにプラグインをインストール
  5. ツール/ランタイムの特定バージョンをインストール
  6. .tool-versionsファイルで、グローバルまたはプロジェクトのバージョンをセット

1. 依存関係のインストール

asdfの動作にはgitおよびcurlが必要です。以下の表は、 あなたが使用している パッケージマネージャで実行するコマンドの 一部例 です(いくつかのツールは、後の手順で自動的にインストールされます)。

OSパッケージマネージャコマンド
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

備考

お使いのシステムの構成によっては、接頭にsudoが必要となる場合もあります。

2. asdfのダウンロード

公式ダウンロード

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0

コミュニティがサポートするダウンロード方法

理由がない限り、gitコマンドを使用した公式ダウンロードの手順を使用することを強く推奨します。

方法コマンド
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si または好みのAURヘルパーを使用

3. asdfのインストール

あなたが使用しているシェル、OS、およびインストール方法によって、ここでの設定方法が変わります。最も適したものを選択してください。

masOSユーザの方は、この節の最後にあるpath_helperに関する警告を必ず参照してください。

Bash & Git

~/.bashrcに下記の行を追記します:

shell
. "$HOME/.asdf/asdf.sh"

コマンド補完が必要な場合は、.bashrcに下記の行を追記します:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

macOS Catalina以降を使用している場合、デフォルトのシェルはZSHです。Bashに変更していない限り、ZSHの手順を参照してください。

~/.bash_profileに下記の行を追記します:

shell
. "$HOME/.asdf/asdf.sh"

コマンド補完が必要な場合は、.bash_profileに下記の行を追記します:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

下記コマンドで、~/.bashrcasdf.shを追加します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bashrc

コマンド補完が必要な場合は、Homebrewのガイドに従って設定を完了させるか、下記コマンドを実行します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Bash & Homebrew (macOS)

macOS Catalina以降を使用している場合、デフォルトのシェルはZSHです。Bashに変更していない限り、ZSHの手順を参照してください。

下記コマンドで、~/.bash_profileasdf.shを追加します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bash_profile

コマンド補完が必要な場合は、Homebrewのガイドに従って設定を完了させるか、下記コマンドを実行します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Bash & Pacman

~/.bashrcに下記の行を追記します:

shell
. /opt/asdf-vm/asdf.sh

コマンド補完が必要な場合は、bash-completionをインストールします。

Fish & Git

~/.config/fish/config.fishに下記の行を追記します:

shell
source ~/.asdf/asdf.fish

コマンド補完が必要な場合は、下記コマンドを実行します:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

下記コマンドで、~/.config/fish/config.fishasdf.shを追加します:

shell
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

コマンド補完は、Fish shellのHomebrewが担います。親切ですね!

Fish & Pacman

~/.config/fish/config.fishに下記の行を追記します:

shell
source /opt/asdf-vm/asdf.fish

コマンド補完は、AURパッケージのインストール時に自動的に設定されます。

Elvish & Git

下記コマンドで、~/.config/elvish/rc.elvasdf.elvを追加します:

shell
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

コマンド補完は自動的に設定されます。

Elvish & Homebrew

下記コマンドで、~/.config/elvish/rc.elvasdf.elvを追加します:

shell
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

コマンド補完は自動的に設定されます。

Elvish & Pacman

下記コマンドで、~/.config/elvish/rc.elvasdf.elvを追加します:

shell
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

コマンド補完は自動的に設定されます。

ZSH & Git

~/.zshrcに下記の行を追記します:

shell
. "$HOME/.asdf/asdf.sh"

またはasdf for oh-my-zshのようなZSHフレームワークプラグインを使用して、このスクリプトをsourceし、コマンド補完をセットアップします。

コマンド補完は、ZSHフレームワークのasdfプラグインで設定するか、~/.zshrcに下記の行を追記することで設定できます:

shell
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • compinitのセットアップをカスタマイズしている場合は、asdf.shソース以下にcompinitがくるようにしてください。
  • ZSHフレームワークでcompinitのセットアップをカスタマイズしている場合は、フレームワークソース以下にcompinitがくるようにしてください。

警告

ZSHフレームワークを使用している場合、新しいZSHコマンド補完を使用するには、fpath経由で、関連するasdfプラグインの更新が必要となることがあります。Oh-My-ZSH asdfプラグインは、ohmyzsh/ohmyzsh#8837でご覧いただくと分かるとおり、まだ更新されていません。

ZSH & Homebrew

下記コマンドで、~/.zshrcasdf.shを追加します:

shell
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でご覧いただくと分かるとおり、まだ更新されていません。

ZSH & Pacman

~/.zshrcに下記の行を追記します:

shell
. /opt/asdf-vm/asdf.sh

コマンド補完は、ZSHに適した場所に配置されますが、オートコンプリートを使用するようにZSHを設定する必要があります

PowerShell Core & Git

~/.config/powershell/profile.ps1に下記の行を追記します:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

下記コマンドで、~/.config/powershell/profile.ps1asdf.shを追加します:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

~/.config/powershell/profile.ps1に下記の行を追記します:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

下記コマンドで、~/.config/nushell/config.nuasdf.nuを追加します:

shell
"\\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

コマンド補完は自動的に設定されます。

Nushell & Homebrew

下記コマンドで、~/.config/nushell/config.nuasdf.nuを追加します:

shell
"\\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

コマンド補完は自動的に設定されます。

Nushell & Pacman

下記コマンドで、~/.config/nushell/config.nuasdf.nuを追加します:

shell
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

コマンド補完は自動的に設定されます。

POSIX Shell & Git

~/.profileに下記の行を追記します:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

下記コマンドで、~/.profileasdf.shを追加します:

shell
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
POSIX Shell & Pacman

~/.profileに下記の行を追記します:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

asdfのスクリプトは、$PATHを設定したあと、かつ、使用中のフレームワーク(oh-my-zsh など)を呼び出したあとに記述する必要があります。

警告

macOSでは、BashまたはZSHシェルを起動すると、自動的にpath_helperというユーティリティが呼び出されます。path_helperPATH(およびMANPATH)内の項目の順番を並び替えることができるため、特定の順序を必要とするツールの動作に、一貫性が無くなってしまいます。これを回避するため、macOSでasdfを利用するときは、強制的にPATHエントリの先頭に追加する(優先度を一番高くする)ようにしてください。これは、ASDF_FORCE_PREPEND環境変数で制御できます。

PATHの変更を反映するために、シェルを再起動してください。たいていの場合、ターミナルのタブを新たに開けばOKです。

コアのインストールが完了!

これで、asdfのコアのインストールは完了です🎉

しかし、asdfが役に立つようになるのは、プラグインをインストールしてからツールをインストールし、バージョンを管理するようになってからです。引き続き、ガイドを進めていきましょう。

4. プラグインのインストール

ここではデモとして、asdf-nodejsプラグインを使用してNode.jsをインストール・設定してみましょう。

プラグインの依存関係

各プラグインには依存関係があるため、プラグインのリポジトリを確認しておきましょう。asdf-nodejsの場合、必要なものは次のとおりです:

OS依存関係インストールコマンド
Debianapt-get install dirmngr gpg curl gawk
CentOS/ Rocky Linux/ AlmaLinuxyum install gnupg2 curl gawk
macOSbrew install gpg gawk

一部のプラグインではインストール後の事後処理でこれらの依存関係が必要となるため、あらかじめインストールしておきましょう。

プラグインのインストール

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. 特定のバージョンのインストール

Node.js用のプラグインをインストールしたので、このツールの特定のバージョンをインストールしましょう。

インストール可能なバージョンはasdf list all nodejsコマンドで確認できますし、特定のメジャーバージョンのサブセットはasdf list all nodejs 14コマンドで確認できます。

最新版をインストールするには、次のコマンドを実行します:

shell
asdf install nodejs latest

備考

asdfでは正確なバージョン番号を指定してください。latestは、現時点での最新バージョンを指定できるasdfのヘルパーです。

6. バージョンをセット

asdfは、カレントディレクトリから上位の$HOMEディレクトリまでに存在するすべての.tool-versionsファイルをもとに、ツールのバージョンを照会します。照会は、asdfで管理するツールを実行した際に、ジャストインタイムで行われます。

警告

ツールで指定されたバージョンが見つからない場合、エラーが発生します。asdf currentコマンドを実行すると、カレントディレクトリにおいてツールのバージョンを解決可能か確認できるため、どのツールが実行に失敗するか検証することができます。

グローバル

グローバルのデフォルト設定は、$HOME/.tool-versionsで管理されます。グローバルのバージョンをセットするには、次のコマンドを実行します:

shell
asdf global nodejs latest

すると、$HOME/.tool-versions内には次のように書き込まれます:

nodejs 16.5.0

一部のOSでは、pythonのように、asdfではなくシステムが管理するツールが既にインストールされていることがあります。それを使用する場合、asdfに対して、バージョン管理をシステムに委任するように指示する必要があります。詳しくは、バージョンのリファレンスをご覧ください。

ローカル

ローカルのバージョン設定は、$PWD/.tool-versionsファイル(カレントディレクトリ内)で定義されます。たいていの場合は、プロジェクトのGitリポジトリ内となるでしょう。対象となるディレクトリで、下記コマンドを実行します:

shell
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つのカテゴリに分けられます:

`,82)]))}const g=i(l,[["render",h]]);export{r as __pageData,g as default}; diff --git a/assets/ja-jp_guide_introduction.md.CYXABCzJ.js b/assets/ja-jp_guide_introduction.md.CYXABCzJ.js new file mode 100644 index 00000000..cccacbcb --- /dev/null +++ b/assets/ja-jp_guide_introduction.md.CYXABCzJ.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as t}from"./chunks/framework.BQmytedh.js";const f=JSON.parse('{"title":"イントロダクション","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/guide/introduction.md","filePath":"ja-jp/guide/introduction.md","lastUpdated":1704890757000}'),d={name:"ja-jp/guide/introduction.md"};function n(i,e,c,s,h,l){return t(),o("div",null,e[0]||(e[0]=[r('

イントロダクション

asdfは、ツールのためのバージョンマネージャです。すべてのツールのバージョンは単一のファイル(.tool-versions)内で定義されるため、プロジェクトのGitリポジトリにチェックインして共有することで、チーム全員に同じーバージョンのツールを使ってもらえるようになります。

従来は、複数のCLIのバージョンマネージャを用意する必要があり、それぞれが異なるAPI、構成ファイル、および実装($PATHの操作、Shim、環境変数など)となっていました。asdfは、開発ワークフローを簡素化するための単一インターフェースと構成ファイルを提供しており、シンプルなプラグインインターフェースを使って、すべてのツール・ランタイムに拡張することができます。

どうやって動いているの

シェル上でasdfコアがセットアップすると、特定のツールを管理するためのプラグインをインストールすることができるようになります。プラグインによってツールがインストールされると、インストールされる実行ファイルごとにShimが作成されます。これらの実行ファイルを実行しようとすると、代わりにShimが実行され、.tool-versionsで定義されているバージョンをasdfが認識して、当該バージョンが実行されます。

関連プロジェクト

nvm / n / rbenv etc

nvmn、およびrbenvのようなツールはすべて、ツールによってインストールされる実行ファイルのShimを作成するシェルスクリプトです。

asdfはこれらのツールと非常に似ていて、ツール/ランタイムのバージョン管理という分野では競合しています。asdfはプラグインシステムを採用し、他のツールと差別化することで、ツール/ランタイムごとのマネージャ、マネージャごとの異なるコマンド、そしてリポジトリ内の様々な*-versionファイルといったものを排除しています。

direnv

シェルに、ディレクトリごとに環境変数をロード/アンロードできる機能を付け加えます。

asdfは環境変数を管理することはしませんが、direnvの動作をasdfに統合するasdf-direnvプラグインが存在します。

詳しくはdirenvのドキュメントをご覧ください。

Homebrew

macOS(またはLinux)のためのパッケージマネージャー

Homebrewは、パッケージとその上位の依存関係を管理します。asdfは上位の依存関係を管理することはしませんし、パッケージマネージャでもありません。それらの管理はユーザが負担することとなりますが、asdfはなるべく依存関係のリストを小さく保つように努めています。

詳しくはHomebrewのドキュメントをご覧ください。

NixOS

Nixは、パッケージ管理とシステム構成に独自のアプローチを取り入れたツールです。

NixOSは、各ツールの依存関係ツリー全体でパッケージのバージョンを正確に管理することで、真に再現可能な環境を構築することを目指しています。asdfでそのようなことはできません。NixOSは、独自のプログラミング言語、たくさんのCLIツール、そして60,000を超えるパッケージコレクションによって、それらの機能を支えています。

繰り返しになりますが、asdfは上位の依存関係を管理することはしませんし、パッケージマネージャでもありません。

詳しくはNixOSのドキュメントをご覧ください。

なぜasdfを使うの?

asdfは、プラグインシステムによって多くのツールをサポートしており、シェル構成にたった1行のシェルスクリプトを記述するだけで使えるというシンプルさ・親しみやすさによって、チームが確実に同じバージョンのツールを使用することを保証できます。

Note

asdfはシステムのパッケージマネージャになることを目指してはいません。あくまで、ツールのバージョンマネージャです。プラグインを作成することで、どのようなツールでもasdfで管理できるようになりますが、それがそのツールにとって最善の方法であるとは限りませんのでご注意ください。

',25)]))}const b=a(d,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/ja-jp_guide_introduction.md.CYXABCzJ.lean.js b/assets/ja-jp_guide_introduction.md.CYXABCzJ.lean.js new file mode 100644 index 00000000..cccacbcb --- /dev/null +++ b/assets/ja-jp_guide_introduction.md.CYXABCzJ.lean.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as t}from"./chunks/framework.BQmytedh.js";const f=JSON.parse('{"title":"イントロダクション","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/guide/introduction.md","filePath":"ja-jp/guide/introduction.md","lastUpdated":1704890757000}'),d={name:"ja-jp/guide/introduction.md"};function n(i,e,c,s,h,l){return t(),o("div",null,e[0]||(e[0]=[r('

イントロダクション

asdfは、ツールのためのバージョンマネージャです。すべてのツールのバージョンは単一のファイル(.tool-versions)内で定義されるため、プロジェクトのGitリポジトリにチェックインして共有することで、チーム全員に同じーバージョンのツールを使ってもらえるようになります。

従来は、複数のCLIのバージョンマネージャを用意する必要があり、それぞれが異なるAPI、構成ファイル、および実装($PATHの操作、Shim、環境変数など)となっていました。asdfは、開発ワークフローを簡素化するための単一インターフェースと構成ファイルを提供しており、シンプルなプラグインインターフェースを使って、すべてのツール・ランタイムに拡張することができます。

どうやって動いているの

シェル上でasdfコアがセットアップすると、特定のツールを管理するためのプラグインをインストールすることができるようになります。プラグインによってツールがインストールされると、インストールされる実行ファイルごとにShimが作成されます。これらの実行ファイルを実行しようとすると、代わりにShimが実行され、.tool-versionsで定義されているバージョンをasdfが認識して、当該バージョンが実行されます。

関連プロジェクト

nvm / n / rbenv etc

nvmn、およびrbenvのようなツールはすべて、ツールによってインストールされる実行ファイルのShimを作成するシェルスクリプトです。

asdfはこれらのツールと非常に似ていて、ツール/ランタイムのバージョン管理という分野では競合しています。asdfはプラグインシステムを採用し、他のツールと差別化することで、ツール/ランタイムごとのマネージャ、マネージャごとの異なるコマンド、そしてリポジトリ内の様々な*-versionファイルといったものを排除しています。

direnv

シェルに、ディレクトリごとに環境変数をロード/アンロードできる機能を付け加えます。

asdfは環境変数を管理することはしませんが、direnvの動作をasdfに統合するasdf-direnvプラグインが存在します。

詳しくはdirenvのドキュメントをご覧ください。

Homebrew

macOS(またはLinux)のためのパッケージマネージャー

Homebrewは、パッケージとその上位の依存関係を管理します。asdfは上位の依存関係を管理することはしませんし、パッケージマネージャでもありません。それらの管理はユーザが負担することとなりますが、asdfはなるべく依存関係のリストを小さく保つように努めています。

詳しくはHomebrewのドキュメントをご覧ください。

NixOS

Nixは、パッケージ管理とシステム構成に独自のアプローチを取り入れたツールです。

NixOSは、各ツールの依存関係ツリー全体でパッケージのバージョンを正確に管理することで、真に再現可能な環境を構築することを目指しています。asdfでそのようなことはできません。NixOSは、独自のプログラミング言語、たくさんのCLIツール、そして60,000を超えるパッケージコレクションによって、それらの機能を支えています。

繰り返しになりますが、asdfは上位の依存関係を管理することはしませんし、パッケージマネージャでもありません。

詳しくはNixOSのドキュメントをご覧ください。

なぜasdfを使うの?

asdfは、プラグインシステムによって多くのツールをサポートしており、シェル構成にたった1行のシェルスクリプトを記述するだけで使えるというシンプルさ・親しみやすさによって、チームが確実に同じバージョンのツールを使用することを保証できます。

Note

asdfはシステムのパッケージマネージャになることを目指してはいません。あくまで、ツールのバージョンマネージャです。プラグインを作成することで、どのようなツールでもasdfで管理できるようになりますが、それがそのツールにとって最善の方法であるとは限りませんのでご注意ください。

',25)]))}const b=a(d,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/ja-jp_index.md.Te-fFvI2.js b/assets/ja-jp_index.md.Te-fFvI2.js new file mode 100644 index 00000000..a62f0455 --- /dev/null +++ b/assets/ja-jp_index.md.Te-fFvI2.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as i}from"./chunks/framework.BQmytedh.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"asdf","text":"マルチランタイム
バージョンマネージャ","tagline":"1つのツールですべてのランタイムのバージョンを管理しましょう!","actions":[{"theme":"brand","text":"はじめよう","link":"/ja-jp/guide/getting-started"},{"theme":"alt","text":"asdfってなに?","link":"/ja-jp/guide/introduction"},{"theme":"alt","text":"GitHubをみる","link":"https://github.com/asdf-vm/asdf"}]},"features":[{"title":"単一ツール","details":"単体のCLIツールとコマンドインターフェースで、各プロジェクトのランタイムを管理できます。","icon":"🎉"},{"title":"プラグイン","details":"既存ランタイム・ツールを使用した大規模なエコシステムです。必要に応じて新しいツールをサポートできるシンプルなAPIを用意しています!","icon":"🔌"},{"title":"後方互換性","details":".nvmrc、.node-version、.ruby-versionといった既存構成ファイルから、スムーズに移行できます!","icon":"⏮"},{"title":"単一の構成ファイル","details":".tool-versionsを使用すると、すべてのツール、ランタイム、およびそれらのバージョンを、共有された単一の場所で管理できます。","icon":"📄"},{"title":"シェル","details":"Bash、ZSH、Fish、およびElvishをサポートし、コマンド補完にも対応しています。","icon":"🐚"},{"title":"GitHub Actions","details":"CI/CDワークフローで、.tool-versionsをインストールし利用するためのGitHub Actionを提供しています。","icon":"🤖"}]},"headers":[],"relativePath":"ja-jp/index.md","filePath":"ja-jp/index.md","lastUpdated":1704890757000}'),a={name:"ja-jp/index.md"};function n(o,s,d,l,r,c){return i(),e("div")}const h=t(a,[["render",n]]);export{m as __pageData,h as default}; diff --git a/assets/ja-jp_index.md.Te-fFvI2.lean.js b/assets/ja-jp_index.md.Te-fFvI2.lean.js new file mode 100644 index 00000000..a62f0455 --- /dev/null +++ b/assets/ja-jp_index.md.Te-fFvI2.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as i}from"./chunks/framework.BQmytedh.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"asdf","text":"マルチランタイム
バージョンマネージャ","tagline":"1つのツールですべてのランタイムのバージョンを管理しましょう!","actions":[{"theme":"brand","text":"はじめよう","link":"/ja-jp/guide/getting-started"},{"theme":"alt","text":"asdfってなに?","link":"/ja-jp/guide/introduction"},{"theme":"alt","text":"GitHubをみる","link":"https://github.com/asdf-vm/asdf"}]},"features":[{"title":"単一ツール","details":"単体のCLIツールとコマンドインターフェースで、各プロジェクトのランタイムを管理できます。","icon":"🎉"},{"title":"プラグイン","details":"既存ランタイム・ツールを使用した大規模なエコシステムです。必要に応じて新しいツールをサポートできるシンプルなAPIを用意しています!","icon":"🔌"},{"title":"後方互換性","details":".nvmrc、.node-version、.ruby-versionといった既存構成ファイルから、スムーズに移行できます!","icon":"⏮"},{"title":"単一の構成ファイル","details":".tool-versionsを使用すると、すべてのツール、ランタイム、およびそれらのバージョンを、共有された単一の場所で管理できます。","icon":"📄"},{"title":"シェル","details":"Bash、ZSH、Fish、およびElvishをサポートし、コマンド補完にも対応しています。","icon":"🐚"},{"title":"GitHub Actions","details":"CI/CDワークフローで、.tool-versionsをインストールし利用するためのGitHub Actionを提供しています。","icon":"🤖"}]},"headers":[],"relativePath":"ja-jp/index.md","filePath":"ja-jp/index.md","lastUpdated":1704890757000}'),a={name:"ja-jp/index.md"};function n(o,s,d,l,r,c){return i(),e("div")}const h=t(a,[["render",n]]);export{m as __pageData,h as default}; diff --git a/assets/ja-jp_manage_commands.md.CM3wA-L-.js b/assets/ja-jp_manage_commands.md.CM3wA-L-.js new file mode 100644 index 00000000..13687db6 --- /dev/null +++ b/assets/ja-jp_manage_commands.md.CM3wA-L-.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as p,o as e}from"./chunks/framework.BQmytedh.js";const f=JSON.parse('{"title":"すべてのコマンド","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/manage/commands.md","filePath":"ja-jp/manage/commands.md","lastUpdated":1704890757000}'),l={name:"ja-jp/manage/commands.md"};function t(i,s,o,c,r,d){return e(),n("div",null,s[0]||(s[0]=[p(`

すべてのコマンド

asdfで利用可能なすべてのコマンドの一覧です。この一覧は、asdf helpコマンドで表示されるテキストです。

txt
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
`,3)]))}const m=a(l,[["render",t]]);export{f as __pageData,m as default}; diff --git a/assets/ja-jp_manage_commands.md.CM3wA-L-.lean.js b/assets/ja-jp_manage_commands.md.CM3wA-L-.lean.js new file mode 100644 index 00000000..13687db6 --- /dev/null +++ b/assets/ja-jp_manage_commands.md.CM3wA-L-.lean.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as p,o as e}from"./chunks/framework.BQmytedh.js";const f=JSON.parse('{"title":"すべてのコマンド","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/manage/commands.md","filePath":"ja-jp/manage/commands.md","lastUpdated":1704890757000}'),l={name:"ja-jp/manage/commands.md"};function t(i,s,o,c,r,d){return e(),n("div",null,s[0]||(s[0]=[p(`

すべてのコマンド

asdfで利用可能なすべてのコマンドの一覧です。この一覧は、asdf helpコマンドで表示されるテキストです。

txt
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
`,3)]))}const m=a(l,[["render",t]]);export{f as __pageData,m as default}; diff --git a/assets/ja-jp_manage_configuration.md.CysILq4S.js b/assets/ja-jp_manage_configuration.md.CysILq4S.js new file mode 100644 index 00000000..3de3f943 --- /dev/null +++ b/assets/ja-jp_manage_configuration.md.CysILq4S.js @@ -0,0 +1,9 @@ +import{_ as s,c as n,a2 as a,j as e,a as l,G as o,B as i,o as r}from"./chunks/framework.BQmytedh.js";const O=JSON.parse('{"title":"構成設定","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/manage/configuration.md","filePath":"ja-jp/manage/configuration.md","lastUpdated":1734397135000}'),c={name:"ja-jp/manage/configuration.md"},p={tabindex:"0"},f={style:{"text-align":"left"}},u={tabindex:"0"},g={style:{"text-align":"left"}},h={tabindex:"0"},y={style:{"text-align":"left"}},b={tabindex:"0"},m={style:{"text-align":"left"}},x={tabindex:"0"},_={style:{"text-align":"left"}};function v(k,t,D,A,E,F){const d=i("Badge");return r(),n("div",null,[t[32]||(t[32]=a(`

構成設定

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環境変数で設定できます。

下記は、構成に必要な項目とそのデフォルト値を示しています:

txt
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ファイルを読み込みます。

`,22)),e("table",p,[t[4]||(t[4]=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",f,[t[0]||(t[0]=e("code",null,"no",-1)),t[1]||(t[1]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"})]),t[2]||(t[2]=e("td",{style:{"text-align":"left"}},[l("バージョンの読み込みには"),e("code",null,".tool-versions"),l("を使用します")],-1))]),t[3]||(t[3]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},[l("利用可能なレガシーバージョンファイル("),e("code",null,".ruby-version"),l("など)がある場合、プラグインのフォールバックで使用します")])],-1))])]),t[33]||(t[33]=e("h3",{id:"use-release-candidates",tabindex:"-1"},[e("code",null,"use_release_candidates"),l(),e("a",{class:"header-anchor",href:"#use-release-candidates","aria-label":'Permalink to "`use_release_candidates`"'},"​")],-1)),t[34]||(t[34]=e("p",null,[e("code",null,"asdf update"),l("コマンドでasdfを更新する際に、最新リリースではなく、リリース候補版へ更新するか制御します。")],-1)),e("table",u,[t[9]||(t[9]=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",g,[t[5]||(t[5]=e("code",null,"no",-1)),t[6]||(t[6]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"})]),t[7]||(t[7]=e("td",{style:{"text-align":"left"}},"最新リリースを使用します",-1))]),t[8]||(t[8]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"リリース候補版を使用します")],-1))])]),t[35]||(t[35]=e("h3",{id:"always-keep-download",tabindex:"-1"},[e("code",null,"always_keep_download"),l(),e("a",{class:"header-anchor",href:"#always-keep-download","aria-label":'Permalink to "`always_keep_download`"'},"​")],-1)),t[36]||(t[36]=e("p",null,[e("code",null,"asdf install"),l("コマンドでダウンロードしたソースコードやバイナリを、保持しておくか削除するかを制御します。")],-1)),e("table",h,[t[14]||(t[14]=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",y,[t[10]||(t[10]=e("code",null,"no",-1)),t[11]||(t[11]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"})]),t[12]||(t[12]=e("td",{style:{"text-align":"left"}},"インストールが成功したら、ソースコードやバイナリを削除します",-1))]),t[13]||(t[13]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"インストール後も、ソースコードやバイナリを保持します")],-1))])]),t[37]||(t[37]=e("h3",{id:"plugin-repository-last-check-duration",tabindex:"-1"},[e("code",null,"plugin_repository_last_check_duration"),l(),e("a",{class:"header-anchor",href:"#plugin-repository-last-check-duration","aria-label":'Permalink to "`plugin_repository_last_check_duration`"'},"​")],-1)),t[38]||(t[38]=e("p",null,"asdfプラグインリポジトリの同期間隔(分)を制御します。何らかのトリガーイベントが発生した際に、最後に同期した時刻からの経過時間をチェックします。設定された間隔以上の時間が経過していた倍は、新たに同期が開始されます。",-1)),e("table",b,[t[26]||(t[26]=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",m,[t[15]||(t[15]=e("code",null,"1",-1)),t[16]||(t[16]=l("から")),t[17]||(t[17]=e("code",null,"999999999",-1)),t[18]||(t[18]=l("までの整数値 ")),t[19]||(t[19]=e("br",null,null,-1)),t[20]||(t[20]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"}),t[21]||(t[21]=l("は")),t[22]||(t[22]=e("code",null,"60",-1))]),t[23]||(t[23]=e("td",{style:{"text-align":"left"}},"最後に同期した時刻から指定時間(分)以上経過していた場合、トリガーイベントで同期します",-1))]),t[24]||(t[24]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"0")]),e("td",{style:{"text-align":"left"}},"トリガーイベントのたびに同期します")],-1)),t[25]||(t[25]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"never")]),e("td",{style:{"text-align":"left"}},"同期しません")],-1))])]),t[39]||(t[39]=a('

同期は、以下のコマンドが実行されたときに発生します:

  • 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",x,[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",_,[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

コンパイル時に使用するデフォルトのコア数です。

OptionsDescription
整数値ソースコードのコンパイル時に使用するコア数です
autonprocsysctl hw.ncpu/proc/cpuinfo、または1、の優先順でコア数を計算します

備考: ASDF_CONCURRENCY環境変数が設定されている場合はそちらが優先されます。

プラグインフック

下記のタイミングで、カスタムコードを実行することができます:

  • プラグインのインストール、Shim再生成、更新および削除をする際の前後
  • プラグインコマンドの実行前後

例えば、fooというプラグインがインストールされていて、barという実行可能ファイルが提供されている場合、以下のようなフックを使うことで、一番最初にカスタムコードを実行することができます:

text
pre_foo_bar = echo Executing with args: $@

以下のパターンがサポートされています:

  • pre_<plugin_name>_<command>
  • pre_asdf_download_<plugin_name>
  • {pre,post}_asdf_{install,reshim,uninstall}_<plugin_name>
    • $1: フルバージョン
  • {pre,post}_asdf_plugin_{add,update,remove,reshim}
    • $1: プラグイン名
  • {pre,post}_asdf_plugin_{add,update,remove}_<plugin_name>

どのようなコマンドの前後にどのようなコマンドフックを実行すべきかについての詳細は、プラグインの作成をご覧ください。

環境変数

環境変数の設定値は、お使いのシステムやシェルによって異なります。デフォルトロケーションは、インストールした場所や方法(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の値よりも優先されます。

  • 未設定の場合: asdf構成ファイルのconcurrencyの値が使用されます。
  • 使用方法: export ASDF_CONCURRENCY=32

ASDF_FORCE_PREPEND

asdfのShimやパスのディレクトリをPATHの先頭(最高優先度)に追加するかどうかを設定します。

  • 未設定の場合: macOSでのデフォルト値はyes、その他のシステムでのデフォルト値はnoです。
  • yesの場合: asdfディレクトリを強制的にPATHの先頭に配置します。
  • yes以外の文字列を設定した場合: asdfディレクトリを強制的にPATHの先頭に配置することは しません
  • Usage: ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"

完全な構成の例

下記のように、asdfをシンプルにセットアップしたとします:

  • Bashシェル
  • インストール先は$HOME/.asdf
  • Git経由でインストール
  • 環境変数は何も設定していない
  • .asdfrcファイルは何もカスタマイズしていない

すると、結果として以下のような構成となります:

構成値がセットされる過程
config file location$HOME/.asdfrcASDF_CONFIG_FILEは空なので、$HOME/.asdfrcが使用されます。
default tool versions filename.tool-versionsASDF_DEFAULT_TOOL_VERSIONS_FILENAMEは空なので、.tool-versionsが使用されます。
asdf dir$HOME/.asdfASDF_DIRは空なので、bin/asdfの親ディレクトリが使用されます。
asdf data dir$HOME/.asdfASDF_DATA_DIRは空であり、$HOMEが存在するので、$HOME/.asdfが使用されます。
concurrencyautoASDF_CONCURRENCYは空なので、デフォルト構成concurrencyの値に依存します。
legacy_version_fileno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
use_release_candidatesno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
always_keep_downloadno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
plugin_repository_last_check_duration60.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
disable_plugin_short_name_repositoryno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。

内部構成

この節では、パッケージマネージャやインテグレータ向けのasdfの内部構成について記述しているため、ユーザが気にする必要はありません。

  • $ASDF_DIR/asdf_updates_disabled: このファイルが存在する場合、asdf updateコマンドによる更新は無効になります(ファイル内容は関係ありません)。これは、PacmanやHomebrewのようなパッケージマネージャによって使用され、特定のインストールに対して正しい更新方法を適用するようにします。
',46))])}const q=s(c,[["render",v]]);export{O as __pageData,q as default}; diff --git a/assets/ja-jp_manage_configuration.md.CysILq4S.lean.js b/assets/ja-jp_manage_configuration.md.CysILq4S.lean.js new file mode 100644 index 00000000..3de3f943 --- /dev/null +++ b/assets/ja-jp_manage_configuration.md.CysILq4S.lean.js @@ -0,0 +1,9 @@ +import{_ as s,c as n,a2 as a,j as e,a as l,G as o,B as i,o as r}from"./chunks/framework.BQmytedh.js";const O=JSON.parse('{"title":"構成設定","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/manage/configuration.md","filePath":"ja-jp/manage/configuration.md","lastUpdated":1734397135000}'),c={name:"ja-jp/manage/configuration.md"},p={tabindex:"0"},f={style:{"text-align":"left"}},u={tabindex:"0"},g={style:{"text-align":"left"}},h={tabindex:"0"},y={style:{"text-align":"left"}},b={tabindex:"0"},m={style:{"text-align":"left"}},x={tabindex:"0"},_={style:{"text-align":"left"}};function v(k,t,D,A,E,F){const d=i("Badge");return r(),n("div",null,[t[32]||(t[32]=a(`

構成設定

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環境変数で設定できます。

下記は、構成に必要な項目とそのデフォルト値を示しています:

txt
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ファイルを読み込みます。

`,22)),e("table",p,[t[4]||(t[4]=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",f,[t[0]||(t[0]=e("code",null,"no",-1)),t[1]||(t[1]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"})]),t[2]||(t[2]=e("td",{style:{"text-align":"left"}},[l("バージョンの読み込みには"),e("code",null,".tool-versions"),l("を使用します")],-1))]),t[3]||(t[3]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},[l("利用可能なレガシーバージョンファイル("),e("code",null,".ruby-version"),l("など)がある場合、プラグインのフォールバックで使用します")])],-1))])]),t[33]||(t[33]=e("h3",{id:"use-release-candidates",tabindex:"-1"},[e("code",null,"use_release_candidates"),l(),e("a",{class:"header-anchor",href:"#use-release-candidates","aria-label":'Permalink to "`use_release_candidates`"'},"​")],-1)),t[34]||(t[34]=e("p",null,[e("code",null,"asdf update"),l("コマンドでasdfを更新する際に、最新リリースではなく、リリース候補版へ更新するか制御します。")],-1)),e("table",u,[t[9]||(t[9]=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",g,[t[5]||(t[5]=e("code",null,"no",-1)),t[6]||(t[6]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"})]),t[7]||(t[7]=e("td",{style:{"text-align":"left"}},"最新リリースを使用します",-1))]),t[8]||(t[8]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"リリース候補版を使用します")],-1))])]),t[35]||(t[35]=e("h3",{id:"always-keep-download",tabindex:"-1"},[e("code",null,"always_keep_download"),l(),e("a",{class:"header-anchor",href:"#always-keep-download","aria-label":'Permalink to "`always_keep_download`"'},"​")],-1)),t[36]||(t[36]=e("p",null,[e("code",null,"asdf install"),l("コマンドでダウンロードしたソースコードやバイナリを、保持しておくか削除するかを制御します。")],-1)),e("table",h,[t[14]||(t[14]=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",y,[t[10]||(t[10]=e("code",null,"no",-1)),t[11]||(t[11]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"})]),t[12]||(t[12]=e("td",{style:{"text-align":"left"}},"インストールが成功したら、ソースコードやバイナリを削除します",-1))]),t[13]||(t[13]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"インストール後も、ソースコードやバイナリを保持します")],-1))])]),t[37]||(t[37]=e("h3",{id:"plugin-repository-last-check-duration",tabindex:"-1"},[e("code",null,"plugin_repository_last_check_duration"),l(),e("a",{class:"header-anchor",href:"#plugin-repository-last-check-duration","aria-label":'Permalink to "`plugin_repository_last_check_duration`"'},"​")],-1)),t[38]||(t[38]=e("p",null,"asdfプラグインリポジトリの同期間隔(分)を制御します。何らかのトリガーイベントが発生した際に、最後に同期した時刻からの経過時間をチェックします。設定された間隔以上の時間が経過していた倍は、新たに同期が開始されます。",-1)),e("table",b,[t[26]||(t[26]=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",m,[t[15]||(t[15]=e("code",null,"1",-1)),t[16]||(t[16]=l("から")),t[17]||(t[17]=e("code",null,"999999999",-1)),t[18]||(t[18]=l("までの整数値 ")),t[19]||(t[19]=e("br",null,null,-1)),t[20]||(t[20]=l()),o(d,{type:"tip",text:"デフォルト",vertical:"middle"}),t[21]||(t[21]=l("は")),t[22]||(t[22]=e("code",null,"60",-1))]),t[23]||(t[23]=e("td",{style:{"text-align":"left"}},"最後に同期した時刻から指定時間(分)以上経過していた場合、トリガーイベントで同期します",-1))]),t[24]||(t[24]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"0")]),e("td",{style:{"text-align":"left"}},"トリガーイベントのたびに同期します")],-1)),t[25]||(t[25]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"never")]),e("td",{style:{"text-align":"left"}},"同期しません")],-1))])]),t[39]||(t[39]=a('

同期は、以下のコマンドが実行されたときに発生します:

  • 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",x,[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",_,[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

コンパイル時に使用するデフォルトのコア数です。

OptionsDescription
整数値ソースコードのコンパイル時に使用するコア数です
autonprocsysctl hw.ncpu/proc/cpuinfo、または1、の優先順でコア数を計算します

備考: ASDF_CONCURRENCY環境変数が設定されている場合はそちらが優先されます。

プラグインフック

下記のタイミングで、カスタムコードを実行することができます:

  • プラグインのインストール、Shim再生成、更新および削除をする際の前後
  • プラグインコマンドの実行前後

例えば、fooというプラグインがインストールされていて、barという実行可能ファイルが提供されている場合、以下のようなフックを使うことで、一番最初にカスタムコードを実行することができます:

text
pre_foo_bar = echo Executing with args: $@

以下のパターンがサポートされています:

  • pre_<plugin_name>_<command>
  • pre_asdf_download_<plugin_name>
  • {pre,post}_asdf_{install,reshim,uninstall}_<plugin_name>
    • $1: フルバージョン
  • {pre,post}_asdf_plugin_{add,update,remove,reshim}
    • $1: プラグイン名
  • {pre,post}_asdf_plugin_{add,update,remove}_<plugin_name>

どのようなコマンドの前後にどのようなコマンドフックを実行すべきかについての詳細は、プラグインの作成をご覧ください。

環境変数

環境変数の設定値は、お使いのシステムやシェルによって異なります。デフォルトロケーションは、インストールした場所や方法(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の値よりも優先されます。

  • 未設定の場合: asdf構成ファイルのconcurrencyの値が使用されます。
  • 使用方法: export ASDF_CONCURRENCY=32

ASDF_FORCE_PREPEND

asdfのShimやパスのディレクトリをPATHの先頭(最高優先度)に追加するかどうかを設定します。

  • 未設定の場合: macOSでのデフォルト値はyes、その他のシステムでのデフォルト値はnoです。
  • yesの場合: asdfディレクトリを強制的にPATHの先頭に配置します。
  • yes以外の文字列を設定した場合: asdfディレクトリを強制的にPATHの先頭に配置することは しません
  • Usage: ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"

完全な構成の例

下記のように、asdfをシンプルにセットアップしたとします:

  • Bashシェル
  • インストール先は$HOME/.asdf
  • Git経由でインストール
  • 環境変数は何も設定していない
  • .asdfrcファイルは何もカスタマイズしていない

すると、結果として以下のような構成となります:

構成値がセットされる過程
config file location$HOME/.asdfrcASDF_CONFIG_FILEは空なので、$HOME/.asdfrcが使用されます。
default tool versions filename.tool-versionsASDF_DEFAULT_TOOL_VERSIONS_FILENAMEは空なので、.tool-versionsが使用されます。
asdf dir$HOME/.asdfASDF_DIRは空なので、bin/asdfの親ディレクトリが使用されます。
asdf data dir$HOME/.asdfASDF_DATA_DIRは空であり、$HOMEが存在するので、$HOME/.asdfが使用されます。
concurrencyautoASDF_CONCURRENCYは空なので、デフォルト構成concurrencyの値に依存します。
legacy_version_fileno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
use_release_candidatesno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
always_keep_downloadno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
plugin_repository_last_check_duration60.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
disable_plugin_short_name_repositoryno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。

内部構成

この節では、パッケージマネージャやインテグレータ向けのasdfの内部構成について記述しているため、ユーザが気にする必要はありません。

  • $ASDF_DIR/asdf_updates_disabled: このファイルが存在する場合、asdf updateコマンドによる更新は無効になります(ファイル内容は関係ありません)。これは、PacmanやHomebrewのようなパッケージマネージャによって使用され、特定のインストールに対して正しい更新方法を適用するようにします。
',46))])}const q=s(c,[["render",v]]);export{O as __pageData,q as default}; diff --git a/assets/ja-jp_manage_core.md.DkSs_n4l.js b/assets/ja-jp_manage_core.md.DkSs_n4l.js new file mode 100644 index 00000000..e6646634 --- /dev/null +++ b/assets/ja-jp_manage_core.md.DkSs_n4l.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as l,o as t}from"./chunks/framework.BQmytedh.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のコマンドはかなり少量ですが、多くのワークフローを円滑に進めることができます。

インストール & セットアップ

はじめようのガイドで説明されています。

実行

shell
asdf exec <command> [args...]

現在のバージョンのShimでコマンドを実行します。

環境変数

shell
asdf env <command> [util]

情報

shell
asdf info

OS、シェル、およびasdfのデバッグ情報を表示するヘルパーコマンドです。バグレポート作成時に共有してください。

Shimの再作成

shell
asdf reshim <name> <version>

特定のパッケージ・バージョンのShimを再作成します。デフォルトでは、Shimはプラグインによってツールのインストール中に作成されます。npm CLIなどのツールは、実行ファイルをグローバルインストールができます(例:npm install -g yarnコマンドでYarnをインストール)が、これらの実行ファイルはプラグインのライフサイクルを通してインストールされないため、Shimはまだ存在しません。そのような時に、例えばasdf reshim nodejs <version>を実行すると、nodejs<version>に対して、yarnのような新しい実行ファイルのShimを強制的に再作成させることができます。

Shimのバージョン

shell
asdf shim-versions <command>

<command>のShimを提供するプラグインおよびバージョンを一覧で表示します。

例えば、Node.jsにはnodenpmという2つの実行ファイルが提供されています。asdf-nodejsプラグインで、複数のバージョンのツールがインストールされている場合、shim-versionsは下記のような一覧を返します:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

更新

asdfには、Git依存のアップデートコマンドが用意されています(推奨されるインストール方法を使用した場合)。別の方法でインストールした場合、その方法の手順に従ってください:

方法最新の安定リリースmasterブランチの最新コミット
asdf (Git経由)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
Pacman新しいPKGBUILDをダウンロードしてリビルド、
または好みのAURヘルパーを使用

アンインストール

asdfをアンインストールするには以下の手順に従ってください:

Bash & Git
  1. ~/.bashrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. ~/.bash_profileで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. ~/.bashrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

コマンド補完については、Homebrewで説明されている方法で設定されている可能性があるため、そちらのガイドに従って削除する行を見つけてください。

  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

macOS Catalina以降では、デフォルトのシェルがZSHに変更されました。もし、~/.bash_profileに設定が見つからない場合は、~/.zshrcにある可能性があります。その場合は、ZSHの手順をご覧ください。

  1. ~/.bash_profileで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

コマンド補完については、Homebrewで説明されている方法で設定されている可能性があるため、そちらのガイドに従って削除する行を見つけてください。

  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. ~/.bashrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. /opt/asdf-vm/asdf.sh
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. ~/.config/fish/config.fishで、asdf.fishをsourceしている行を削除します:
shell
source ~/.asdf/asdf.fish

そして、次のコマンドで、コマンド補完を削除します:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. ~/.config/fish/config.fishで、asdf.fishをsourceしている行を削除します:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. ~/.config/fish/config.fishで、asdf.fishをsourceしている行を削除します:
shell
source /opt/asdf-vm/asdf.fish
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. ~/.config/elvish/rc.elvで、asdfモジュールを使用している行を削除します:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

そして、次のコマンドで、asdfモジュールを削除します:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. $HOME/.asdfディレクトリを削除します:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. ~/.config/elvish/rc.elvで、asdfモジュールを使用している行を削除します:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

そして、次のコマンドで、asdfモジュールを削除します:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. ~/.config/elvish/rc.elvで、asdfモジュールを使用している行を削除します:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

そして、次のコマンドで、asdfモジュールを削除します:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. ~/.zshrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

または、ZSHフレームワークプラグインを使用します。

  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. ~/.zshrcで、asdf.shをsourceしている行を削除します:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force && brew autoremove
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. ~/.zshrcで、asdf.shをsourceしている行を削除します:
shell
. /opt/asdf-vm/asdf.sh
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
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.DkSs_n4l.lean.js b/assets/ja-jp_manage_core.md.DkSs_n4l.lean.js new file mode 100644 index 00000000..e6646634 --- /dev/null +++ b/assets/ja-jp_manage_core.md.DkSs_n4l.lean.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as l,o as t}from"./chunks/framework.BQmytedh.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のコマンドはかなり少量ですが、多くのワークフローを円滑に進めることができます。

インストール & セットアップ

はじめようのガイドで説明されています。

実行

shell
asdf exec <command> [args...]

現在のバージョンのShimでコマンドを実行します。

環境変数

shell
asdf env <command> [util]

情報

shell
asdf info

OS、シェル、およびasdfのデバッグ情報を表示するヘルパーコマンドです。バグレポート作成時に共有してください。

Shimの再作成

shell
asdf reshim <name> <version>

特定のパッケージ・バージョンのShimを再作成します。デフォルトでは、Shimはプラグインによってツールのインストール中に作成されます。npm CLIなどのツールは、実行ファイルをグローバルインストールができます(例:npm install -g yarnコマンドでYarnをインストール)が、これらの実行ファイルはプラグインのライフサイクルを通してインストールされないため、Shimはまだ存在しません。そのような時に、例えばasdf reshim nodejs <version>を実行すると、nodejs<version>に対して、yarnのような新しい実行ファイルのShimを強制的に再作成させることができます。

Shimのバージョン

shell
asdf shim-versions <command>

<command>のShimを提供するプラグインおよびバージョンを一覧で表示します。

例えば、Node.jsにはnodenpmという2つの実行ファイルが提供されています。asdf-nodejsプラグインで、複数のバージョンのツールがインストールされている場合、shim-versionsは下記のような一覧を返します:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

更新

asdfには、Git依存のアップデートコマンドが用意されています(推奨されるインストール方法を使用した場合)。別の方法でインストールした場合、その方法の手順に従ってください:

方法最新の安定リリースmasterブランチの最新コミット
asdf (Git経由)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
Pacman新しいPKGBUILDをダウンロードしてリビルド、
または好みのAURヘルパーを使用

アンインストール

asdfをアンインストールするには以下の手順に従ってください:

Bash & Git
  1. ~/.bashrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. ~/.bash_profileで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. ~/.bashrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

コマンド補完については、Homebrewで説明されている方法で設定されている可能性があるため、そちらのガイドに従って削除する行を見つけてください。

  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

macOS Catalina以降では、デフォルトのシェルがZSHに変更されました。もし、~/.bash_profileに設定が見つからない場合は、~/.zshrcにある可能性があります。その場合は、ZSHの手順をご覧ください。

  1. ~/.bash_profileで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

コマンド補完については、Homebrewで説明されている方法で設定されている可能性があるため、そちらのガイドに従って削除する行を見つけてください。

  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. ~/.bashrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. /opt/asdf-vm/asdf.sh
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. ~/.config/fish/config.fishで、asdf.fishをsourceしている行を削除します:
shell
source ~/.asdf/asdf.fish

そして、次のコマンドで、コマンド補完を削除します:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. ~/.config/fish/config.fishで、asdf.fishをsourceしている行を削除します:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. ~/.config/fish/config.fishで、asdf.fishをsourceしている行を削除します:
shell
source /opt/asdf-vm/asdf.fish
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. ~/.config/elvish/rc.elvで、asdfモジュールを使用している行を削除します:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

そして、次のコマンドで、asdfモジュールを削除します:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. $HOME/.asdfディレクトリを削除します:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. ~/.config/elvish/rc.elvで、asdfモジュールを使用している行を削除します:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

そして、次のコマンドで、asdfモジュールを削除します:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. ~/.config/elvish/rc.elvで、asdfモジュールを使用している行を削除します:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

そして、次のコマンドで、asdfモジュールを削除します:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. ~/.zshrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

または、ZSHフレームワークプラグインを使用します。

  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. ~/.zshrcで、asdf.shをsourceしている行を削除します:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force && brew autoremove
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. ~/.zshrcで、asdf.shをsourceしている行を削除します:
shell
. /opt/asdf-vm/asdf.sh
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
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.Dveizso5.js b/assets/ja-jp_manage_plugins.md.Dveizso5.js new file mode 100644 index 00000000..bb2ade41 --- /dev/null +++ b/assets/ja-jp_manage_plugins.md.Dveizso5.js @@ -0,0 +1,11 @@ +import{_ as a,c as i,a2 as l,o as e}from"./chunks/framework.BQmytedh.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からプラグインを追加します:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

または下記のコマンドで、プラグインリポジトリのショートネームを指定して追加します:

shell
asdf plugin add <name>
+# asdf plugin add erlang

推奨

リポジトリのショートネームに依存しないために、git-urlを使用することを推奨します。

インストール済みプラグイン一覧

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

全プラグインのショートネーム一覧

shell
asdf plugin list all

全プラグインのショートネーム一覧については、プラグインショートネームの一覧もご覧ください。

更新

shell
asdf plugin update --all

特定のプラグインパッケージを更新したい場合は、下記のように指定してください。

shell
asdf plugin update <name>
+# asdf plugin update erlang

この更新コマンドは、プラグインリポジトリの originデフォルトブランチ における 最新コミット を取得します。バージョニングされたプラグインの更新機能については、現在開発中です(#916)。

削除

bash
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の構成設定のリファレンスをご覧ください。
`,26)]))}const c=a(t,[["render",n]]);export{g as __pageData,c as default}; diff --git a/assets/ja-jp_manage_plugins.md.Dveizso5.lean.js b/assets/ja-jp_manage_plugins.md.Dveizso5.lean.js new file mode 100644 index 00000000..bb2ade41 --- /dev/null +++ b/assets/ja-jp_manage_plugins.md.Dveizso5.lean.js @@ -0,0 +1,11 @@ +import{_ as a,c as i,a2 as l,o as e}from"./chunks/framework.BQmytedh.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からプラグインを追加します:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

または下記のコマンドで、プラグインリポジトリのショートネームを指定して追加します:

shell
asdf plugin add <name>
+# asdf plugin add erlang

推奨

リポジトリのショートネームに依存しないために、git-urlを使用することを推奨します。

インストール済みプラグイン一覧

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

全プラグインのショートネーム一覧

shell
asdf plugin list all

全プラグインのショートネーム一覧については、プラグインショートネームの一覧もご覧ください。

更新

shell
asdf plugin update --all

特定のプラグインパッケージを更新したい場合は、下記のように指定してください。

shell
asdf plugin update <name>
+# asdf plugin update erlang

この更新コマンドは、プラグインリポジトリの originデフォルトブランチ における 最新コミット を取得します。バージョニングされたプラグインの更新機能については、現在開発中です(#916)。

削除

bash
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の構成設定のリファレンスをご覧ください。
`,26)]))}const c=a(t,[["render",n]]);export{g as __pageData,c as default}; diff --git a/assets/ja-jp_manage_versions.md.B4flZrjK.js b/assets/ja-jp_manage_versions.md.B4flZrjK.js new file mode 100644 index 00000000..006e5091 --- /dev/null +++ b/assets/ja-jp_manage_versions.md.B4flZrjK.js @@ -0,0 +1,30 @@ +import{_ as i,c as a,a2 as l,o as h}from"./chunks/framework.BQmytedh.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(`

バージョン

バージョンのインストール

shell
asdf install <name> <version>
+# asdf install erlang 17.3

プラグインが、ソースコードからのダウンロード・コンパイルをサポートしている場合、ref:fooの形式(fooは特定のブランチ、タグ、またはコミット)でバージョンを指定できます。アンインストールするときも、同じ名前とバージョンを指定する必要があります。

最新安定バージョンのインストール

shell
asdf install <name> latest
+# asdf install erlang latest

下記のように、特定のプレフィックスでの最新安定バージョンをインストールすることもできます。

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

インストール済みバージョン一覧

shell
asdf list <name>
+# asdf list erlang

下記のように、特定のプレフィックスでのバージョンでフィルタすることもできます。

shell
asdf list <name> <version>
+# asdf list erlang 17

インストール可能な全バージョン一覧

shell
asdf list all <name>
+# asdf list all erlang

下記のように、特定のプレフィックスでのバージョンでフィルタすることもできます。

shell
asdf list all <name> <version>
+# asdf list all erlang 17

最新安定バージョンの表示

shell
asdf latest <name>
+# asdf latest erlang

下記のように、特定のプレフィックスでの最新安定バージョンで表示することもできます。

shell
asdf latest <name> <version>
+# asdf latest erlang 17

カレントバージョンのセット

shell
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ファイルでサポートされているものと同じです。

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

システムバージョンへの委任

asdfで管理されているバージョンではなく、<name>で指定されたツールのシステムバージョンを使用するには、バージョンとしてsystemを指定します。

カレントバージョンのセットと同様の方法で、globallocal、またはshellのいずれかにsystemをセットしてください。

shell
asdf local <name> system
+# asdf local python system

カレントバージョンの表示

shell
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

バージョンのアンインストール

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

Shims

asdfがパッケージをインストールすると、そのパッケージに含まれるすべての実行プログラムのShimが$ASDF_DATA_DIR/shimsディレクトリ(デフォルトは~/.asdf/shims)に作成されます。このディレクトリが(asdf.shasdf.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コマンドは、下記のように、インストールされたパッケージへのパスを返すため、この状況を解決するのに役立ちます:

shell
# 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の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.B4flZrjK.lean.js b/assets/ja-jp_manage_versions.md.B4flZrjK.lean.js new file mode 100644 index 00000000..006e5091 --- /dev/null +++ b/assets/ja-jp_manage_versions.md.B4flZrjK.lean.js @@ -0,0 +1,30 @@ +import{_ as i,c as a,a2 as l,o as h}from"./chunks/framework.BQmytedh.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(`

バージョン

バージョンのインストール

shell
asdf install <name> <version>
+# asdf install erlang 17.3

プラグインが、ソースコードからのダウンロード・コンパイルをサポートしている場合、ref:fooの形式(fooは特定のブランチ、タグ、またはコミット)でバージョンを指定できます。アンインストールするときも、同じ名前とバージョンを指定する必要があります。

最新安定バージョンのインストール

shell
asdf install <name> latest
+# asdf install erlang latest

下記のように、特定のプレフィックスでの最新安定バージョンをインストールすることもできます。

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

インストール済みバージョン一覧

shell
asdf list <name>
+# asdf list erlang

下記のように、特定のプレフィックスでのバージョンでフィルタすることもできます。

shell
asdf list <name> <version>
+# asdf list erlang 17

インストール可能な全バージョン一覧

shell
asdf list all <name>
+# asdf list all erlang

下記のように、特定のプレフィックスでのバージョンでフィルタすることもできます。

shell
asdf list all <name> <version>
+# asdf list all erlang 17

最新安定バージョンの表示

shell
asdf latest <name>
+# asdf latest erlang

下記のように、特定のプレフィックスでの最新安定バージョンで表示することもできます。

shell
asdf latest <name> <version>
+# asdf latest erlang 17

カレントバージョンのセット

shell
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ファイルでサポートされているものと同じです。

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

システムバージョンへの委任

asdfで管理されているバージョンではなく、<name>で指定されたツールのシステムバージョンを使用するには、バージョンとしてsystemを指定します。

カレントバージョンのセットと同様の方法で、globallocal、またはshellのいずれかにsystemをセットしてください。

shell
asdf local <name> system
+# asdf local python system

カレントバージョンの表示

shell
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

バージョンのアンインストール

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

Shims

asdfがパッケージをインストールすると、そのパッケージに含まれるすべての実行プログラムのShimが$ASDF_DATA_DIR/shimsディレクトリ(デフォルトは~/.asdf/shims)に作成されます。このディレクトリが(asdf.shasdf.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コマンドは、下記のように、インストールされたパッケージへのパスを返すため、この状況を解決するのに役立ちます:

shell
# 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の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.Cq5uhq32.js b/assets/ja-jp_more_community-projects.md.Cq5uhq32.js new file mode 100644 index 00000000..bbc43697 --- /dev/null +++ b/assets/ja-jp_more_community-projects.md.Cq5uhq32.js @@ -0,0 +1 @@ +import{_ as t,c as a,a2 as o,o as r}from"./chunks/framework.BQmytedh.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-community: asdfプラグインの長期的なメンテナンスを目的とした コミュニティ主導の共同プロジェクトです。
  • asdf dev container: GitHub Codespacesでasdfによるツール管理をサポートする、 GitHub Dev Container です。

備考

asdfコアチームは、これらのプロジェクトやコードを所有していません。 asdfコアでは、ここに掲載されているものに関連する品質やセキュリティについては責任を負いません。

',4)]))}const u=t(s,[["render",c]]);export{f as __pageData,u as default}; diff --git a/assets/ja-jp_more_community-projects.md.Cq5uhq32.lean.js b/assets/ja-jp_more_community-projects.md.Cq5uhq32.lean.js new file mode 100644 index 00000000..bbc43697 --- /dev/null +++ b/assets/ja-jp_more_community-projects.md.Cq5uhq32.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,a2 as o,o as r}from"./chunks/framework.BQmytedh.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-community: asdfプラグインの長期的なメンテナンスを目的とした コミュニティ主導の共同プロジェクトです。
  • asdf dev container: GitHub Codespacesでasdfによるツール管理をサポートする、 GitHub Dev Container です。

備考

asdfコアチームは、これらのプロジェクトやコードを所有していません。 asdfコアでは、ここに掲載されているものに関連する品質やセキュリティについては責任を負いません。

',4)]))}const u=t(s,[["render",c]]);export{f as __pageData,u as default}; diff --git a/assets/ja-jp_more_faq.md.AspkCmpH.js b/assets/ja-jp_more_faq.md.AspkCmpH.js new file mode 100644 index 00000000..a2b62932 --- /dev/null +++ b/assets/ja-jp_more_faq.md.AspkCmpH.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as t}from"./chunks/framework.BQmytedh.js";const p=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/more/faq.md","filePath":"ja-jp/more/faq.md","lastUpdated":1704890757000}'),s={name:"ja-jp/more/faq.md"};function i(d,e,n,c,h,l){return t(),o("div",null,e[0]||(e[0]=[r('

FAQ

ここでは、asdfに関するよくある質問を紹介します。

WSL1をサポートしていますか?

WSL1 (Windows Subsystem for Linux 1)は公式にはサポートしていません。asdfは正常に動作しない可能性があります。WSL1を公式にサポートする予定はありません。

WSL2をサポートしていますか?

WSL2 (Windows Subsystem for Linux 2)では、あなたが選択したWSLディストリビューションに基づいて、セットアップと依存関係の解決を済ませれば、動作するはずです。

重要なのは、WSL2が正常に動作するのは、カレントワークディレクトリがWindowsドライブではなくUnixドライブである場合に 限られる ということです。

GitHub Actionsでホストランナーのサポートが可能になれば、WSL2でテストスイートを実行する予定ですが、現時点ではそうではないようです。

新しくインストールした実行ファイルが実行できないのですが?

npm install -g yarnを実行したにも関わらず、yarnが実行できません。どうなっているの?

asdfShimを使って実行ファイルを管理しています。プラグインによってインストールされるものは、自動的にShimが作成されますが、asdfが管理しているツールによって実行ファイルがインストールされた場合は、Shimを作成しなければならないということをasdfに通知する必要があります。上記の例では、YarnのShimを作成しなければいけません。詳しくは、asdf reshimコマンドのドキュメントをご覧ください。

シェルが、新しくインストールされたShimを検知してくれないのですが?

asdf reshimコマンドを実行しても問題が解決しない場合、asdf.shasdf.fishのsourceが、シェルの構成ファイル(.bash_profile.zshrcconfig.fishなど)の一番下にないことが原因である可能性があります。$PATHを設定した、そしてフレームワーク(oh-my-zshなど)を使用しているのれあればそれをsourceしたに、sourceする必要があります。

',13)]))}const m=a(s,[["render",i]]);export{p as __pageData,m as default}; diff --git a/assets/ja-jp_more_faq.md.AspkCmpH.lean.js b/assets/ja-jp_more_faq.md.AspkCmpH.lean.js new file mode 100644 index 00000000..a2b62932 --- /dev/null +++ b/assets/ja-jp_more_faq.md.AspkCmpH.lean.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as t}from"./chunks/framework.BQmytedh.js";const p=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/more/faq.md","filePath":"ja-jp/more/faq.md","lastUpdated":1704890757000}'),s={name:"ja-jp/more/faq.md"};function i(d,e,n,c,h,l){return t(),o("div",null,e[0]||(e[0]=[r('

FAQ

ここでは、asdfに関するよくある質問を紹介します。

WSL1をサポートしていますか?

WSL1 (Windows Subsystem for Linux 1)は公式にはサポートしていません。asdfは正常に動作しない可能性があります。WSL1を公式にサポートする予定はありません。

WSL2をサポートしていますか?

WSL2 (Windows Subsystem for Linux 2)では、あなたが選択したWSLディストリビューションに基づいて、セットアップと依存関係の解決を済ませれば、動作するはずです。

重要なのは、WSL2が正常に動作するのは、カレントワークディレクトリがWindowsドライブではなくUnixドライブである場合に 限られる ということです。

GitHub Actionsでホストランナーのサポートが可能になれば、WSL2でテストスイートを実行する予定ですが、現時点ではそうではないようです。

新しくインストールした実行ファイルが実行できないのですが?

npm install -g yarnを実行したにも関わらず、yarnが実行できません。どうなっているの?

asdfShimを使って実行ファイルを管理しています。プラグインによってインストールされるものは、自動的にShimが作成されますが、asdfが管理しているツールによって実行ファイルがインストールされた場合は、Shimを作成しなければならないということをasdfに通知する必要があります。上記の例では、YarnのShimを作成しなければいけません。詳しくは、asdf reshimコマンドのドキュメントをご覧ください。

シェルが、新しくインストールされたShimを検知してくれないのですが?

asdf reshimコマンドを実行しても問題が解決しない場合、asdf.shasdf.fishのsourceが、シェルの構成ファイル(.bash_profile.zshrcconfig.fishなど)の一番下にないことが原因である可能性があります。$PATHを設定した、そしてフレームワーク(oh-my-zshなど)を使用しているのれあればそれをsourceしたに、sourceする必要があります。

',13)]))}const m=a(s,[["render",i]]);export{p as __pageData,m as default}; diff --git a/assets/ja-jp_more_thanks.md.dd0Jv9gE.js b/assets/ja-jp_more_thanks.md.dd0Jv9gE.js new file mode 100644 index 00000000..ba5e3b33 --- /dev/null +++ b/assets/ja-jp_more_thanks.md.dd0Jv9gE.js @@ -0,0 +1 @@ +import{_ as e,c as r,a2 as t,o as h}from"./chunks/framework.BQmytedh.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_more_thanks.md.dd0Jv9gE.lean.js b/assets/ja-jp_more_thanks.md.dd0Jv9gE.lean.js new file mode 100644 index 00000000..ba5e3b33 --- /dev/null +++ b/assets/ja-jp_more_thanks.md.dd0Jv9gE.lean.js @@ -0,0 +1 @@ +import{_ as e,c as r,a2 as t,o as h}from"./chunks/framework.BQmytedh.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.DRELQIdl.js b/assets/ja-jp_plugins_create.md.DRELQIdl.js new file mode 100644 index 00000000..ebbf75ef --- /dev/null +++ b/assets/ja-jp_plugins_create.md.DRELQIdl.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.BQmytedh.js";const x=JSON.parse('{"title":"プラグインの作成","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/plugins/create.md","filePath":"ja-jp/plugins/create.md","lastUpdated":1734397135000}'),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つの方法があります:

  1. asdf-vm/asdf-plugin-templateリポジトリを使用し、 デフォルトのスクリプトが実装されたプラグインリポジトリ(名前はasdf-<tool_name>)を 生成 します。 生成できたら、 そのリポジトリをクローンしてsetup.bashのスクリプトを実行し、 テンプレートを対話的に更新していきます。
  2. 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_TYPEversionまたはrefです。
ASDF_INSTALL_VERSIONASDF_INSTALL_TYPEに応じてフルバージョンナンバーまたはGit Refの値が入ります。
ASDF_INSTALL_PATHツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。
ASDF_CONCURRENCYソースコードのコンパイル時に使用するコア数です。make -jのようなフラグを設定する際に便利です。
ASDF_DOWNLOAD_PATHbin/downloadによってソースコードまたはバイナリがダウンロードされる場所へのパスです。
ASDF_PLUGIN_PATHプラグインがインストールされている場所へのパスです。
ASDF_PLUGIN_SOURCE_URLプラグインソースのURLです。
ASDF_PLUGIN_PREV_REFプラグインの以前のgit-refです。
ASDF_PLUGIN_POST_REF更新後のプラグインのgit-refです。
ASDF_CMD_FILEソースとなるファイルのフルパスに解決されます。

備考

すべてのスクリプトですべての環境変数が使用できるわけではありません。 以下の各スクリプトのドキュメントで、そのスクリプトで利用可能な環境変数を確認してください。

必須スクリプト

',6)),i("h3",b,[s[26]||(s[26]=i("code",null,"bin/list-all",-1)),s[27]||(s[27]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"}),s[28]||(s[28]=a()),s[29]||(s[29]=i("a",{class:"header-anchor",href:"#bin-list-all","aria-label":'Permalink to "`bin/list-all` "'},"​",-1))]),s[50]||(s[50]=e('

説明

インストール可能なすべてのバージョンをリストします。

出力フォーマット

スペース区切りのバージョンリストの文字列を出力する必要があります。例えば次のとおりです:

txt
1.0.1 1.0.2 1.3.0 1.4

最新バージョンが末尾にくる必要があります。

asdfコアは各バージョンを1行ずつ表示するため、 いくつかのバージョンは画面外にはみ出る場合があります。

並べ替え

ウェブサイト上のリリースページからバージョンを取得する場合、 提供されている順序は正しいリリース順となっていることが多いため、 そのままの順序を使用することを推奨します。 逆順にしたければ、tscをパイプで通すだけで十分です。

どうしても並べ替えが避けられない場合、sort -Vは移植性が無いため、次のいずれかの方法を使用することを推奨します:

スクリプトで使用できる環境変数

このスクリプトに環境変数は提供されません。

このスクリプトを呼び出すコマンド

  • asdf list all <name> [version]
  • asdf list all nodejs: このスクリプトで返されるすべてのバージョンを、 1行ずつリストします。
  • asdf list all nodejs 18: このスクリプトで返されるすべてのバージョンから、 18で始まるバージョンのみフィルタし、1行ずつリストします。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/list-all"

',19)),i("h3",F,[s[30]||(s[30]=i("code",null,"bin/download",-1)),s[31]||(s[31]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"}),s[32]||(s[32]=a()),s[33]||(s[33]=i("a",{class:"header-anchor",href:"#bin-download","aria-label":'Permalink to "`bin/download` "'},"​",-1))]),s[51]||(s[51]=e('

説明

ツールの特定バージョンのソースコードまたはバイナリを、指定された場所にダウンロードします。

実装内容

  • スクリプトは、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からの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}"/bin/download

',16)),i("h3",E,[s[34]||(s[34]=i("code",null,"bin/install",-1)),s[35]||(s[35]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"}),s[36]||(s[36]=a()),s[37]||(s[37]=i("a",{class:"header-anchor",href:"#bin-install","aria-label":'Permalink to "`bin/install` "'},"​",-1))]),s[52]||(s[52]=e('

説明

ツールの特定バージョンを指定された場所にインストールします。

実装内容

  • スクリプトは、指定されたバージョンをASDF_INSTALL_PATHのパスのディレクトリにインストールする必要があります。
  • Shimはデフォルトで、$ASDF_INSTALL_PATH/bin内にあるファイルに対して作成されます。 この動作は、オプションのbin/list-bin-pathsスクリプトでカスタマイズできます。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。
  • TOCTOU (Time-of-Check-to-Time-of-Use)の問題を避けるために、ツールのビルドとインストールが成功したとみなされた場合にのみ、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からの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}"/bin/install

オプションスクリプト

',15)),i("h3",y,[s[38]||(s[38]=i("code",null,"bin/latest-stable",-1)),s[39]||(s[39]=a()),l(t,{type:"warning",text:"推奨",vertical:"middle"}),s[40]||(s[40]=a()),s[41]||(s[41]=i("a",{class:"header-anchor",href:"#bin-latest-stable","aria-label":'Permalink to "`bin/latest-stable` "'},"​",-1))]),s[53]||(s[53]=e('

説明

ツールの最新安定バージョンを判定します。このスクリプトが存在しない場合、asdfコアはbin/list-allの出力をtailした結果をもとに判定しますが、ツールによってはこれが望ましくないことがあります。

実装内容

  • スクリプトは、ツールの最新安定バージョンを標準出力する必要があります。
  • 非安定版やリリース候補版は除外されるべきです。
  • フィルタクエリは、スクリプトの第1引数で提供されます。このクエリは、バージョン番号やツールプロバイダによる出力をフィルタするために使用されるべきです。
    • 例えば、rubyプラグインでのasdf list all rubyの出力は、jrubyrbxtrufflerubyなどの多くのプロバイダの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つの引数を受け取ります。

bash
"${plugin_path}"/bin/latest-stable "$query"

bin/help.overview

説明

プラグインおよび管理されているツールに関する概要説明を出力します。

実装内容

  • このスクリプトは、プラグインのヘルプを表示するために必要です。
  • ヘッダはasdfコア側で表示するため、スクリプト内では表示しないでください。
  • 自由な形式のテキストで出力して構いませんが、短い1段落程度の説明が理想です。
  • コアとなるasdf-vmドキュメントですでに説明されている情報は出力しないでください。
  • オペレーティングシステムと、インストールされているツールのバージョンに合わせて出力を調整する必要があります(必要に応じて、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からの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.overview

bin/help.deps

説明

オペレーティングシステムに合わせた依存関係のリストを出力します。依存関係を1行ごとに出力します。

bash
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からの呼び出しシグネチャ

bash
"${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からの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.config

説明

プラグインとツールに関連するリンクリストを出力します。リンクを1行ごとに出力します。

bash
Git Repository:	https://github.com/vlang/v\nDocumentation:	https://vlang.io

実装内容

  • このスクリプトの出力を考慮するために、bin/help.overviewを用意する必要があります。
  • リンクを1行ごとに出力してください。
  • 形式は以下のいずれかである必要があります:
    • <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からの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.links

bin/list-bin-paths

説明

ツールの特定バージョンにおける、実行ファイルが含まれるディレクトリの一覧を出力します。

実装内容

  • このスクリプトが存在しない場合、asdfは"${ASDF_INSTALL_PATH}"/binディレクトリ内にあるバイナリを探し、そのバイナリ向けのShimを作成します。
  • 実行ファイルが含まれるディレクトリのパスをスペース区切りで出力してください。
  • パスはASDF_INSTALL_PATHからの相対パスである必要があります。例えば、次のような出力となります:
bash
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からの呼び出しシグネチャ

bash
"${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からの呼び出しシグネチャ

bash
"${plugin_path}/bin/exec-env"

bin/exec-path

ツールの特定バージョンの実行ファイルパスを取得します。 実行ファイルへの相対パスを文字列で出力する必要があります。 これにより、プラグインはShimで指定された実行ファイルパスを条件付きで上書きして返すか、 そうでなければ、Shimで指定されたデフォルトのパスを返すことができます。

説明

ツールの特定バージョンの実行ファイルパスを取得します。

実装内容

  • 実行ファイルへの相対パスを文字列で出力する必要があります。
  • Shimで指定された実行ファイルパスを条件付きで上書きして返すか、そうでなければ、Shimで指定されたデフォルトのパスを返してください。
shell
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からの呼び出しシグネチャ

bash
"${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からの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/uninstall"

bin/list-legacy-filenames

説明

ツールのバージョンを決定するために使用されるレガシー構成ファイルのリストを出力します。

実装内容

  • スペース区切りのファイル名リストを出力してください。
    bash
    .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からの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/list-legacy-filenames"

bin/parse-legacy-file

説明

asdfによって発見されたレガシーファイルをパースして、ツールのバージョンを決定します。JavaScriptのpackage.jsonや、Go言語のgo.modのようなファイルから、バージョン番号を抽出するのに役立ちます。

実装内容

  • このスクリプトが存在しない場合、asdfは単純にレガシーファイルをcatしてバージョンを決定します。
  • 決定論的で、常に正確で同じバージョンを返す必要があります:
    • 同じレガシーファイルを解析したら、同じバージョンを返すようにしてください。
    • マシンに何がインストールされているか、また、レガシーバージョンが有効で完全かどうかは関係ありません。一部のレガシーファイルのフォーマットは適切でないときもあります。
  • 下記のように、バージョン番号を1行で出力してください:
    bash
    1.2.3

スクリプトで使用できる環境変数

このスクリプトが呼び出される前に、環境変数が設定されることはありません。

このスクリプトを呼び出すコマンド

ツールのバージョンを読み込むすべてのコマンドから呼び出されます。

asdfからの呼び出しシグネチャ

このスクリプトは、レガシーファイルの内容を読み込むために、レガシーファイルのパスという1つの引数を受け取ります。

bash
"${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からの呼び出しシグネチャ

引数はありません。

bash
"${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からの呼び出しシグネチャ

引数はありません。

bash
"${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からの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/pre-plugin-remove"
',172)),i("h2",m,[s[42]||(s[42]=a("asdf CLIの拡張コマンド ")),l(t,{type:"danger",text:"高度",vertical:"middle"}),s[43]||(s[43]=a()),s[44]||(s[44]=i("a",{class:"header-anchor",href:"#asdf-cliの拡張コマンド","aria-label":'Permalink to "asdf CLIの拡張コマンド "'},"​",-1))]),s[54]||(s[54]=e('

プラグイン名をサブコマンドとして使用し、 asdfコマンドラインインターフェースを通して呼び出すことのできるlib/commands/command*.bashスクリプトまたは実行ファイルを用意することで、 新しいasdfコマンドを定義することができます。

例えば、fooというプラグインがあるとすると:

shell
foo/\n  lib/commands/\n    command.bash\n    command-bat.bash\n    command-bat-man.bash\n    command-help.bash

ユーザは下記コマンドが実行できるようになります:

shell
$ 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テンプレート "'},"​",-1))]),s[55]||(s[55]=e(`

警告

どうしても必要な場合にのみ使用してください。

asdfでは、カスタムShimテンプレートを使用することができます。 fooという実行ファイルに対して、プラグイン内にshims/fooファイルが存在すれば、 asdfは標準Shimテンプレートを使用する代わりに、そのファイルをコピーします。

この機能は賢く使う必要があります。

asdfコアチームが把握している限り、 この機能は公式プラグインであるElixirプラグインでのみ使用されています。 実行ファイルは、実行ファイルであると同時に、Elixirファイルとしても読み込まれます。 そのため、標準的なBashのShimを使用できないのです。

テスト

asdfでは、プラグインをテストするためのplugin-testコマンドを用意しており、下記のように使用できます:

shell
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プラグインをテストするときは、次のように実行します:
    shell
    # 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環境でテストすることを推奨します。

GitHub Action

asdf-vm/actionsリポジトリでは、 GitHub上でホストされているプラグインをテストするためのGitHub Actionを提供しています。 \`.github/workflows/test.yamlのActionsワークフローの例は以下のとおりです:

yaml
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"

TravisCI 構成設定

以下は、.travis.ymlファイルの例です。必要に応じてカスタマイズしてください:

yaml
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を使用する場合、 プラグインの場所への相対パスを渡す必要がある場合があります:

shell
asdf plugin test <tool_name> <path> '<tool_command> --version'

APIレート制限

bin/list-allbin/latest-stableのように、コマンドが外部APIへのアクセスに依存している場合、 自動テスト中にレート制限が発生することがあります。 これを軽減するため、環境変数経由で認証トークンを提供するコードパスがあることを確認してください。 以下に例を示します:

shell
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をもとに直接インストールする方法です:

shell
# 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.DRELQIdl.lean.js b/assets/ja-jp_plugins_create.md.DRELQIdl.lean.js new file mode 100644 index 00000000..ebbf75ef --- /dev/null +++ b/assets/ja-jp_plugins_create.md.DRELQIdl.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.BQmytedh.js";const x=JSON.parse('{"title":"プラグインの作成","description":"","frontmatter":{},"headers":[],"relativePath":"ja-jp/plugins/create.md","filePath":"ja-jp/plugins/create.md","lastUpdated":1734397135000}'),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つの方法があります:

  1. asdf-vm/asdf-plugin-templateリポジトリを使用し、 デフォルトのスクリプトが実装されたプラグインリポジトリ(名前はasdf-<tool_name>)を 生成 します。 生成できたら、 そのリポジトリをクローンしてsetup.bashのスクリプトを実行し、 テンプレートを対話的に更新していきます。
  2. 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_TYPEversionまたはrefです。
ASDF_INSTALL_VERSIONASDF_INSTALL_TYPEに応じてフルバージョンナンバーまたはGit Refの値が入ります。
ASDF_INSTALL_PATHツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。
ASDF_CONCURRENCYソースコードのコンパイル時に使用するコア数です。make -jのようなフラグを設定する際に便利です。
ASDF_DOWNLOAD_PATHbin/downloadによってソースコードまたはバイナリがダウンロードされる場所へのパスです。
ASDF_PLUGIN_PATHプラグインがインストールされている場所へのパスです。
ASDF_PLUGIN_SOURCE_URLプラグインソースのURLです。
ASDF_PLUGIN_PREV_REFプラグインの以前のgit-refです。
ASDF_PLUGIN_POST_REF更新後のプラグインのgit-refです。
ASDF_CMD_FILEソースとなるファイルのフルパスに解決されます。

備考

すべてのスクリプトですべての環境変数が使用できるわけではありません。 以下の各スクリプトのドキュメントで、そのスクリプトで利用可能な環境変数を確認してください。

必須スクリプト

',6)),i("h3",b,[s[26]||(s[26]=i("code",null,"bin/list-all",-1)),s[27]||(s[27]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"}),s[28]||(s[28]=a()),s[29]||(s[29]=i("a",{class:"header-anchor",href:"#bin-list-all","aria-label":'Permalink to "`bin/list-all` "'},"​",-1))]),s[50]||(s[50]=e('

説明

インストール可能なすべてのバージョンをリストします。

出力フォーマット

スペース区切りのバージョンリストの文字列を出力する必要があります。例えば次のとおりです:

txt
1.0.1 1.0.2 1.3.0 1.4

最新バージョンが末尾にくる必要があります。

asdfコアは各バージョンを1行ずつ表示するため、 いくつかのバージョンは画面外にはみ出る場合があります。

並べ替え

ウェブサイト上のリリースページからバージョンを取得する場合、 提供されている順序は正しいリリース順となっていることが多いため、 そのままの順序を使用することを推奨します。 逆順にしたければ、tscをパイプで通すだけで十分です。

どうしても並べ替えが避けられない場合、sort -Vは移植性が無いため、次のいずれかの方法を使用することを推奨します:

スクリプトで使用できる環境変数

このスクリプトに環境変数は提供されません。

このスクリプトを呼び出すコマンド

  • asdf list all <name> [version]
  • asdf list all nodejs: このスクリプトで返されるすべてのバージョンを、 1行ずつリストします。
  • asdf list all nodejs 18: このスクリプトで返されるすべてのバージョンから、 18で始まるバージョンのみフィルタし、1行ずつリストします。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/list-all"

',19)),i("h3",F,[s[30]||(s[30]=i("code",null,"bin/download",-1)),s[31]||(s[31]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"}),s[32]||(s[32]=a()),s[33]||(s[33]=i("a",{class:"header-anchor",href:"#bin-download","aria-label":'Permalink to "`bin/download` "'},"​",-1))]),s[51]||(s[51]=e('

説明

ツールの特定バージョンのソースコードまたはバイナリを、指定された場所にダウンロードします。

実装内容

  • スクリプトは、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からの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}"/bin/download

',16)),i("h3",E,[s[34]||(s[34]=i("code",null,"bin/install",-1)),s[35]||(s[35]=a()),l(t,{type:"tip",text:"必須",vertical:"middle"}),s[36]||(s[36]=a()),s[37]||(s[37]=i("a",{class:"header-anchor",href:"#bin-install","aria-label":'Permalink to "`bin/install` "'},"​",-1))]),s[52]||(s[52]=e('

説明

ツールの特定バージョンを指定された場所にインストールします。

実装内容

  • スクリプトは、指定されたバージョンをASDF_INSTALL_PATHのパスのディレクトリにインストールする必要があります。
  • Shimはデフォルトで、$ASDF_INSTALL_PATH/bin内にあるファイルに対して作成されます。 この動作は、オプションのbin/list-bin-pathsスクリプトでカスタマイズできます。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。
  • TOCTOU (Time-of-Check-to-Time-of-Use)の問題を避けるために、ツールのビルドとインストールが成功したとみなされた場合にのみ、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からの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}"/bin/install

オプションスクリプト

',15)),i("h3",y,[s[38]||(s[38]=i("code",null,"bin/latest-stable",-1)),s[39]||(s[39]=a()),l(t,{type:"warning",text:"推奨",vertical:"middle"}),s[40]||(s[40]=a()),s[41]||(s[41]=i("a",{class:"header-anchor",href:"#bin-latest-stable","aria-label":'Permalink to "`bin/latest-stable` "'},"​",-1))]),s[53]||(s[53]=e('

説明

ツールの最新安定バージョンを判定します。このスクリプトが存在しない場合、asdfコアはbin/list-allの出力をtailした結果をもとに判定しますが、ツールによってはこれが望ましくないことがあります。

実装内容

  • スクリプトは、ツールの最新安定バージョンを標準出力する必要があります。
  • 非安定版やリリース候補版は除外されるべきです。
  • フィルタクエリは、スクリプトの第1引数で提供されます。このクエリは、バージョン番号やツールプロバイダによる出力をフィルタするために使用されるべきです。
    • 例えば、rubyプラグインでのasdf list all rubyの出力は、jrubyrbxtrufflerubyなどの多くのプロバイダの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つの引数を受け取ります。

bash
"${plugin_path}"/bin/latest-stable "$query"

bin/help.overview

説明

プラグインおよび管理されているツールに関する概要説明を出力します。

実装内容

  • このスクリプトは、プラグインのヘルプを表示するために必要です。
  • ヘッダはasdfコア側で表示するため、スクリプト内では表示しないでください。
  • 自由な形式のテキストで出力して構いませんが、短い1段落程度の説明が理想です。
  • コアとなるasdf-vmドキュメントですでに説明されている情報は出力しないでください。
  • オペレーティングシステムと、インストールされているツールのバージョンに合わせて出力を調整する必要があります(必要に応じて、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からの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.overview

bin/help.deps

説明

オペレーティングシステムに合わせた依存関係のリストを出力します。依存関係を1行ごとに出力します。

bash
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からの呼び出しシグネチャ

bash
"${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からの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.config

説明

プラグインとツールに関連するリンクリストを出力します。リンクを1行ごとに出力します。

bash
Git Repository:	https://github.com/vlang/v\nDocumentation:	https://vlang.io

実装内容

  • このスクリプトの出力を考慮するために、bin/help.overviewを用意する必要があります。
  • リンクを1行ごとに出力してください。
  • 形式は以下のいずれかである必要があります:
    • <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からの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.links

bin/list-bin-paths

説明

ツールの特定バージョンにおける、実行ファイルが含まれるディレクトリの一覧を出力します。

実装内容

  • このスクリプトが存在しない場合、asdfは"${ASDF_INSTALL_PATH}"/binディレクトリ内にあるバイナリを探し、そのバイナリ向けのShimを作成します。
  • 実行ファイルが含まれるディレクトリのパスをスペース区切りで出力してください。
  • パスはASDF_INSTALL_PATHからの相対パスである必要があります。例えば、次のような出力となります:
bash
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からの呼び出しシグネチャ

bash
"${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からの呼び出しシグネチャ

bash
"${plugin_path}/bin/exec-env"

bin/exec-path

ツールの特定バージョンの実行ファイルパスを取得します。 実行ファイルへの相対パスを文字列で出力する必要があります。 これにより、プラグインはShimで指定された実行ファイルパスを条件付きで上書きして返すか、 そうでなければ、Shimで指定されたデフォルトのパスを返すことができます。

説明

ツールの特定バージョンの実行ファイルパスを取得します。

実装内容

  • 実行ファイルへの相対パスを文字列で出力する必要があります。
  • Shimで指定された実行ファイルパスを条件付きで上書きして返すか、そうでなければ、Shimで指定されたデフォルトのパスを返してください。
shell
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からの呼び出しシグネチャ

bash
"${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からの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/uninstall"

bin/list-legacy-filenames

説明

ツールのバージョンを決定するために使用されるレガシー構成ファイルのリストを出力します。

実装内容

  • スペース区切りのファイル名リストを出力してください。
    bash
    .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からの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/list-legacy-filenames"

bin/parse-legacy-file

説明

asdfによって発見されたレガシーファイルをパースして、ツールのバージョンを決定します。JavaScriptのpackage.jsonや、Go言語のgo.modのようなファイルから、バージョン番号を抽出するのに役立ちます。

実装内容

  • このスクリプトが存在しない場合、asdfは単純にレガシーファイルをcatしてバージョンを決定します。
  • 決定論的で、常に正確で同じバージョンを返す必要があります:
    • 同じレガシーファイルを解析したら、同じバージョンを返すようにしてください。
    • マシンに何がインストールされているか、また、レガシーバージョンが有効で完全かどうかは関係ありません。一部のレガシーファイルのフォーマットは適切でないときもあります。
  • 下記のように、バージョン番号を1行で出力してください:
    bash
    1.2.3

スクリプトで使用できる環境変数

このスクリプトが呼び出される前に、環境変数が設定されることはありません。

このスクリプトを呼び出すコマンド

ツールのバージョンを読み込むすべてのコマンドから呼び出されます。

asdfからの呼び出しシグネチャ

このスクリプトは、レガシーファイルの内容を読み込むために、レガシーファイルのパスという1つの引数を受け取ります。

bash
"${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からの呼び出しシグネチャ

引数はありません。

bash
"${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からの呼び出しシグネチャ

引数はありません。

bash
"${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からの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/pre-plugin-remove"
',172)),i("h2",m,[s[42]||(s[42]=a("asdf CLIの拡張コマンド ")),l(t,{type:"danger",text:"高度",vertical:"middle"}),s[43]||(s[43]=a()),s[44]||(s[44]=i("a",{class:"header-anchor",href:"#asdf-cliの拡張コマンド","aria-label":'Permalink to "asdf CLIの拡張コマンド "'},"​",-1))]),s[54]||(s[54]=e('

プラグイン名をサブコマンドとして使用し、 asdfコマンドラインインターフェースを通して呼び出すことのできるlib/commands/command*.bashスクリプトまたは実行ファイルを用意することで、 新しいasdfコマンドを定義することができます。

例えば、fooというプラグインがあるとすると:

shell
foo/\n  lib/commands/\n    command.bash\n    command-bat.bash\n    command-bat-man.bash\n    command-help.bash

ユーザは下記コマンドが実行できるようになります:

shell
$ 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テンプレート "'},"​",-1))]),s[55]||(s[55]=e(`

警告

どうしても必要な場合にのみ使用してください。

asdfでは、カスタムShimテンプレートを使用することができます。 fooという実行ファイルに対して、プラグイン内にshims/fooファイルが存在すれば、 asdfは標準Shimテンプレートを使用する代わりに、そのファイルをコピーします。

この機能は賢く使う必要があります。

asdfコアチームが把握している限り、 この機能は公式プラグインであるElixirプラグインでのみ使用されています。 実行ファイルは、実行ファイルであると同時に、Elixirファイルとしても読み込まれます。 そのため、標準的なBashのShimを使用できないのです。

テスト

asdfでは、プラグインをテストするためのplugin-testコマンドを用意しており、下記のように使用できます:

shell
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プラグインをテストするときは、次のように実行します:
    shell
    # 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環境でテストすることを推奨します。

GitHub Action

asdf-vm/actionsリポジトリでは、 GitHub上でホストされているプラグインをテストするためのGitHub Actionを提供しています。 \`.github/workflows/test.yamlのActionsワークフローの例は以下のとおりです:

yaml
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"

TravisCI 構成設定

以下は、.travis.ymlファイルの例です。必要に応じてカスタマイズしてください:

yaml
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を使用する場合、 プラグインの場所への相対パスを渡す必要がある場合があります:

shell
asdf plugin test <tool_name> <path> '<tool_command> --version'

APIレート制限

bin/list-allbin/latest-stableのように、コマンドが外部APIへのアクセスに依存している場合、 自動テスト中にレート制限が発生することがあります。 これを軽減するため、環境変数経由で認証トークンを提供するコードパスがあることを確認してください。 以下に例を示します:

shell
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をもとに直接インストールする方法です:

shell
# 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/ko-kr_contribute_core.md.D-irvj4K.js b/assets/ko-kr_contribute_core.md.D-irvj4K.js new file mode 100644 index 00000000..b87536ce --- /dev/null +++ b/assets/ko-kr_contribute_core.md.D-irvj4K.js @@ -0,0 +1,31 @@ +import{_ as a,c as e,a2 as i,o as t}from"./chunks/framework.BQmytedh.js";const k=JSON.parse('{"title":"asdf","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/contribute/core.md","filePath":"ko-kr/contribute/core.md","lastUpdated":1734394996000}'),n={name:"ko-kr/contribute/core.md"};function l(p,s,h,o,r,d){return t(),e("div",null,s[0]||(s[0]=[i(`

asdf

asdf 코어 기여 가이드.

초기 설정

Github의 asdf를 fork하거나 clone하세요:

shell
# 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가 직접 관리하기를 바라신다면, 다음 플러그인들을 설치하세요:

shell
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를 개발하기 위한 버전들을 설치하세요:

shell
asdf install

로컬 머신에서 개발 도구를 손상시킬 수 있는 기능을 개발 중일 경우 asdf를 사용하지 않는 것이 좋을 수 있습니다. 개발 도구들의 원본 목록입니다:

  • bats-core: Bash 또는 POSIX 준수 스크립트를 단위 테스트하기 위한 Bash 자동화 테스트 시스템.
  • shellcheck: 셸 스크립트 정적 분석 도구.
  • shfmt: Bash를 지원하는 셸 parser, formatter, interpreter; shfmt 포함

개발

만약 설치된 asdf에 영향 없이 변화들을 테스트해보시고 싶으시다면, $ASDF_DIR 변수를 리포지토리를 clone한 경로에 지정하시고, 그 다음 임시로 binshims 디렉토리들을 경로 앞에 추가하세요.

원격 리포지토리에 커밋 혹은 push하기 전에, 당신의 코드를 format, lint, 그리고 locally test하세요. 다음 스크립트/명령어들을 사용하세요:

shell
# 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

테스트 추가! - 새로운 기능들과 버그 수정들의 리뷰 속도 향상을 위해 테스트들은 필수적입니다. 풀 리퀘스트 요청을 만드시기 전에 새로운 코드 경로들을 추가해주세요. bats-core 문서 참조

Gitignore

다음은 asdf-vm/asdf 리포지토리에 .gitignore 파일입니다. 우리는 프로젝트에 관련된 특정한 파일들을 무시합니다. 운영체제, 툴, workflows에 관련된 파일들은 글로벌 .gitignore 설정에서 무시되어야합니다, 더 보기.

@/../.gitignore

.git-blame-ignore-revs

asdf.git-blame-ignore-revs 사용해 blame 실행에서 잡음을 줄입니다. 더 많은 정보 git blame 문서.

다음과 같이 git blame.git-blame-ignore-revs을 사용:

sh
git blame --ignore-revs-file .git-blame-ignore-revs ./test/install_command.bats

선택적으로, 수동적으로 파일을 제공하는 대신 모든 blame에서 해당 파일을 사용하도록 설정:

sh
git config blame.ignoreRevsFile .git-blame-ignore-revs

IDE들에서 이 파일을 사용하도록 설정할 수 있습니다. 예를 들어, VSCode를 사용하실 경우 (GitLens와 함께), 다음을 .vscode/settings.json에 추가하세요:

json
{
+  "gitlens.advanced.blame.customArguments": [
+    "--ignore-revs-file",
+    ".git-blame-ignore-revs"
+  ]
+}

Bats 테스팅

로컬 테스트 실행:

shell
./scripts/test.bash

테스트 작성 전 반드시 읽기:

  • test/에 존재하는 테스트들
  • bats-core 문서
  • scripts/test.bash에 존재하는 Bats 설정들

Bats 팁

Bats 디버깅은 때에 따라 어려울 수 있습니다. 디버깅 단순화를 위해, -t flag로 TAP output을 사용하여 테스트 실행 중 결과물 출력을 위한 특별한 파일 디스크립터 >&3를 사용할 수 있습니다. 예시:

shell
# 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 버전을 올리고 변동사항을 작성합니다. 이 정보들은 지난 배포들로부터 커밋 history를 읽음으로써 결정됩니다.

유의적 커밋 메세지는 기본 브랜치의 커밋 메세지 형식이 되는 풀 리퀘스트 제목의 형식을 정의합니다. 이것은 GitHub Action에서 강제됩니다 amannn/action-semantic-pull-request.

관습적인 커밋 다음 형식을 따릅니다:

<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.

  • !: 주요한(breaking) 변화들을 나타냅니다
  • fix: 새로운 SemVer patch을 만듭니다
  • feat: 새로운 SemVer minor을 만듭니다
  • <type>!: 새로운 SemVer major을 만듭니다

풀 리퀘스트 제목은 반드시 이 형식을 따라야 합니다.

TIP

풀 리퀘스트 제목을 관습적 커밋 메세지 형식을 사용하세요.

Docker 이미지

asdf-alpineasdf-ubuntu 프로젝트들은 asdf 툴들의 Dockerized 이미지들을 제공하기 위해 진행되고있습니다. 개발 서버의 베이스 혹은 프로덕션 앱들을 위해 docker 이미지들을 사용할 수 있습니다.

`,47)]))}const g=a(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/ko-kr_contribute_core.md.D-irvj4K.lean.js b/assets/ko-kr_contribute_core.md.D-irvj4K.lean.js new file mode 100644 index 00000000..b87536ce --- /dev/null +++ b/assets/ko-kr_contribute_core.md.D-irvj4K.lean.js @@ -0,0 +1,31 @@ +import{_ as a,c as e,a2 as i,o as t}from"./chunks/framework.BQmytedh.js";const k=JSON.parse('{"title":"asdf","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/contribute/core.md","filePath":"ko-kr/contribute/core.md","lastUpdated":1734394996000}'),n={name:"ko-kr/contribute/core.md"};function l(p,s,h,o,r,d){return t(),e("div",null,s[0]||(s[0]=[i(`

asdf

asdf 코어 기여 가이드.

초기 설정

Github의 asdf를 fork하거나 clone하세요:

shell
# 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가 직접 관리하기를 바라신다면, 다음 플러그인들을 설치하세요:

shell
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를 개발하기 위한 버전들을 설치하세요:

shell
asdf install

로컬 머신에서 개발 도구를 손상시킬 수 있는 기능을 개발 중일 경우 asdf를 사용하지 않는 것이 좋을 수 있습니다. 개발 도구들의 원본 목록입니다:

  • bats-core: Bash 또는 POSIX 준수 스크립트를 단위 테스트하기 위한 Bash 자동화 테스트 시스템.
  • shellcheck: 셸 스크립트 정적 분석 도구.
  • shfmt: Bash를 지원하는 셸 parser, formatter, interpreter; shfmt 포함

개발

만약 설치된 asdf에 영향 없이 변화들을 테스트해보시고 싶으시다면, $ASDF_DIR 변수를 리포지토리를 clone한 경로에 지정하시고, 그 다음 임시로 binshims 디렉토리들을 경로 앞에 추가하세요.

원격 리포지토리에 커밋 혹은 push하기 전에, 당신의 코드를 format, lint, 그리고 locally test하세요. 다음 스크립트/명령어들을 사용하세요:

shell
# 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

테스트 추가! - 새로운 기능들과 버그 수정들의 리뷰 속도 향상을 위해 테스트들은 필수적입니다. 풀 리퀘스트 요청을 만드시기 전에 새로운 코드 경로들을 추가해주세요. bats-core 문서 참조

Gitignore

다음은 asdf-vm/asdf 리포지토리에 .gitignore 파일입니다. 우리는 프로젝트에 관련된 특정한 파일들을 무시합니다. 운영체제, 툴, workflows에 관련된 파일들은 글로벌 .gitignore 설정에서 무시되어야합니다, 더 보기.

@/../.gitignore

.git-blame-ignore-revs

asdf.git-blame-ignore-revs 사용해 blame 실행에서 잡음을 줄입니다. 더 많은 정보 git blame 문서.

다음과 같이 git blame.git-blame-ignore-revs을 사용:

sh
git blame --ignore-revs-file .git-blame-ignore-revs ./test/install_command.bats

선택적으로, 수동적으로 파일을 제공하는 대신 모든 blame에서 해당 파일을 사용하도록 설정:

sh
git config blame.ignoreRevsFile .git-blame-ignore-revs

IDE들에서 이 파일을 사용하도록 설정할 수 있습니다. 예를 들어, VSCode를 사용하실 경우 (GitLens와 함께), 다음을 .vscode/settings.json에 추가하세요:

json
{
+  "gitlens.advanced.blame.customArguments": [
+    "--ignore-revs-file",
+    ".git-blame-ignore-revs"
+  ]
+}

Bats 테스팅

로컬 테스트 실행:

shell
./scripts/test.bash

테스트 작성 전 반드시 읽기:

  • test/에 존재하는 테스트들
  • bats-core 문서
  • scripts/test.bash에 존재하는 Bats 설정들

Bats 팁

Bats 디버깅은 때에 따라 어려울 수 있습니다. 디버깅 단순화를 위해, -t flag로 TAP output을 사용하여 테스트 실행 중 결과물 출력을 위한 특별한 파일 디스크립터 >&3를 사용할 수 있습니다. 예시:

shell
# 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 버전을 올리고 변동사항을 작성합니다. 이 정보들은 지난 배포들로부터 커밋 history를 읽음으로써 결정됩니다.

유의적 커밋 메세지는 기본 브랜치의 커밋 메세지 형식이 되는 풀 리퀘스트 제목의 형식을 정의합니다. 이것은 GitHub Action에서 강제됩니다 amannn/action-semantic-pull-request.

관습적인 커밋 다음 형식을 따릅니다:

<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.

  • !: 주요한(breaking) 변화들을 나타냅니다
  • fix: 새로운 SemVer patch을 만듭니다
  • feat: 새로운 SemVer minor을 만듭니다
  • <type>!: 새로운 SemVer major을 만듭니다

풀 리퀘스트 제목은 반드시 이 형식을 따라야 합니다.

TIP

풀 리퀘스트 제목을 관습적 커밋 메세지 형식을 사용하세요.

Docker 이미지

asdf-alpineasdf-ubuntu 프로젝트들은 asdf 툴들의 Dockerized 이미지들을 제공하기 위해 진행되고있습니다. 개발 서버의 베이스 혹은 프로덕션 앱들을 위해 docker 이미지들을 사용할 수 있습니다.

`,47)]))}const g=a(n,[["render",l]]);export{k as __pageData,g as default}; diff --git a/assets/ko-kr_contribute_documentation.md.BgRjCUzf.js b/assets/ko-kr_contribute_documentation.md.BgRjCUzf.js new file mode 100644 index 00000000..82e65a18 --- /dev/null +++ b/assets/ko-kr_contribute_documentation.md.BgRjCUzf.js @@ -0,0 +1,42 @@ +import{_ as i,c as a,a2 as n,o as e}from"./chunks/framework.BQmytedh.js";const c=JSON.parse('{"title":"문서 & 사이트","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/contribute/documentation.md","filePath":"ko-kr/contribute/documentation.md","lastUpdated":1734384735000}'),t={name:"ko-kr/contribute/documentation.md"};function l(p,s,h,k,d,r){return e(),a("div",null,s[0]||(s[0]=[n(`

문서 & 사이트

문서 & 사이트 기여 가이드.

초기 세팅

Github의 asdf fork 그리고/혹은 기본 브랜치 Git clone:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

문서 사이트 개발을 위한 도구들은 asdfdocs/.tool-versions에서 관리되고 있습니다. 플러그인들을 추가하기:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

툴 버전들을 설치하기:

shell
asdf install
  • Node.js: Chrome의 V8 JavaScript 엔진을 기반으로 구축된 JavaScript 런타임.

docs/package.json로부터 Node.js dependencies 설치하기:

shell
npm install

개발

VitePress (v2)는 우리가 asdf 문서 사이트를 빌드하기 위해 사용하는 정적 사이트 생성기(SSG)입니다. 이는 사용자가 JavaScript를 사용중이지 않을때도 HTML 폴백을 지원하고, Docsify.js와 결과적으로 VuePress를 대체하기 위해 선택되었습니다. 이는 VuePress로부터 대체된 Docsify & VitePress가 아니면 불가능했을 것입니다. 이것을 제외하면, 최소한의 설정과 함께 마크다운 작성에 집중하는 feature-set은 대부분 비슷합니다.

package.json은 개발에 필요한 스크립트들을 포함합니다:

@code json{3-5}

로컬 개발 서버 시작하기:

shell
npm run dev

커밋 전 코드 형식 맞추기:

shell
npm run format

풀 리퀘스트, 릴리스 & 관습적 커밋

asdf는 PR 제목들의 관습적인 커밋들에 의존하는 자동화된 배포 pipeline을 사용하고 있습니다. 더 자세한 문서는 코어 기여 가이드에서 찾을 수 있습니다.

문서 업데이트를 위한 PR을 만드실때는, PR docs: <description> 형식인 관습적인 커밋 타입 docs 제목을 만들어주세요.

Vitepress

사이트의 설정은 설정을 대표하는 JS 오브젝트의 TypeScript 파일들로 구성되어 있습니다. 그 파일들은 다음과 같습니다:

  • docs/.vitepress/config.js: 사이트를 위한 root 설정 파일. VitePress 문서 참조.

root 설정 단순화를 위해, navbarsidebar 를 대표하는 더 큰 JS 객체가 추출되었고 로케일로 구분되었습니다. 다음을 참조하세요:

  • docs/.vitepress/navbars.js
  • docs/.vitepress/sidebars.js

기본 테마 참고자료에서 위 설정들의 공식 문서를 보실 수 있습니다.

I18n

VitePress는 국제화를 공식적으로 지원합니다. root 설정 docs/.vitepress/config.js는 선택 dropdown에서의 지원되는 로케일들의 URL, 제목과 navbar/sidebar의 설정 레퍼런스들을 정의합니다.

navbar/sidebar 설정들은 앞서 언급한 로케일 별로 나누어지고 내보내기된 설정파일들에 의해 결정됩니다.

각 로케일을 위한 Markdown 내용은 반드시 root 설정안에 locales의 키들과 같은 이름의 폴더에 위치해야합니다. 다시 말해서:

js
// 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 파일들의 세트가 똑같이 필요합니다, 예를 들어:

shell
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/ko-kr_contribute_documentation.md.BgRjCUzf.lean.js b/assets/ko-kr_contribute_documentation.md.BgRjCUzf.lean.js new file mode 100644 index 00000000..82e65a18 --- /dev/null +++ b/assets/ko-kr_contribute_documentation.md.BgRjCUzf.lean.js @@ -0,0 +1,42 @@ +import{_ as i,c as a,a2 as n,o as e}from"./chunks/framework.BQmytedh.js";const c=JSON.parse('{"title":"문서 & 사이트","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/contribute/documentation.md","filePath":"ko-kr/contribute/documentation.md","lastUpdated":1734384735000}'),t={name:"ko-kr/contribute/documentation.md"};function l(p,s,h,k,d,r){return e(),a("div",null,s[0]||(s[0]=[n(`

문서 & 사이트

문서 & 사이트 기여 가이드.

초기 세팅

Github의 asdf fork 그리고/혹은 기본 브랜치 Git clone:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

문서 사이트 개발을 위한 도구들은 asdfdocs/.tool-versions에서 관리되고 있습니다. 플러그인들을 추가하기:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

툴 버전들을 설치하기:

shell
asdf install
  • Node.js: Chrome의 V8 JavaScript 엔진을 기반으로 구축된 JavaScript 런타임.

docs/package.json로부터 Node.js dependencies 설치하기:

shell
npm install

개발

VitePress (v2)는 우리가 asdf 문서 사이트를 빌드하기 위해 사용하는 정적 사이트 생성기(SSG)입니다. 이는 사용자가 JavaScript를 사용중이지 않을때도 HTML 폴백을 지원하고, Docsify.js와 결과적으로 VuePress를 대체하기 위해 선택되었습니다. 이는 VuePress로부터 대체된 Docsify & VitePress가 아니면 불가능했을 것입니다. 이것을 제외하면, 최소한의 설정과 함께 마크다운 작성에 집중하는 feature-set은 대부분 비슷합니다.

package.json은 개발에 필요한 스크립트들을 포함합니다:

@code json{3-5}

로컬 개발 서버 시작하기:

shell
npm run dev

커밋 전 코드 형식 맞추기:

shell
npm run format

풀 리퀘스트, 릴리스 & 관습적 커밋

asdf는 PR 제목들의 관습적인 커밋들에 의존하는 자동화된 배포 pipeline을 사용하고 있습니다. 더 자세한 문서는 코어 기여 가이드에서 찾을 수 있습니다.

문서 업데이트를 위한 PR을 만드실때는, PR docs: <description> 형식인 관습적인 커밋 타입 docs 제목을 만들어주세요.

Vitepress

사이트의 설정은 설정을 대표하는 JS 오브젝트의 TypeScript 파일들로 구성되어 있습니다. 그 파일들은 다음과 같습니다:

  • docs/.vitepress/config.js: 사이트를 위한 root 설정 파일. VitePress 문서 참조.

root 설정 단순화를 위해, navbarsidebar 를 대표하는 더 큰 JS 객체가 추출되었고 로케일로 구분되었습니다. 다음을 참조하세요:

  • docs/.vitepress/navbars.js
  • docs/.vitepress/sidebars.js

기본 테마 참고자료에서 위 설정들의 공식 문서를 보실 수 있습니다.

I18n

VitePress는 국제화를 공식적으로 지원합니다. root 설정 docs/.vitepress/config.js는 선택 dropdown에서의 지원되는 로케일들의 URL, 제목과 navbar/sidebar의 설정 레퍼런스들을 정의합니다.

navbar/sidebar 설정들은 앞서 언급한 로케일 별로 나누어지고 내보내기된 설정파일들에 의해 결정됩니다.

각 로케일을 위한 Markdown 내용은 반드시 root 설정안에 locales의 키들과 같은 이름의 폴더에 위치해야합니다. 다시 말해서:

js
// 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 파일들의 세트가 똑같이 필요합니다, 예를 들어:

shell
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/ko-kr_contribute_first-party-plugins.md.Fbk-rjdV.js b/assets/ko-kr_contribute_first-party-plugins.md.Fbk-rjdV.js new file mode 100644 index 00000000..4be003ad --- /dev/null +++ b/assets/ko-kr_contribute_first-party-plugins.md.Fbk-rjdV.js @@ -0,0 +1 @@ +import{_ as r,c as a,a2 as t,o}from"./chunks/framework.BQmytedh.js";const u=JSON.parse('{"title":"공식 플러그인","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/contribute/first-party-plugins.md","filePath":"ko-kr/contribute/first-party-plugins.md","lastUpdated":1734384735000}'),s={name:"ko-kr/contribute/first-party-plugins.md"};function i(l,e,n,d,f,c){return o(),a("div",null,e[0]||(e[0]=[t('

공식 플러그인

asdf 코어 팀은 일상 업무 환경에서 사용되는 플러그인들을 작성해왔습니다. 이 플러그인들을 관리하고 발전시키는 도움은 언제든 환영입니다. 아래 각 링크들에서 관련된 리포지토리들을 확인하세요:

커뮤니티 플러그인 보기:

',5)]))}const h=r(s,[["render",i]]);export{u as __pageData,h as default}; diff --git a/assets/ko-kr_contribute_first-party-plugins.md.Fbk-rjdV.lean.js b/assets/ko-kr_contribute_first-party-plugins.md.Fbk-rjdV.lean.js new file mode 100644 index 00000000..4be003ad --- /dev/null +++ b/assets/ko-kr_contribute_first-party-plugins.md.Fbk-rjdV.lean.js @@ -0,0 +1 @@ +import{_ as r,c as a,a2 as t,o}from"./chunks/framework.BQmytedh.js";const u=JSON.parse('{"title":"공식 플러그인","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/contribute/first-party-plugins.md","filePath":"ko-kr/contribute/first-party-plugins.md","lastUpdated":1734384735000}'),s={name:"ko-kr/contribute/first-party-plugins.md"};function i(l,e,n,d,f,c){return o(),a("div",null,e[0]||(e[0]=[t('

공식 플러그인

asdf 코어 팀은 일상 업무 환경에서 사용되는 플러그인들을 작성해왔습니다. 이 플러그인들을 관리하고 발전시키는 도움은 언제든 환영입니다. 아래 각 링크들에서 관련된 리포지토리들을 확인하세요:

커뮤니티 플러그인 보기:

',5)]))}const h=r(s,[["render",i]]);export{u as __pageData,h as default}; diff --git a/assets/ko-kr_contribute_github-actions.md.IILdesb4.js b/assets/ko-kr_contribute_github-actions.md.IILdesb4.js new file mode 100644 index 00000000..bd86e1e1 --- /dev/null +++ b/assets/ko-kr_contribute_github-actions.md.IILdesb4.js @@ -0,0 +1 @@ +import{_ as o,c as i,j as t,a as e,o as r}from"./chunks/framework.BQmytedh.js";const p=JSON.parse('{"title":"GitHub Actions","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/contribute/github-actions.md","filePath":"ko-kr/contribute/github-actions.md","lastUpdated":1734384735000}'),n={name:"ko-kr/contribute/github-actions.md"};function s(c,a,d,u,l,b){return r(),i("div",null,a[0]||(a[0]=[t("h1",{id:"github-actions",tabindex:"-1"},[e("GitHub Actions "),t("a",{class:"header-anchor",href:"#github-actions","aria-label":'Permalink to "GitHub Actions"'},"​")],-1),t("p",null,[e("당신의 관심에 감사드리며, 존재하는 이슈들, 대화들, 그리고 기여 가이드라인을 "),t("a",{href:"https://github.com/asdf-vm/actions",target:"_blank",rel:"noreferrer"},"asdf actions 리포지토리"),e("에서 확인 해주세요.")],-1)]))}const f=o(n,[["render",s]]);export{p as __pageData,f as default}; diff --git a/assets/ko-kr_contribute_github-actions.md.IILdesb4.lean.js b/assets/ko-kr_contribute_github-actions.md.IILdesb4.lean.js new file mode 100644 index 00000000..bd86e1e1 --- /dev/null +++ b/assets/ko-kr_contribute_github-actions.md.IILdesb4.lean.js @@ -0,0 +1 @@ +import{_ as o,c as i,j as t,a as e,o as r}from"./chunks/framework.BQmytedh.js";const p=JSON.parse('{"title":"GitHub Actions","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/contribute/github-actions.md","filePath":"ko-kr/contribute/github-actions.md","lastUpdated":1734384735000}'),n={name:"ko-kr/contribute/github-actions.md"};function s(c,a,d,u,l,b){return r(),i("div",null,a[0]||(a[0]=[t("h1",{id:"github-actions",tabindex:"-1"},[e("GitHub Actions "),t("a",{class:"header-anchor",href:"#github-actions","aria-label":'Permalink to "GitHub Actions"'},"​")],-1),t("p",null,[e("당신의 관심에 감사드리며, 존재하는 이슈들, 대화들, 그리고 기여 가이드라인을 "),t("a",{href:"https://github.com/asdf-vm/actions",target:"_blank",rel:"noreferrer"},"asdf actions 리포지토리"),e("에서 확인 해주세요.")],-1)]))}const f=o(n,[["render",s]]);export{p as __pageData,f as default}; diff --git a/assets/ko-kr_guide_getting-started.md.2aSfsHSt.js b/assets/ko-kr_guide_getting-started.md.2aSfsHSt.js new file mode 100644 index 00000000..a988b4fe --- /dev/null +++ b/assets/ko-kr_guide_getting-started.md.2aSfsHSt.js @@ -0,0 +1,13 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.BQmytedh.js";const c=JSON.parse('{"title":"시작하기","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/guide/getting-started.md","filePath":"ko-kr/guide/getting-started.md","lastUpdated":1734384735000}'),l={name:"ko-kr/guide/getting-started.md"};function h(p,s,n,d,k,o){return t(),a("div",null,s[0]||(s[0]=[e(`

시작하기

asdf 설치는 다음과 같습니다:

  1. dependencies 설치
  2. asdf 코어 다운로드
  3. asdf 설치
  4. 관리하고 싶은 각각의 툴/런타임 플러그인 설치
  5. 툴/런타임 버전 설치
  6. .tool-versions 설정 파일들을 통해 글로벌 혹은 프로젝트 버전들 설정

1. Dependencies 설치

asdf는 git & curl이 필요합니다. 당신이 필요한 패키지 매니저를 구동하기 위한 일부 명령어들의 목록입니다. (몇몇은 나중 단계에서 자동으로 설치될 수 있습니다).

운영체제패키지 매니저명령어
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

노트

시스템 설정에 의해 sudo가 필요할 수 있습니다.

2. asdf 다운로드

공식 다운로드

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0

커뮤니티 지원 다운로드 방법

공식 git 방식을 사용할 것을 적극적으로 권장드립니다.

방법명령어
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si 혹은 선호하시는 AUR helper 사용

3. asdf 설치

설정에 영향을 미치는 다양한 셸, 운영체제들 & 설치방법의 조합들이 있습니다. 아래 선택사항들 중 가장 적합한 것을 사용하세요.

macOS 사용자들은 이 섹션 마지막 부분에 path_helper에 경고를 반드시 읽어보세요.

Bash & Git

다음을 ~/.bashrc에 추가하세요:

shell
. "$HOME/.asdf/asdf.sh"

자동완성 설정은 다음을 .bashrc에 추가하세요:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

macOS Catalina 혹은 그 이상을 사용하신다면, 기본 셸이 ZSH로 변경되었습니다. Bash로 다시 변경하지 않으셨다면, ZSH의 설치방법을 따라주세요.

다음을 ~/.bash_profile에 추가하세요:

shell
. "$HOME/.asdf/asdf.sh"

자동완성 설정은 다음을 .bash_profile에 직접 추가하세요:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

~/.bashrcasdf.sh를 추가하세요:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bashrc

자동완성은 Homebrew'의 방법에 따라 설정되어야 합니다 혹은 다음을 이용하세요:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Bash & Homebrew (macOS)

macOS Catalina 혹은 그 이상을 사용하신다면, 기본 셸이 ZSH로 변경되었습니다. Bash로 다시 변경하지 않으셨다면, ZSH의 설치방법을 따라주세요.

~/.bash_profileasdf.sh 추가하기:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bash_profile

자동완성은 Homebrew'의 방법에 따라 설정되어야 합니다 혹은 다음을 이용하세요:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Bash & Pacman

다음을 ~/.bashrc에 추가하세요:

shell
. /opt/asdf-vm/asdf.sh

자동완성을 위해 bash-completion이 설치 되어야합니다.

Fish & Git

다음을 ~/.config/fish/config.fish에 추가하세요:

shell
source ~/.asdf/asdf.fish

다음 명령어로 자동완성을 설정하세요:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

~/.config/fish/config.fishasdf.fish를 추가하세요:

shell
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

자동완성은 Fish 셸 Homebrew에 의해 관리됩니다. 편하죠!

Fish & Pacman

다음을 ~/.config/fish/config.fish에 추가하세요:

shell
source /opt/asdf-vm/asdf.fish

자동완성은 AUR 패키지를 통한 설치로 자동적으로 설정됩니다.

Elvish & Git

~/.config/elvish/rc.elvasdf.elv를 추가하세요:

shell
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

자동완성은 자동적으로 설정됩니다.

Elvish & Homebrew

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
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

자동완성은 자동적으로 설정됩니다.

Elvish & Pacman

~/.config/elvish/rc.elvasdf.elv를 추가하세요:

shell
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

자동완성은 자동적으로 설정됩니다.

ZSH & Git

다음을 ~/.zshrc에 추가하세요:

shell
. "$HOME/.asdf/asdf.sh"

혹은 위 스크립트와 자동완성을 설정하는 asdf를 위한 oh-my-zsh와 같은 ZSH 프레임워크 플러그인을 사용하세요.

자동완성은 ZSH 프레임워크 asdf 플러그인 혹은 다음을 .zshrc에 추가함으로써 설정됩니다:

shell
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • 만약 custom compinit 설정을 사용중이라면, asdf.sh를 source하고 난 다음 compinit가 오도록 해주세요
  • 만약 ZSH 프레임워크를 통해 custom compinit 설정을 사용중이라면, 해당 프레임워크를 source하고 난 다음 compinit가 오도록 해주세요

경고

만약 ZSH 프레임워크를 사용중이라면, fpath를 통해 새로운 ZSH 자동완성을 사용하려면 관련된 asdf 플러그인이 업데이트 되어야합니다. Oh-My-ZSH asdf 플로그인이 아직 업데이트 되지 않았습니다, ohmyzsh/ohmyzsh#8837 참고.

ZSH & Homebrew

~/.zshrcasdf.sh를 추가하세요:

shell
echo -e "\\n. $(brew --prefix asdf)/libexec/asdf.sh" >> \${ZDOTDIR:-~}/.zshrc

혹은 위 스크립트와 자동완성을 설정하는 asdf를 위한 oh-my-zsh와 같은 ZSH 프레임워크 플러그인을 사용하세요.

자동완성은 asdf ZSH 프레임워크 혹은 Homebrew'의 방법에 따라 설정되어야 합니다. 만약 ZSH 프레임워크를 사용중이라면, fpath를 통해 새로운 ZSH 자동완성을 사용하려면 관련된 asdf 플러그인이 업데이트 되어야합니다. Oh-My-ZSH asdf 플로그인이 아직 업데이트 되지 않았습니다, ohmyzsh/ohmyzsh#8837 참고.

ZSH & Pacman

다음을 ~/.zshrc에 추가하세요:

shell
. /opt/asdf-vm/asdf.sh

자동완성은 ZSH 친화적인 위치에 있지만, ZSH는 자동완성 사용을 위해 반드시 설정 되어야합니다.

PowerShell Core & Git

다음을 ~/.config/powershell/profile.ps1에 추가하세요:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

~/.config/powershell/profile.ps1asdf.sh를 추가하세요:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

다음을 ~/.config/powershell/profile.ps1에 추가하세요:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

~/.config/nushell/config.nuasdf.nu를 추가하세요:

shell
"\\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

자동완성은 자동적으로 설정됩니다.

Nushell & Homebrew

~/.config/nushell/config.nuasdf.nu를 추가하세요:

shell
"\\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

자동완성은 자동적으로 설정됩니다.

Nushell & Pacman

~/.config/nushell/config.nuasdf.nu를 추가하세요:

shell
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

자동완성은 자동적으로 설정됩니다.

POSIX Shell & Git

다음을 ~/.profile에 추가하세요:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

~/.profileasdf.sh를 추가하세요:

shell
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
POSIX Shell & Pacman

다음을 ~/.profile에 추가하세요:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

asdf 스크립트들은 $PATH 설정한 이후에 프레임워크 (oh-my-zsh 등) source 이후에 source 되어야 합니다.

::: 경고 macOS에서, Bash 혹은 Zsh 셸 시작시에 자동적으로 path_helper 유틸리티를 실행시킵니다. path_helperPATH (와 MANPATH)에 항목들을 재배열 시켜 특정 순서를 요구하는 툴들의 일관된 동작을 방해합니다. 이를 방지하기 위해, macOS에서 asdfPATH 앞부분에 (가장 높은 우선순위) 강제로 추가합니다. 이는 ASDF_FORCE_PREPEND를 통해 변경가능합니다. :::

PATH 업데이트를 위해 셸을 재시작하세요. 새로운 터미널을 여는 경우 대부분 해결됩니다.

코어 설치 완료!

asdf 코어 설치를 완료했습니다 🎉

asdf플러그인을 설치하고, 버전들을 관리해야 유용합니다. 설치 및 관리방법을 이 가이드 아래에서 계속해서 배우세요.

4. 플러그인 설치

데모 목적으로 우리는 asdf-nodejs 플러그인을 통해 Node.js 설치 & 설정을 해보겠습니다.

플러그인 Dependencies

각 플러그인은 dependencies 갖고 있어 우리는 플러그인 리포지토리의 목록을 확인해야합니다. asdf-nodejs는 다음을 가지고 있습니다:

OSDependency 설치
Debianapt-get install dirmngr gpg curl gawk
CentOS/ Rocky Linux/ AlmaLinuxyum install gnupg2 curl gawk
macOSbrew install gpg gawk

우리는 어떤 플러그인들은 설치-후 훅들을 갖고있어 dependencies 먼저 설치해야합니다.

플러그인 설치

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. 버전 설치

이제 우리는 Node.js를 위한 플러그인을 갖고있어 툴 버전을 설치할 수 있습니다.

우리는 asdf list all nodejs를 통해 어떤 버전들이 이용가능한지 혹은 asdf list all nodejs 14를 통해 하위 버전들을 확인가능합니다.

우리는 이용가능한 latest 버전을 설치할 것입니다.

shell
asdf install nodejs latest

노트

asdf는 정확한 버전들을 강제합니다. latestasdf가 실행했을때 실제 버전을 찾는 헬퍼입니다.

6. 버전 설정

asdf는 현재 작업 디렉토리부터 $HOME 디렉토리까지 모든 .tool-versions 파일들에서 버전 검색을 수행합니다. 검색은 asdf가 관리하는 툴을 실행시킬때 맞춰서 실행됩니다.

::: 경고 툴 실행을 위한 툴 버전을 설정하지 않으면 에러가 발생합니다. asdf current는 현재 디렉토리로부터 툴 & 버전을 표시함으로써 어떤 툴들이 실행을 실패하는지 관찰할 수 있게합니다. :::

글로벌

글로벌 기본값들은 $HOME/.tool-versions에서 관리됩니다. 글로벌 버전을 다음을 이용해 설정하세요:

shell
asdf global nodejs latest

$HOME/.tool-versions은 다음과 같습니다:

nodejs 16.5.0

어떤 운영체제들은 asdf가 아닌 시스템에 의해 관리되는 툴들이 이미 설치되어 있습니다, python이 대표적인 예시입니다. 당신은 시스템에 의한 툴 관리를 위해 asdf를 설정해야합니다. 버전 참조 섹션를 참고하세요.

로컬

로컬 버전들은 (현재 작업 디렉토리) $PWD/.tool-versions 파일에 정의 되어 있습니다. 보통, 이 디렉토리는 하나의 프로젝트의 Git 리포지토리입니다. 툴 버전을 설정하고 싶은 디렉토리에서 다음을 실행시키세요:

shell
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

더 많은 설정 옵션들은 configuration 페이지를 참고하세요.

가이드 끝!

asdf 시작하기 가이드가 끝났습니다. 🎉 당신은 이제 당신의 프로젝트의 nodejs 버전들을 관리할 수 있습니다. 같은 방법으로 다른 각각의 툴들의 버전을 관리하세요!

asdf는 우리가 익숙해져야하는 더 많은 명령어들을 가지고 있고, asdf --help 혹은 asdf를 통해 확인할 수 있습니다. 명령어들의 코어의 3가지 카테고리로 나눠질 수 있습니다:

`,82)]))}const g=i(l,[["render",h]]);export{c as __pageData,g as default}; diff --git a/assets/ko-kr_guide_getting-started.md.2aSfsHSt.lean.js b/assets/ko-kr_guide_getting-started.md.2aSfsHSt.lean.js new file mode 100644 index 00000000..a988b4fe --- /dev/null +++ b/assets/ko-kr_guide_getting-started.md.2aSfsHSt.lean.js @@ -0,0 +1,13 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.BQmytedh.js";const c=JSON.parse('{"title":"시작하기","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/guide/getting-started.md","filePath":"ko-kr/guide/getting-started.md","lastUpdated":1734384735000}'),l={name:"ko-kr/guide/getting-started.md"};function h(p,s,n,d,k,o){return t(),a("div",null,s[0]||(s[0]=[e(`

시작하기

asdf 설치는 다음과 같습니다:

  1. dependencies 설치
  2. asdf 코어 다운로드
  3. asdf 설치
  4. 관리하고 싶은 각각의 툴/런타임 플러그인 설치
  5. 툴/런타임 버전 설치
  6. .tool-versions 설정 파일들을 통해 글로벌 혹은 프로젝트 버전들 설정

1. Dependencies 설치

asdf는 git & curl이 필요합니다. 당신이 필요한 패키지 매니저를 구동하기 위한 일부 명령어들의 목록입니다. (몇몇은 나중 단계에서 자동으로 설치될 수 있습니다).

운영체제패키지 매니저명령어
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

노트

시스템 설정에 의해 sudo가 필요할 수 있습니다.

2. asdf 다운로드

공식 다운로드

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0

커뮤니티 지원 다운로드 방법

공식 git 방식을 사용할 것을 적극적으로 권장드립니다.

방법명령어
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si 혹은 선호하시는 AUR helper 사용

3. asdf 설치

설정에 영향을 미치는 다양한 셸, 운영체제들 & 설치방법의 조합들이 있습니다. 아래 선택사항들 중 가장 적합한 것을 사용하세요.

macOS 사용자들은 이 섹션 마지막 부분에 path_helper에 경고를 반드시 읽어보세요.

Bash & Git

다음을 ~/.bashrc에 추가하세요:

shell
. "$HOME/.asdf/asdf.sh"

자동완성 설정은 다음을 .bashrc에 추가하세요:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

macOS Catalina 혹은 그 이상을 사용하신다면, 기본 셸이 ZSH로 변경되었습니다. Bash로 다시 변경하지 않으셨다면, ZSH의 설치방법을 따라주세요.

다음을 ~/.bash_profile에 추가하세요:

shell
. "$HOME/.asdf/asdf.sh"

자동완성 설정은 다음을 .bash_profile에 직접 추가하세요:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

~/.bashrcasdf.sh를 추가하세요:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bashrc

자동완성은 Homebrew'의 방법에 따라 설정되어야 합니다 혹은 다음을 이용하세요:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Bash & Homebrew (macOS)

macOS Catalina 혹은 그 이상을 사용하신다면, 기본 셸이 ZSH로 변경되었습니다. Bash로 다시 변경하지 않으셨다면, ZSH의 설치방법을 따라주세요.

~/.bash_profileasdf.sh 추가하기:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bash_profile

자동완성은 Homebrew'의 방법에 따라 설정되어야 합니다 혹은 다음을 이용하세요:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Bash & Pacman

다음을 ~/.bashrc에 추가하세요:

shell
. /opt/asdf-vm/asdf.sh

자동완성을 위해 bash-completion이 설치 되어야합니다.

Fish & Git

다음을 ~/.config/fish/config.fish에 추가하세요:

shell
source ~/.asdf/asdf.fish

다음 명령어로 자동완성을 설정하세요:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

~/.config/fish/config.fishasdf.fish를 추가하세요:

shell
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

자동완성은 Fish 셸 Homebrew에 의해 관리됩니다. 편하죠!

Fish & Pacman

다음을 ~/.config/fish/config.fish에 추가하세요:

shell
source /opt/asdf-vm/asdf.fish

자동완성은 AUR 패키지를 통한 설치로 자동적으로 설정됩니다.

Elvish & Git

~/.config/elvish/rc.elvasdf.elv를 추가하세요:

shell
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

자동완성은 자동적으로 설정됩니다.

Elvish & Homebrew

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
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

자동완성은 자동적으로 설정됩니다.

Elvish & Pacman

~/.config/elvish/rc.elvasdf.elv를 추가하세요:

shell
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

자동완성은 자동적으로 설정됩니다.

ZSH & Git

다음을 ~/.zshrc에 추가하세요:

shell
. "$HOME/.asdf/asdf.sh"

혹은 위 스크립트와 자동완성을 설정하는 asdf를 위한 oh-my-zsh와 같은 ZSH 프레임워크 플러그인을 사용하세요.

자동완성은 ZSH 프레임워크 asdf 플러그인 혹은 다음을 .zshrc에 추가함으로써 설정됩니다:

shell
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • 만약 custom compinit 설정을 사용중이라면, asdf.sh를 source하고 난 다음 compinit가 오도록 해주세요
  • 만약 ZSH 프레임워크를 통해 custom compinit 설정을 사용중이라면, 해당 프레임워크를 source하고 난 다음 compinit가 오도록 해주세요

경고

만약 ZSH 프레임워크를 사용중이라면, fpath를 통해 새로운 ZSH 자동완성을 사용하려면 관련된 asdf 플러그인이 업데이트 되어야합니다. Oh-My-ZSH asdf 플로그인이 아직 업데이트 되지 않았습니다, ohmyzsh/ohmyzsh#8837 참고.

ZSH & Homebrew

~/.zshrcasdf.sh를 추가하세요:

shell
echo -e "\\n. $(brew --prefix asdf)/libexec/asdf.sh" >> \${ZDOTDIR:-~}/.zshrc

혹은 위 스크립트와 자동완성을 설정하는 asdf를 위한 oh-my-zsh와 같은 ZSH 프레임워크 플러그인을 사용하세요.

자동완성은 asdf ZSH 프레임워크 혹은 Homebrew'의 방법에 따라 설정되어야 합니다. 만약 ZSH 프레임워크를 사용중이라면, fpath를 통해 새로운 ZSH 자동완성을 사용하려면 관련된 asdf 플러그인이 업데이트 되어야합니다. Oh-My-ZSH asdf 플로그인이 아직 업데이트 되지 않았습니다, ohmyzsh/ohmyzsh#8837 참고.

ZSH & Pacman

다음을 ~/.zshrc에 추가하세요:

shell
. /opt/asdf-vm/asdf.sh

자동완성은 ZSH 친화적인 위치에 있지만, ZSH는 자동완성 사용을 위해 반드시 설정 되어야합니다.

PowerShell Core & Git

다음을 ~/.config/powershell/profile.ps1에 추가하세요:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

~/.config/powershell/profile.ps1asdf.sh를 추가하세요:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

다음을 ~/.config/powershell/profile.ps1에 추가하세요:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

~/.config/nushell/config.nuasdf.nu를 추가하세요:

shell
"\\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

자동완성은 자동적으로 설정됩니다.

Nushell & Homebrew

~/.config/nushell/config.nuasdf.nu를 추가하세요:

shell
"\\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

자동완성은 자동적으로 설정됩니다.

Nushell & Pacman

~/.config/nushell/config.nuasdf.nu를 추가하세요:

shell
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

자동완성은 자동적으로 설정됩니다.

POSIX Shell & Git

다음을 ~/.profile에 추가하세요:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

~/.profileasdf.sh를 추가하세요:

shell
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
POSIX Shell & Pacman

다음을 ~/.profile에 추가하세요:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

asdf 스크립트들은 $PATH 설정한 이후에 프레임워크 (oh-my-zsh 등) source 이후에 source 되어야 합니다.

::: 경고 macOS에서, Bash 혹은 Zsh 셸 시작시에 자동적으로 path_helper 유틸리티를 실행시킵니다. path_helperPATH (와 MANPATH)에 항목들을 재배열 시켜 특정 순서를 요구하는 툴들의 일관된 동작을 방해합니다. 이를 방지하기 위해, macOS에서 asdfPATH 앞부분에 (가장 높은 우선순위) 강제로 추가합니다. 이는 ASDF_FORCE_PREPEND를 통해 변경가능합니다. :::

PATH 업데이트를 위해 셸을 재시작하세요. 새로운 터미널을 여는 경우 대부분 해결됩니다.

코어 설치 완료!

asdf 코어 설치를 완료했습니다 🎉

asdf플러그인을 설치하고, 버전들을 관리해야 유용합니다. 설치 및 관리방법을 이 가이드 아래에서 계속해서 배우세요.

4. 플러그인 설치

데모 목적으로 우리는 asdf-nodejs 플러그인을 통해 Node.js 설치 & 설정을 해보겠습니다.

플러그인 Dependencies

각 플러그인은 dependencies 갖고 있어 우리는 플러그인 리포지토리의 목록을 확인해야합니다. asdf-nodejs는 다음을 가지고 있습니다:

OSDependency 설치
Debianapt-get install dirmngr gpg curl gawk
CentOS/ Rocky Linux/ AlmaLinuxyum install gnupg2 curl gawk
macOSbrew install gpg gawk

우리는 어떤 플러그인들은 설치-후 훅들을 갖고있어 dependencies 먼저 설치해야합니다.

플러그인 설치

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. 버전 설치

이제 우리는 Node.js를 위한 플러그인을 갖고있어 툴 버전을 설치할 수 있습니다.

우리는 asdf list all nodejs를 통해 어떤 버전들이 이용가능한지 혹은 asdf list all nodejs 14를 통해 하위 버전들을 확인가능합니다.

우리는 이용가능한 latest 버전을 설치할 것입니다.

shell
asdf install nodejs latest

노트

asdf는 정확한 버전들을 강제합니다. latestasdf가 실행했을때 실제 버전을 찾는 헬퍼입니다.

6. 버전 설정

asdf는 현재 작업 디렉토리부터 $HOME 디렉토리까지 모든 .tool-versions 파일들에서 버전 검색을 수행합니다. 검색은 asdf가 관리하는 툴을 실행시킬때 맞춰서 실행됩니다.

::: 경고 툴 실행을 위한 툴 버전을 설정하지 않으면 에러가 발생합니다. asdf current는 현재 디렉토리로부터 툴 & 버전을 표시함으로써 어떤 툴들이 실행을 실패하는지 관찰할 수 있게합니다. :::

글로벌

글로벌 기본값들은 $HOME/.tool-versions에서 관리됩니다. 글로벌 버전을 다음을 이용해 설정하세요:

shell
asdf global nodejs latest

$HOME/.tool-versions은 다음과 같습니다:

nodejs 16.5.0

어떤 운영체제들은 asdf가 아닌 시스템에 의해 관리되는 툴들이 이미 설치되어 있습니다, python이 대표적인 예시입니다. 당신은 시스템에 의한 툴 관리를 위해 asdf를 설정해야합니다. 버전 참조 섹션를 참고하세요.

로컬

로컬 버전들은 (현재 작업 디렉토리) $PWD/.tool-versions 파일에 정의 되어 있습니다. 보통, 이 디렉토리는 하나의 프로젝트의 Git 리포지토리입니다. 툴 버전을 설정하고 싶은 디렉토리에서 다음을 실행시키세요:

shell
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

더 많은 설정 옵션들은 configuration 페이지를 참고하세요.

가이드 끝!

asdf 시작하기 가이드가 끝났습니다. 🎉 당신은 이제 당신의 프로젝트의 nodejs 버전들을 관리할 수 있습니다. 같은 방법으로 다른 각각의 툴들의 버전을 관리하세요!

asdf는 우리가 익숙해져야하는 더 많은 명령어들을 가지고 있고, asdf --help 혹은 asdf를 통해 확인할 수 있습니다. 명령어들의 코어의 3가지 카테고리로 나눠질 수 있습니다:

`,82)]))}const g=i(l,[["render",h]]);export{c as __pageData,g as default}; diff --git a/assets/ko-kr_guide_introduction.md.AsrAlGvY.js b/assets/ko-kr_guide_introduction.md.AsrAlGvY.js new file mode 100644 index 00000000..58173cac --- /dev/null +++ b/assets/ko-kr_guide_introduction.md.AsrAlGvY.js @@ -0,0 +1 @@ +import{_ as a,c as r,a2 as o,o as t}from"./chunks/framework.BQmytedh.js";const f=JSON.parse('{"title":"소개","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/guide/introduction.md","filePath":"ko-kr/guide/introduction.md","lastUpdated":1734384735000}'),d={name:"ko-kr/guide/introduction.md"};function n(i,e,s,c,l,h){return t(),r("div",null,e[0]||(e[0]=[o('

소개

asdf는 툴 버전 매니저입니다. 모든 툴 버전 정의들은 당신의 팀들과 공유되는 프로젝트의 Git 리포지토리에서 확인할 수 있는 하나의 (.tool-versions) 파일에 있으며, 모든 사람들이 정확히 같은 버전의 툴들을 사용하게 합니다.

기존의 작업 방식은 여러 CLI 버전 매니저들, 각각의 고유한 API, 설정 파일들 그리고 구현이 필요했었습니다 (e.g. $PATH 조정, shims, 환경 변수 등...). asdf는 개발 워크플로우 단순화를 위해 단 하나의 인터페이스와 설정파일을 제공하고 단순한 플러그인 인터페이스를 통해 모든 툴과 런타임들 확장가능합니다.

작동방식

asdf 코어가 셸 설정과 함께 설치되면, 플러그인들이 특정 툴들을 관리하기 위해 설치됩니다. 플러그인에 의해 한가지 툴이 설치되면, shims들을 가진 실행파일들이 각각의 툴들을 위해 생성됩니다. 실행파일들을 실행하려 할 때, .tool-versions에 설정된 툴의 버전을 통해 asdf가 어떤 버전을 실행시킬 지 결정하고 해당 shim이 대신 실행됩니다.

관련된 프로젝트

nvm / n / rbenv 등

nvm, n 그리고 rbenv과 같은 툴들은 설치된 실행파일을 위한 shim들을 만드는 셸 스크립트들로 작성되어 있습니다.

asdf는 매우 비슷하고 툴/런타임 버전 관리의 영역에서 경쟁하기 위해 만들어졌습니다. asdf의 차별화 요소는 플러그인 시스템이 툴/런타임 별 매니저의 필요성, 각기 다른 명령어들, 그리고 리포지토리에 각각 *-version 파일들을 제거하였다는 것입니다.

direnv

현재 디렉토리에 따라 환경 변수들을 load와 unload 할 수 있는 새로운 기능을 기존의 셸에 추가합니다.

asdf는 환경 변수들을 관리하지 않습니다만, asdf-direnv 플러그인을 통해 direnv 동작를 asdf에 통합할 수 있습니다.

direnv 문서에서 더보기.

Homebrew

macOS (혹은 Linux)에서의 패키지 매니저 부재

Homebrew는 패키지들과 upstream dependencies들을 관리합니다. asdf는 upstream dependencies들을 관리하지 않고, 패키지 매니저가 아니고, 우리가 dependency 목록들을 작게 유지하므로, 사용자가 직접 관리해야합니다.

Homebrew 문서에서 더보기.

NixOS

Nix는 패키지 관리와 시스템 설정에 창의적으로 접근하는 툴입니다.

NixOS는, asdf가 제공하지 않는, 각 툴의 전체 dependency tree를 통해 패키지들의 정확한 버전들을 관리함으로써 재현가능한 환경 구축을 목표로 합니다. NixOS는 자신만의 프로그래밍 언어, 많은 CLI 툴들, 그리고 6000개가 넘는 패키지 컬렉션을 통해 해당 기능을 제공합니다.

다시 한번 말씀드리지만, asdf는 upstream dependencies들을 관리하지 않으며 패키지 매니저가 아닙니다.

NixOS 문서에서 더보기.

왜 asdf를 사용할까요?

asdf는 팀들이 플러그인 시스템을 통해 다양한 툴들의 지원 그리고 셸 설정에 포함시킬 하나의 스크립트의 단순함친숙성 을 통해 정확히 같은 버전의 툴들을 사용하는 것을 보장합니다.

노트

asdf는 시스템 패키지 매니저가 아닙니다. 이것은 툴 버전 매니저입니다. 단지 어떠한 툴을 위한 플러그인을 생성하고 그것의 버전을 asdf로 관리할 수 있다고 해서, 그 특정한 툴을 버전 관리를 위한 최선의 방법을 의미하는 것은 아닙니다.

',25)]))}const m=a(d,[["render",n]]);export{f as __pageData,m as default}; diff --git a/assets/ko-kr_guide_introduction.md.AsrAlGvY.lean.js b/assets/ko-kr_guide_introduction.md.AsrAlGvY.lean.js new file mode 100644 index 00000000..58173cac --- /dev/null +++ b/assets/ko-kr_guide_introduction.md.AsrAlGvY.lean.js @@ -0,0 +1 @@ +import{_ as a,c as r,a2 as o,o as t}from"./chunks/framework.BQmytedh.js";const f=JSON.parse('{"title":"소개","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/guide/introduction.md","filePath":"ko-kr/guide/introduction.md","lastUpdated":1734384735000}'),d={name:"ko-kr/guide/introduction.md"};function n(i,e,s,c,l,h){return t(),r("div",null,e[0]||(e[0]=[o('

소개

asdf는 툴 버전 매니저입니다. 모든 툴 버전 정의들은 당신의 팀들과 공유되는 프로젝트의 Git 리포지토리에서 확인할 수 있는 하나의 (.tool-versions) 파일에 있으며, 모든 사람들이 정확히 같은 버전의 툴들을 사용하게 합니다.

기존의 작업 방식은 여러 CLI 버전 매니저들, 각각의 고유한 API, 설정 파일들 그리고 구현이 필요했었습니다 (e.g. $PATH 조정, shims, 환경 변수 등...). asdf는 개발 워크플로우 단순화를 위해 단 하나의 인터페이스와 설정파일을 제공하고 단순한 플러그인 인터페이스를 통해 모든 툴과 런타임들 확장가능합니다.

작동방식

asdf 코어가 셸 설정과 함께 설치되면, 플러그인들이 특정 툴들을 관리하기 위해 설치됩니다. 플러그인에 의해 한가지 툴이 설치되면, shims들을 가진 실행파일들이 각각의 툴들을 위해 생성됩니다. 실행파일들을 실행하려 할 때, .tool-versions에 설정된 툴의 버전을 통해 asdf가 어떤 버전을 실행시킬 지 결정하고 해당 shim이 대신 실행됩니다.

관련된 프로젝트

nvm / n / rbenv 등

nvm, n 그리고 rbenv과 같은 툴들은 설치된 실행파일을 위한 shim들을 만드는 셸 스크립트들로 작성되어 있습니다.

asdf는 매우 비슷하고 툴/런타임 버전 관리의 영역에서 경쟁하기 위해 만들어졌습니다. asdf의 차별화 요소는 플러그인 시스템이 툴/런타임 별 매니저의 필요성, 각기 다른 명령어들, 그리고 리포지토리에 각각 *-version 파일들을 제거하였다는 것입니다.

direnv

현재 디렉토리에 따라 환경 변수들을 load와 unload 할 수 있는 새로운 기능을 기존의 셸에 추가합니다.

asdf는 환경 변수들을 관리하지 않습니다만, asdf-direnv 플러그인을 통해 direnv 동작를 asdf에 통합할 수 있습니다.

direnv 문서에서 더보기.

Homebrew

macOS (혹은 Linux)에서의 패키지 매니저 부재

Homebrew는 패키지들과 upstream dependencies들을 관리합니다. asdf는 upstream dependencies들을 관리하지 않고, 패키지 매니저가 아니고, 우리가 dependency 목록들을 작게 유지하므로, 사용자가 직접 관리해야합니다.

Homebrew 문서에서 더보기.

NixOS

Nix는 패키지 관리와 시스템 설정에 창의적으로 접근하는 툴입니다.

NixOS는, asdf가 제공하지 않는, 각 툴의 전체 dependency tree를 통해 패키지들의 정확한 버전들을 관리함으로써 재현가능한 환경 구축을 목표로 합니다. NixOS는 자신만의 프로그래밍 언어, 많은 CLI 툴들, 그리고 6000개가 넘는 패키지 컬렉션을 통해 해당 기능을 제공합니다.

다시 한번 말씀드리지만, asdf는 upstream dependencies들을 관리하지 않으며 패키지 매니저가 아닙니다.

NixOS 문서에서 더보기.

왜 asdf를 사용할까요?

asdf는 팀들이 플러그인 시스템을 통해 다양한 툴들의 지원 그리고 셸 설정에 포함시킬 하나의 스크립트의 단순함친숙성 을 통해 정확히 같은 버전의 툴들을 사용하는 것을 보장합니다.

노트

asdf는 시스템 패키지 매니저가 아닙니다. 이것은 툴 버전 매니저입니다. 단지 어떠한 툴을 위한 플러그인을 생성하고 그것의 버전을 asdf로 관리할 수 있다고 해서, 그 특정한 툴을 버전 관리를 위한 최선의 방법을 의미하는 것은 아닙니다.

',25)]))}const m=a(d,[["render",n]]);export{f as __pageData,m as default}; diff --git a/assets/ko-kr_index.md.Dmm5J-rX.js b/assets/ko-kr_index.md.Dmm5J-rX.js new file mode 100644 index 00000000..183fd441 --- /dev/null +++ b/assets/ko-kr_index.md.Dmm5J-rX.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as i}from"./chunks/framework.BQmytedh.js";const k=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"asdf","text":"다중 런타임 버전 매니저","tagline":"한가지 툴로 모든 런타임 버전들을 관리하세요!","actions":[{"theme":"brand","text":"시작하기","link":"/ko-kr/guide/getting-started"},{"theme":"alt","text":"asdf이란?","link":"/ko-kr/guide/introduction"},{"theme":"alt","text":"GitHub에서 보기","link":"https://github.com/asdf-vm/asdf"}]},"features":[{"title":"단 한가지 도구","details":"각 프로젝트 런타임들을 단 한가지 CLI 툴과 커맨드 인터페이스로 관리.","icon":"🎉"},{"title":"플러그인","details":"런타임과 툴들의 거대한 생태계. 당신이 필요한 새로운 툴들을 더해주는 간단한 API!","icon":"🔌"},{"title":"구버전 호환","details":"원활한 마이그레이션을 위해 이미 존재하던 .nvmrc, .node-version, .ruby-version 등의 설정 파일들 지원!","icon":"⏮"},{"title":"단 하나의 설정 파일","details":"단 하나의 공유된 .tool-versions 파일로 모든 툴, 런타임, 그리고 버전들을 관리.","icon":"📄"},{"title":"셸","details":"Bash, ZSH, Fish & Elvish 자동완성 기능 지원.","icon":"🐚"},{"title":"GitHub Actions","details":"GitHub Action 설치 제공과 .tool-versions 파일을 CI/CD 워크플로우에서 활용.","icon":"🤖"}]},"headers":[],"relativePath":"ko-kr/index.md","filePath":"ko-kr/index.md","lastUpdated":1734384735000}'),o={name:"ko-kr/index.md"};function n(a,s,r,d,l,c){return i(),e("div")}const h=t(o,[["render",n]]);export{k as __pageData,h as default}; diff --git a/assets/ko-kr_index.md.Dmm5J-rX.lean.js b/assets/ko-kr_index.md.Dmm5J-rX.lean.js new file mode 100644 index 00000000..183fd441 --- /dev/null +++ b/assets/ko-kr_index.md.Dmm5J-rX.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as i}from"./chunks/framework.BQmytedh.js";const k=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"asdf","text":"다중 런타임 버전 매니저","tagline":"한가지 툴로 모든 런타임 버전들을 관리하세요!","actions":[{"theme":"brand","text":"시작하기","link":"/ko-kr/guide/getting-started"},{"theme":"alt","text":"asdf이란?","link":"/ko-kr/guide/introduction"},{"theme":"alt","text":"GitHub에서 보기","link":"https://github.com/asdf-vm/asdf"}]},"features":[{"title":"단 한가지 도구","details":"각 프로젝트 런타임들을 단 한가지 CLI 툴과 커맨드 인터페이스로 관리.","icon":"🎉"},{"title":"플러그인","details":"런타임과 툴들의 거대한 생태계. 당신이 필요한 새로운 툴들을 더해주는 간단한 API!","icon":"🔌"},{"title":"구버전 호환","details":"원활한 마이그레이션을 위해 이미 존재하던 .nvmrc, .node-version, .ruby-version 등의 설정 파일들 지원!","icon":"⏮"},{"title":"단 하나의 설정 파일","details":"단 하나의 공유된 .tool-versions 파일로 모든 툴, 런타임, 그리고 버전들을 관리.","icon":"📄"},{"title":"셸","details":"Bash, ZSH, Fish & Elvish 자동완성 기능 지원.","icon":"🐚"},{"title":"GitHub Actions","details":"GitHub Action 설치 제공과 .tool-versions 파일을 CI/CD 워크플로우에서 활용.","icon":"🤖"}]},"headers":[],"relativePath":"ko-kr/index.md","filePath":"ko-kr/index.md","lastUpdated":1734384735000}'),o={name:"ko-kr/index.md"};function n(a,s,r,d,l,c){return i(),e("div")}const h=t(o,[["render",n]]);export{k as __pageData,h as default}; diff --git a/assets/ko-kr_manage_commands.md.BnsPzg1t.js b/assets/ko-kr_manage_commands.md.BnsPzg1t.js new file mode 100644 index 00000000..318c9a6f --- /dev/null +++ b/assets/ko-kr_manage_commands.md.BnsPzg1t.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as e,o as p}from"./chunks/framework.BQmytedh.js";const f=JSON.parse('{"title":"모든 명령어","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/manage/commands.md","filePath":"ko-kr/manage/commands.md","lastUpdated":1734384735000}'),l={name:"ko-kr/manage/commands.md"};function t(i,s,o,c,r,d){return p(),n("div",null,s[0]||(s[0]=[e(`

모든 명령어

다음 목록은 asdf에서 이용가능한 모든 명령어들입니다. 해당 목록은 asdf help 명령어를 통해 확인가능합니다.

txt
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
`,3)]))}const m=a(l,[["render",t]]);export{f as __pageData,m as default}; diff --git a/assets/ko-kr_manage_commands.md.BnsPzg1t.lean.js b/assets/ko-kr_manage_commands.md.BnsPzg1t.lean.js new file mode 100644 index 00000000..318c9a6f --- /dev/null +++ b/assets/ko-kr_manage_commands.md.BnsPzg1t.lean.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as e,o as p}from"./chunks/framework.BQmytedh.js";const f=JSON.parse('{"title":"모든 명령어","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/manage/commands.md","filePath":"ko-kr/manage/commands.md","lastUpdated":1734384735000}'),l={name:"ko-kr/manage/commands.md"};function t(i,s,o,c,r,d){return p(),n("div",null,s[0]||(s[0]=[e(`

모든 명령어

다음 목록은 asdf에서 이용가능한 모든 명령어들입니다. 해당 목록은 asdf help 명령어를 통해 확인가능합니다.

txt
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
`,3)]))}const m=a(l,[["render",t]]);export{f as __pageData,m as default}; diff --git a/assets/ko-kr_manage_configuration.md.DziiMa6H.js b/assets/ko-kr_manage_configuration.md.DziiMa6H.js new file mode 100644 index 00000000..8b304d94 --- /dev/null +++ b/assets/ko-kr_manage_configuration.md.DziiMa6H.js @@ -0,0 +1,9 @@ +import{_ as s,c as n,a2 as a,j as e,a as l,G as o,B as i,o as r}from"./chunks/framework.BQmytedh.js";const O=JSON.parse('{"title":"설정","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/manage/configuration.md","filePath":"ko-kr/manage/configuration.md","lastUpdated":1734384735000}'),c={name:"ko-kr/manage/configuration.md"},p={tabindex:"0"},f={style:{"text-align":"left"}},u={tabindex:"0"},g={style:{"text-align":"left"}},h={tabindex:"0"},y={style:{"text-align":"left"}},b={tabindex:"0"},m={style:{"text-align":"left"}},x={tabindex:"0"},_={style:{"text-align":"left"}};function v(k,t,D,A,E,F){const d=i("Badge");return r(),n("div",null,[t[32]||(t[32]=a(`

설정

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 혹은 ref:39cb398vb39 - 지정된 태그/커밋/브랜치 Github로부터 다운로드하고 컴파일됩니다.
  • path:~/src/elixir - 사용하려는 툴의 맞춤 컴파일 버전을 위한 경로. 언어 개발자들 등이 사용합니다.
  • system - 이 키워드는 asdf가 asdf에 의해 관리되지 않는 시스템 버전 툴의 버전을 사용하게합니다.

TIP

다양한 버전들은 공백으로 구분하여 설정될 수 있습니다. 예를 들어, 파이썬 3.7.2를 사용하고, 파이썬 2.7.15로 그리고 마지막으로 system 파이썬으로 폴백하려면, 다음을 .tool-versions에 추가해주세요.

python 3.7.2 2.7.15 system

.tool-version 파일에 정의된 모든 툴들을 설치하려면 .tool-version 파일이 포함된 디렉토리에서 다른 인수 없이 asdf install을 실행합니다.

.tool-versions 파일에 정의된 하나의 툴을 설치하려면 .tool-version 파일이 포함된 디렉토리에서 asdf install <name>를 실행합니다. 이 툴은 .tool-versions 파일에 정의된 버전으로 설치됩니다.

해당 파일은 직접 편집하거나 asdf local 명령어(또는 asdf global 명령어)를 사용하여 업데이트해 주세요.

.asdfrc

.asdfrc 파일은 사용자의 머신별 설정을 정의합니다.

\${HOME}/.asdfrc는 asdf가 사용하는 기본 위치입니다. 이는 환경 변수 ASDF_CONFIG_FILE로 설정 가능합니다.

아래 파일은 필수적인 형식과 기본값들을 보여줍니다:

txt
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

지원되는 플러그인들은 다른 버전 매니저에서 사용되는 버전 파일들을 읽을 수 있습니다, 예를 들어, 루비의 rbenv에서 .ruby-version.

`,22)),e("table",p,[t[4]||(t[4]=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",f,[t[0]||(t[0]=e("code",null,"no",-1)),t[1]||(t[1]=l()),o(d,{type:"tip",text:"기본",vertical:"middle"})]),t[2]||(t[2]=e("td",{style:{"text-align":"left"}},[l("버전을 불러오는 데는 "),e("code",null,".tool-versions"),l("를 사용합니다")],-1))]),t[3]||(t[3]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},[l("이용 가능한 레거시 버전 파일("),e("code",null,".ruby-version"),l(" 등)이 있는 경우 플러그인의 폴백으로 사용합니다")])],-1))])]),t[33]||(t[33]=e("h3",{id:"use-release-candidates",tabindex:"-1"},[e("code",null,"use_release_candidates"),l(),e("a",{class:"header-anchor",href:"#use-release-candidates","aria-label":'Permalink to "`use_release_candidates`"'},"​")],-1)),t[34]||(t[34]=e("p",null,[e("code",null,"asdf update"),l(" 명령어로 asdf를 최신 유의적 버전이 아닌 최신 버전 후보판으로 업그레이드 되도록 설정합니다.")],-1)),e("table",u,[t[9]||(t[9]=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",g,[t[5]||(t[5]=e("code",null,"no",-1)),t[6]||(t[6]=l()),o(d,{type:"tip",text:"기본",vertical:"middle"})]),t[7]||(t[7]=e("td",{style:{"text-align":"left"}},"유의적 버전 사용",-1))]),t[8]||(t[8]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"릴리스 후보판 사용")],-1))])]),t[35]||(t[35]=e("h3",{id:"always-keep-download",tabindex:"-1"},[e("code",null,"always_keep_download"),l(),e("a",{class:"header-anchor",href:"#always-keep-download","aria-label":'Permalink to "`always_keep_download`"'},"​")],-1)),t[36]||(t[36]=e("p",null,[e("code",null,"asdf install"),l(" 명령어로 다운로드하는 소스 코드 또는 바이너리를 유지 또는 제거하도록 설정합니다")],-1)),e("table",h,[t[14]||(t[14]=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",y,[t[10]||(t[10]=e("code",null,"no",-1)),t[11]||(t[11]=l()),o(d,{type:"tip",text:"기본",vertical:"middle"})]),t[12]||(t[12]=e("td",{style:{"text-align":"left"}},"성공적인 설치 후 소스 코드 또는 바이너리 제거",-1))]),t[13]||(t[13]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"설치 후 소스 코드 또는 바이너리 유지")],-1))])]),t[37]||(t[37]=e("h3",{id:"plugin-repository-last-check-duration",tabindex:"-1"},[e("code",null,"plugin_repository_last_check_duration"),l(),e("a",{class:"header-anchor",href:"#plugin-repository-last-check-duration","aria-label":'Permalink to "`plugin_repository_last_check_duration`"'},"​")],-1)),t[38]||(t[38]=e("p",null,"asdf 플러그인 리포지토리 동기화 간격(분)을 설정합니다. 트리거 이벤트는 지난 동기화 시간을 확인하게 합니다. 마지막 동기화 이후 지정된 동기화 간격보다 더 많은 시간이 경과하면, 새로운 동기화가 발생합니다.",-1)),e("table",b,[t[26]||(t[26]=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",m,[t[15]||(t[15]=e("code",null,"1",-1)),t[16]||(t[16]=l("에서 ")),t[17]||(t[17]=e("code",null,"999999999",-1)),t[18]||(t[18]=l(" 사이의 정수 ")),t[19]||(t[19]=e("br",null,null,-1)),t[20]||(t[20]=l()),t[21]||(t[21]=e("code",null,"60",-1)),t[22]||(t[22]=l()),o(d,{type:"tip",text:"기본",vertical:"middle"})]),t[23]||(t[23]=e("td",{style:{"text-align":"left"}},"마지막 동기화 이후 지속 시간(분)이 초과된 경우 트리거 이벤트 동기화",-1))]),t[24]||(t[24]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"0")]),e("td",{style:{"text-align":"left"}},"각 트리거 이벤트에서 동기화")],-1)),t[25]||(t[25]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"never")]),e("td",{style:{"text-align":"left"}},"동기화 하지 않음")],-1))])]),t[39]||(t[39]=a('

동기화 이벤트는 다음 명령어들을 실행할 때 발생합니다:

  • 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 플러그인 short-name 리포지토리의 동기화를 비활성화합니다. short-name 리포지토리가 비활성화 되어있으면 동기화 이벤트가 조기 종료됩니다.

',6)),e("table",x,[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",_,[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 플러그인 리포지토리 clone 또는 업데이트",-1))]),t[30]||(t[30]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"short-name 플러그인 리포지토리 비활성화")],-1))])]),t[40]||(t[40]=a('

동기화 이벤트는 다음 명령어들을 실행할 때 발생합니다:

  • asdf plugin add <name>
  • asdf plugin list all

asdf plugin add <name> <git-url>는 플러그인 동기화를 트리거하지 않습니다.

노트

플러그인 short-name repository를 비활성화해도 리포지토리가 이미 동기화된 경우 제거되지 않습니다. rm --recursive --trash $ASDF_DATA_DIR/repository로 플러그인 리포지토리를 제거합니다.

플러그인 short-name 리포지토리를 비활성화해도 그 리포지토리로부터 설치된 이전의 플러그인은 제거되지 않습니다. asdf plugin remove <name>을 사용하여 플러그인을 제거할 수 있습니다. 플러그인을 제거하면 해당 툴의 모든 설치된 버전이 제거됩니다.

concurrency

컴파일 중에 사용할 기본 코어 수입니다.

옵션설명
정수소스 코드를 컴파일할 때 사용할 코어 수
autonproc, sysctl hw.ncpu, /proc/cpuinfo 또는 1을 순차적으로 사용하여 코어 수를 계산합니다

노트: ASDF_CONCURRENCY 환경 변수가 존재하는 경우 우선 순위를 갖습니다.

플러그인 훅

다음에서 사용자 맞춤 코드를 실행이 가능합니다:

  • 플러그인 설치, shim 재생성, 업데이트, 또는 제거 전 또는 후
  • 플러그인 명령어 실행 전 또는 후

예를 들어 foo라는 플러그인이 설치되어 있고 bar라는 실행파일이 제공된 경우, 다음 훅들을 사용하여 사용자 맞춤 코드를 먼저 실행할 수 있습니다:

text
pre_foo_bar = echo Executing with args: $@

지원되는 패턴은 다음과 같습니다:

  • pre_<plugin_name>_<command>
  • pre_asdf_download_<plugin_name>
  • {pre,post}_asdf_{install,reshim,uninstall}_<plugin_name>
    • $1: 풀 버전
  • {pre,post}_asdf_plugin_{add,update,remove,reshim}
    • $1: 플러그인 이름
  • {pre,post}_asdf_plugin_{add,update,remove}_<plugin_name>

어떤 명령어 훅들이 어떤 명령어 이전 또는 이후에 실행되는 지에 대한 자세한 내용은 플러그인 생성하기를 참조하세요.

환경 변수

환경 변수 설정은 시스템과 셸에 따라 다릅니다. 기본 위치는 설치 위치와 방식(Git clone, 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-version 파일들을 무시하고 싶을 때 해당 값을 설정하세요.

  • 미설정 시: .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 값보다 우선 시 됩니다.

  • 미설정 시: asdf 설정 concurrency 값이 사용됩니다.
  • 사용법: export ASDF_CONCURRENCY=32

ASDF_FORCE_PREPEND

PATH의 맨 앞(최우선순위) 부분에 asdf shim과 경로 디렉토리를 추가할 것인지 여부.

  • 미설정 시: 맥 운영체제에서, yes가 기본값; 다른 시스템에서는 no가 기본값
  • yes: PATH의 앞 부분에 asdf 디렉토리 강제 추가
  • yes 이외의 다른 문자열: PATH의 앞 부분에 asdf 디렉토리 강제로 추가하지 않음
  • 사용법: ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"

전체 설정의 예시

다음을 이용한 간단한 asdf 설치는:

  • Bash 셸
  • $HOME/.asdf 설치 위치
  • Git을 통한 설치
  • 환경 변수 설정 없음
  • 맞춤 .asdfrc 파일 없음

다음의 결과가 나오게 됩니다:

항목값이 세팅되는 과정
config file location$HOME/.asdfrcASDF_CONFIG_FILE가 비었으므로, $HOME/.asdfrc을 사용
default tool versions filename.tool-versionsASDF_DEFAULT_TOOL_VERSIONS_FILENAME가 비었으므로, .tool-versions을 사용
asdf dir$HOME/.asdfASDF_DIR가 비었으므로, bin/asdf의 한 단계 상위 디렉토리 사용
asdf data dir$HOME/.asdfASDF_DATA_DIR가 비었으므로, $HOME/.asdf$HOME으로 사용.
concurrencyautoASDF_CONCURRENCY가 비었으므로, 기본 설정concurrency 값에 의존
legacy_version_fileno맞춤 .asdfrc 없음, 기본 설정 사용
use_release_candidatesno맞춤 .asdfrc 없음, 기본 설정 사용
always_keep_downloadno맞춤 .asdfrc 없음, 기본 설정 사용
plugin_repository_last_check_duration60맞춤 .asdfrc 없음, 기본 설정 사용
disable_plugin_short_name_repositoryno맞춤 .asdfrc 없음, 기본 설정 사용

내부 설정

이 섹션은 패키지 관리자 및 통합자에게 유용한 asdf 내부 설정을 설명하므로 일반 사용자들은 이 섹션에 대해 걱정할 필요가 없습니다.

  • $ASDF_DIR/asdf_updates_disabled: 이 파일이 있으면 asdf update 명령어를 통한 업데이트가 (내용과 무관하게) 비활성화됩니다. 이는 Pacman이나 Homebrew와 같은 패키지 매니저들이 특정 설치에 올바른 업데이트 방법이 사용되었는지 확인하는 데 사용됩니다.
',46))])}const q=s(c,[["render",v]]);export{O as __pageData,q as default}; diff --git a/assets/ko-kr_manage_configuration.md.DziiMa6H.lean.js b/assets/ko-kr_manage_configuration.md.DziiMa6H.lean.js new file mode 100644 index 00000000..8b304d94 --- /dev/null +++ b/assets/ko-kr_manage_configuration.md.DziiMa6H.lean.js @@ -0,0 +1,9 @@ +import{_ as s,c as n,a2 as a,j as e,a as l,G as o,B as i,o as r}from"./chunks/framework.BQmytedh.js";const O=JSON.parse('{"title":"설정","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/manage/configuration.md","filePath":"ko-kr/manage/configuration.md","lastUpdated":1734384735000}'),c={name:"ko-kr/manage/configuration.md"},p={tabindex:"0"},f={style:{"text-align":"left"}},u={tabindex:"0"},g={style:{"text-align":"left"}},h={tabindex:"0"},y={style:{"text-align":"left"}},b={tabindex:"0"},m={style:{"text-align":"left"}},x={tabindex:"0"},_={style:{"text-align":"left"}};function v(k,t,D,A,E,F){const d=i("Badge");return r(),n("div",null,[t[32]||(t[32]=a(`

설정

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 혹은 ref:39cb398vb39 - 지정된 태그/커밋/브랜치 Github로부터 다운로드하고 컴파일됩니다.
  • path:~/src/elixir - 사용하려는 툴의 맞춤 컴파일 버전을 위한 경로. 언어 개발자들 등이 사용합니다.
  • system - 이 키워드는 asdf가 asdf에 의해 관리되지 않는 시스템 버전 툴의 버전을 사용하게합니다.

TIP

다양한 버전들은 공백으로 구분하여 설정될 수 있습니다. 예를 들어, 파이썬 3.7.2를 사용하고, 파이썬 2.7.15로 그리고 마지막으로 system 파이썬으로 폴백하려면, 다음을 .tool-versions에 추가해주세요.

python 3.7.2 2.7.15 system

.tool-version 파일에 정의된 모든 툴들을 설치하려면 .tool-version 파일이 포함된 디렉토리에서 다른 인수 없이 asdf install을 실행합니다.

.tool-versions 파일에 정의된 하나의 툴을 설치하려면 .tool-version 파일이 포함된 디렉토리에서 asdf install <name>를 실행합니다. 이 툴은 .tool-versions 파일에 정의된 버전으로 설치됩니다.

해당 파일은 직접 편집하거나 asdf local 명령어(또는 asdf global 명령어)를 사용하여 업데이트해 주세요.

.asdfrc

.asdfrc 파일은 사용자의 머신별 설정을 정의합니다.

\${HOME}/.asdfrc는 asdf가 사용하는 기본 위치입니다. 이는 환경 변수 ASDF_CONFIG_FILE로 설정 가능합니다.

아래 파일은 필수적인 형식과 기본값들을 보여줍니다:

txt
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

지원되는 플러그인들은 다른 버전 매니저에서 사용되는 버전 파일들을 읽을 수 있습니다, 예를 들어, 루비의 rbenv에서 .ruby-version.

`,22)),e("table",p,[t[4]||(t[4]=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",f,[t[0]||(t[0]=e("code",null,"no",-1)),t[1]||(t[1]=l()),o(d,{type:"tip",text:"기본",vertical:"middle"})]),t[2]||(t[2]=e("td",{style:{"text-align":"left"}},[l("버전을 불러오는 데는 "),e("code",null,".tool-versions"),l("를 사용합니다")],-1))]),t[3]||(t[3]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},[l("이용 가능한 레거시 버전 파일("),e("code",null,".ruby-version"),l(" 등)이 있는 경우 플러그인의 폴백으로 사용합니다")])],-1))])]),t[33]||(t[33]=e("h3",{id:"use-release-candidates",tabindex:"-1"},[e("code",null,"use_release_candidates"),l(),e("a",{class:"header-anchor",href:"#use-release-candidates","aria-label":'Permalink to "`use_release_candidates`"'},"​")],-1)),t[34]||(t[34]=e("p",null,[e("code",null,"asdf update"),l(" 명령어로 asdf를 최신 유의적 버전이 아닌 최신 버전 후보판으로 업그레이드 되도록 설정합니다.")],-1)),e("table",u,[t[9]||(t[9]=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",g,[t[5]||(t[5]=e("code",null,"no",-1)),t[6]||(t[6]=l()),o(d,{type:"tip",text:"기본",vertical:"middle"})]),t[7]||(t[7]=e("td",{style:{"text-align":"left"}},"유의적 버전 사용",-1))]),t[8]||(t[8]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"릴리스 후보판 사용")],-1))])]),t[35]||(t[35]=e("h3",{id:"always-keep-download",tabindex:"-1"},[e("code",null,"always_keep_download"),l(),e("a",{class:"header-anchor",href:"#always-keep-download","aria-label":'Permalink to "`always_keep_download`"'},"​")],-1)),t[36]||(t[36]=e("p",null,[e("code",null,"asdf install"),l(" 명령어로 다운로드하는 소스 코드 또는 바이너리를 유지 또는 제거하도록 설정합니다")],-1)),e("table",h,[t[14]||(t[14]=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",y,[t[10]||(t[10]=e("code",null,"no",-1)),t[11]||(t[11]=l()),o(d,{type:"tip",text:"기본",vertical:"middle"})]),t[12]||(t[12]=e("td",{style:{"text-align":"left"}},"성공적인 설치 후 소스 코드 또는 바이너리 제거",-1))]),t[13]||(t[13]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"설치 후 소스 코드 또는 바이너리 유지")],-1))])]),t[37]||(t[37]=e("h3",{id:"plugin-repository-last-check-duration",tabindex:"-1"},[e("code",null,"plugin_repository_last_check_duration"),l(),e("a",{class:"header-anchor",href:"#plugin-repository-last-check-duration","aria-label":'Permalink to "`plugin_repository_last_check_duration`"'},"​")],-1)),t[38]||(t[38]=e("p",null,"asdf 플러그인 리포지토리 동기화 간격(분)을 설정합니다. 트리거 이벤트는 지난 동기화 시간을 확인하게 합니다. 마지막 동기화 이후 지정된 동기화 간격보다 더 많은 시간이 경과하면, 새로운 동기화가 발생합니다.",-1)),e("table",b,[t[26]||(t[26]=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",m,[t[15]||(t[15]=e("code",null,"1",-1)),t[16]||(t[16]=l("에서 ")),t[17]||(t[17]=e("code",null,"999999999",-1)),t[18]||(t[18]=l(" 사이의 정수 ")),t[19]||(t[19]=e("br",null,null,-1)),t[20]||(t[20]=l()),t[21]||(t[21]=e("code",null,"60",-1)),t[22]||(t[22]=l()),o(d,{type:"tip",text:"기본",vertical:"middle"})]),t[23]||(t[23]=e("td",{style:{"text-align":"left"}},"마지막 동기화 이후 지속 시간(분)이 초과된 경우 트리거 이벤트 동기화",-1))]),t[24]||(t[24]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"0")]),e("td",{style:{"text-align":"left"}},"각 트리거 이벤트에서 동기화")],-1)),t[25]||(t[25]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"never")]),e("td",{style:{"text-align":"left"}},"동기화 하지 않음")],-1))])]),t[39]||(t[39]=a('

동기화 이벤트는 다음 명령어들을 실행할 때 발생합니다:

  • 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 플러그인 short-name 리포지토리의 동기화를 비활성화합니다. short-name 리포지토리가 비활성화 되어있으면 동기화 이벤트가 조기 종료됩니다.

',6)),e("table",x,[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",_,[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 플러그인 리포지토리 clone 또는 업데이트",-1))]),t[30]||(t[30]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"short-name 플러그인 리포지토리 비활성화")],-1))])]),t[40]||(t[40]=a('

동기화 이벤트는 다음 명령어들을 실행할 때 발생합니다:

  • asdf plugin add <name>
  • asdf plugin list all

asdf plugin add <name> <git-url>는 플러그인 동기화를 트리거하지 않습니다.

노트

플러그인 short-name repository를 비활성화해도 리포지토리가 이미 동기화된 경우 제거되지 않습니다. rm --recursive --trash $ASDF_DATA_DIR/repository로 플러그인 리포지토리를 제거합니다.

플러그인 short-name 리포지토리를 비활성화해도 그 리포지토리로부터 설치된 이전의 플러그인은 제거되지 않습니다. asdf plugin remove <name>을 사용하여 플러그인을 제거할 수 있습니다. 플러그인을 제거하면 해당 툴의 모든 설치된 버전이 제거됩니다.

concurrency

컴파일 중에 사용할 기본 코어 수입니다.

옵션설명
정수소스 코드를 컴파일할 때 사용할 코어 수
autonproc, sysctl hw.ncpu, /proc/cpuinfo 또는 1을 순차적으로 사용하여 코어 수를 계산합니다

노트: ASDF_CONCURRENCY 환경 변수가 존재하는 경우 우선 순위를 갖습니다.

플러그인 훅

다음에서 사용자 맞춤 코드를 실행이 가능합니다:

  • 플러그인 설치, shim 재생성, 업데이트, 또는 제거 전 또는 후
  • 플러그인 명령어 실행 전 또는 후

예를 들어 foo라는 플러그인이 설치되어 있고 bar라는 실행파일이 제공된 경우, 다음 훅들을 사용하여 사용자 맞춤 코드를 먼저 실행할 수 있습니다:

text
pre_foo_bar = echo Executing with args: $@

지원되는 패턴은 다음과 같습니다:

  • pre_<plugin_name>_<command>
  • pre_asdf_download_<plugin_name>
  • {pre,post}_asdf_{install,reshim,uninstall}_<plugin_name>
    • $1: 풀 버전
  • {pre,post}_asdf_plugin_{add,update,remove,reshim}
    • $1: 플러그인 이름
  • {pre,post}_asdf_plugin_{add,update,remove}_<plugin_name>

어떤 명령어 훅들이 어떤 명령어 이전 또는 이후에 실행되는 지에 대한 자세한 내용은 플러그인 생성하기를 참조하세요.

환경 변수

환경 변수 설정은 시스템과 셸에 따라 다릅니다. 기본 위치는 설치 위치와 방식(Git clone, 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-version 파일들을 무시하고 싶을 때 해당 값을 설정하세요.

  • 미설정 시: .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 값보다 우선 시 됩니다.

  • 미설정 시: asdf 설정 concurrency 값이 사용됩니다.
  • 사용법: export ASDF_CONCURRENCY=32

ASDF_FORCE_PREPEND

PATH의 맨 앞(최우선순위) 부분에 asdf shim과 경로 디렉토리를 추가할 것인지 여부.

  • 미설정 시: 맥 운영체제에서, yes가 기본값; 다른 시스템에서는 no가 기본값
  • yes: PATH의 앞 부분에 asdf 디렉토리 강제 추가
  • yes 이외의 다른 문자열: PATH의 앞 부분에 asdf 디렉토리 강제로 추가하지 않음
  • 사용법: ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"

전체 설정의 예시

다음을 이용한 간단한 asdf 설치는:

  • Bash 셸
  • $HOME/.asdf 설치 위치
  • Git을 통한 설치
  • 환경 변수 설정 없음
  • 맞춤 .asdfrc 파일 없음

다음의 결과가 나오게 됩니다:

항목값이 세팅되는 과정
config file location$HOME/.asdfrcASDF_CONFIG_FILE가 비었으므로, $HOME/.asdfrc을 사용
default tool versions filename.tool-versionsASDF_DEFAULT_TOOL_VERSIONS_FILENAME가 비었으므로, .tool-versions을 사용
asdf dir$HOME/.asdfASDF_DIR가 비었으므로, bin/asdf의 한 단계 상위 디렉토리 사용
asdf data dir$HOME/.asdfASDF_DATA_DIR가 비었으므로, $HOME/.asdf$HOME으로 사용.
concurrencyautoASDF_CONCURRENCY가 비었으므로, 기본 설정concurrency 값에 의존
legacy_version_fileno맞춤 .asdfrc 없음, 기본 설정 사용
use_release_candidatesno맞춤 .asdfrc 없음, 기본 설정 사용
always_keep_downloadno맞춤 .asdfrc 없음, 기본 설정 사용
plugin_repository_last_check_duration60맞춤 .asdfrc 없음, 기본 설정 사용
disable_plugin_short_name_repositoryno맞춤 .asdfrc 없음, 기본 설정 사용

내부 설정

이 섹션은 패키지 관리자 및 통합자에게 유용한 asdf 내부 설정을 설명하므로 일반 사용자들은 이 섹션에 대해 걱정할 필요가 없습니다.

  • $ASDF_DIR/asdf_updates_disabled: 이 파일이 있으면 asdf update 명령어를 통한 업데이트가 (내용과 무관하게) 비활성화됩니다. 이는 Pacman이나 Homebrew와 같은 패키지 매니저들이 특정 설치에 올바른 업데이트 방법이 사용되었는지 확인하는 데 사용됩니다.
',46))])}const q=s(c,[["render",v]]);export{O as __pageData,q as default}; diff --git a/assets/ko-kr_manage_core.md.YwhJzC1z.js b/assets/ko-kr_manage_core.md.YwhJzC1z.js new file mode 100644 index 00000000..202d655d --- /dev/null +++ b/assets/ko-kr_manage_core.md.YwhJzC1z.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as l,o as t}from"./chunks/framework.BQmytedh.js";const c=JSON.parse('{"title":"코어","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/manage/core.md","filePath":"ko-kr/manage/core.md","lastUpdated":1734384735000}'),h={name:"ko-kr/manage/core.md"};function e(n,s,p,k,d,o){return t(),a("div",null,s[0]||(s[0]=[l(`

코어

코어 asdf 명령어는 소수지만, 많은 워크플로우를 원활하게 만들어줍니다.

설치 & 설정

시작하기의 가이드에 설명되어 있습니다.

실행

shell
asdf exec <command> [args...]

현재 버전의 shim 명령어를 실행합니다.

환경 변수

shell
asdf env <command> [util]

정보

shell
asdf info

운영체제, 셸 및 asdf 디버깅 정보를 출력하는 헬퍼 명령어입니다. 버그 리포트 작성시 공유해주세요.

Shim 재생성

shell
asdf reshim <name> <version>

패키지의 현재 버전 shim을 재생성합니다. 기본적으로, shim들은 플러그인을 통해 툴 설치 중에 생성됩니다. npm CLI 등과 같은 툴들은 실행파일을 글로벌 설치할 수 있습니다, 예를 들어, npm install -g yarn을 통한 Yarn 설치. 이러한 실행파일은 플러그인의 라이프사이클을 통해 설치되지 않았기 때문에, 해당 플러그인을 위한 shim이 아직 존재하지 않습니다. 이때, nodejs<version>에 대해서, 예를 들면 yarn과 같은, 새로운 실행파일의 shim을 asdf reshim nodejs <version>을 통해 강제적으로 재작성 할 수 있습니다.

Shim 버전

shell
asdf shim-versions <command>

shim을 제공하는 플러그인 및 버전들을 나열합니다.

예를 들면, Node.js에는 nodenpm이라고 하는 2개의 실행파일이 제공되고 있습니다. asdf-nodejs을 통해 여러 버전의 툴이 설치되어 있는 경우, shim-versions는 아래와 같은 내용을 출력할 수 있습니다:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

업데이트

asdf는 (권장 설치 방법) Git에 의존하는 빌트인 업데이트 명령어가 있습니다. 다른 방법으로 설치한 경우, 그 방법을 위한 절차를 따라주세요:

방법최신 안정 릴리스master에 최신 커밋
asdf (via Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
Pacman새로운 PKGBUILD 다운로드 & 재빌드
혹은 선호하는 AUR 헬퍼 사용

제거

asdf 제거를 위해 다음 절차를 따르세요:

Bash & Git
  1. ~/.bashrc에서, asdf.sh 및 자동완성을 source하고 있는 행들을 삭제:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. ~/.bash_profile에서, asdf.sh 및 자동완성을 source하고 있는 행들을 삭제:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. ~/.bashrc에서, asdf.sh 및 자동완성을 source하고 있는 행들을 삭제:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

명령어 자동완성에 대해서는 Homebrew에 설명되어 있는 방법으로 설정 되어 있을 가능성이 있으므로, 그 가이드에 따라 삭제할 행을 찾아주세요.

  1. 패키지 관리자를 사용하여 제거:
shell
brew uninstall asdf --force
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

macOS Catalina 혹은 그 이상을 사용하신다면, 기본 셸이 ZSH로 변경되었습니다. 만약, ~/.bash_profile에서 설정을 찾을 수 없는 경우는, ~/.zshrc에 있을 가능성이 있는데 이 경우 ZSH의 설명을 봐 주세요.

  1. ~/.bash_profile에서, asdf.sh 및 자동완성을 source하고 있는 행들을 삭제:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

명령어 자동완성에 대해서는 Homebrew에 설명되어 있는 방법으로 설정 되어 있을 가능성이 있으므로, 그 가이드에 따라 삭제할 행을 찾아주세요.

  1. 패키지 관리자를 사용하여 제거:
shell
brew uninstall asdf --force
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. ~/.bashrc에서, asdf.sh 및 자동완성을 source하고 있는 행들을 삭제:
shell
. /opt/asdf-vm/asdf.sh
  1. 패키지 관리자를 사용하여 제거:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. ~/.config/fish/config.fish에서, asdf.fish를 source하고 있는 행들을 삭제:
shell
source ~/.asdf/asdf.fish

그리고 자동완성을 다음 명령어로 제거:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. ~/.config/fish/config.fish에서, asdf.fish를 source하고 있는 행들을 삭제:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. 패키지 관리자를 사용하여 제거:
shell
brew uninstall asdf --force
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. ~/.config/fish/config.fish에서, asdf.fish를 source하고 있는 행들을 삭제:
shell
source /opt/asdf-vm/asdf.fish
  1. 패키지 관리자를 사용하여 제거:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. ~/.config/elvish/rc.elv에서, asdf 모듈을 사용하는 행들을 삭제:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

그리고 asdf 모듈을 다음 명령어로 제거:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. $HOME/.asdf 디렉토리 제거:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. ~/.config/elvish/rc.elv에서, asdf 모듈을 사용하는 행들을 삭제:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

그리고 asdf 모듈을 다음 명령어로 제거:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 패키지 관리자를 사용하여 제거:
shell
brew uninstall asdf --force
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. ~/.config/elvish/rc.elv에서, asdf 모듈을 사용하는 행들을 삭제:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

그리고 asdf 모듈을 다음 명령어로 제거:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 패키지 관리자를 사용하여 제거:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdf 디렉토리 제거:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. ~/.zshrc에서, asdf.sh 및 자동완성을 source하고 있는 행들을 삭제:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

혹은 사용된 ZSH 프레임워크 플러그인 제거.

  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. ~/.zshrc에서, asdf.sh을 source하고 있는 행들을 삭제:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. 패키지 관리자를 사용하여 제거:
shell
brew uninstall asdf --force && brew autoremove
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. ~/.zshrc에서, asdf.sh을 source하고 있는 행들을 삭제:
shell
. /opt/asdf-vm/asdf.sh
  1. 패키지 관리자를 사용하여 제거:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
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/ko-kr_manage_core.md.YwhJzC1z.lean.js b/assets/ko-kr_manage_core.md.YwhJzC1z.lean.js new file mode 100644 index 00000000..202d655d --- /dev/null +++ b/assets/ko-kr_manage_core.md.YwhJzC1z.lean.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as l,o as t}from"./chunks/framework.BQmytedh.js";const c=JSON.parse('{"title":"코어","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/manage/core.md","filePath":"ko-kr/manage/core.md","lastUpdated":1734384735000}'),h={name:"ko-kr/manage/core.md"};function e(n,s,p,k,d,o){return t(),a("div",null,s[0]||(s[0]=[l(`

코어

코어 asdf 명령어는 소수지만, 많은 워크플로우를 원활하게 만들어줍니다.

설치 & 설정

시작하기의 가이드에 설명되어 있습니다.

실행

shell
asdf exec <command> [args...]

현재 버전의 shim 명령어를 실행합니다.

환경 변수

shell
asdf env <command> [util]

정보

shell
asdf info

운영체제, 셸 및 asdf 디버깅 정보를 출력하는 헬퍼 명령어입니다. 버그 리포트 작성시 공유해주세요.

Shim 재생성

shell
asdf reshim <name> <version>

패키지의 현재 버전 shim을 재생성합니다. 기본적으로, shim들은 플러그인을 통해 툴 설치 중에 생성됩니다. npm CLI 등과 같은 툴들은 실행파일을 글로벌 설치할 수 있습니다, 예를 들어, npm install -g yarn을 통한 Yarn 설치. 이러한 실행파일은 플러그인의 라이프사이클을 통해 설치되지 않았기 때문에, 해당 플러그인을 위한 shim이 아직 존재하지 않습니다. 이때, nodejs<version>에 대해서, 예를 들면 yarn과 같은, 새로운 실행파일의 shim을 asdf reshim nodejs <version>을 통해 강제적으로 재작성 할 수 있습니다.

Shim 버전

shell
asdf shim-versions <command>

shim을 제공하는 플러그인 및 버전들을 나열합니다.

예를 들면, Node.js에는 nodenpm이라고 하는 2개의 실행파일이 제공되고 있습니다. asdf-nodejs을 통해 여러 버전의 툴이 설치되어 있는 경우, shim-versions는 아래와 같은 내용을 출력할 수 있습니다:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

업데이트

asdf는 (권장 설치 방법) Git에 의존하는 빌트인 업데이트 명령어가 있습니다. 다른 방법으로 설치한 경우, 그 방법을 위한 절차를 따라주세요:

방법최신 안정 릴리스master에 최신 커밋
asdf (via Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
Pacman새로운 PKGBUILD 다운로드 & 재빌드
혹은 선호하는 AUR 헬퍼 사용

제거

asdf 제거를 위해 다음 절차를 따르세요:

Bash & Git
  1. ~/.bashrc에서, asdf.sh 및 자동완성을 source하고 있는 행들을 삭제:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. ~/.bash_profile에서, asdf.sh 및 자동완성을 source하고 있는 행들을 삭제:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. ~/.bashrc에서, asdf.sh 및 자동완성을 source하고 있는 행들을 삭제:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

명령어 자동완성에 대해서는 Homebrew에 설명되어 있는 방법으로 설정 되어 있을 가능성이 있으므로, 그 가이드에 따라 삭제할 행을 찾아주세요.

  1. 패키지 관리자를 사용하여 제거:
shell
brew uninstall asdf --force
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

macOS Catalina 혹은 그 이상을 사용하신다면, 기본 셸이 ZSH로 변경되었습니다. 만약, ~/.bash_profile에서 설정을 찾을 수 없는 경우는, ~/.zshrc에 있을 가능성이 있는데 이 경우 ZSH의 설명을 봐 주세요.

  1. ~/.bash_profile에서, asdf.sh 및 자동완성을 source하고 있는 행들을 삭제:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

명령어 자동완성에 대해서는 Homebrew에 설명되어 있는 방법으로 설정 되어 있을 가능성이 있으므로, 그 가이드에 따라 삭제할 행을 찾아주세요.

  1. 패키지 관리자를 사용하여 제거:
shell
brew uninstall asdf --force
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. ~/.bashrc에서, asdf.sh 및 자동완성을 source하고 있는 행들을 삭제:
shell
. /opt/asdf-vm/asdf.sh
  1. 패키지 관리자를 사용하여 제거:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. ~/.config/fish/config.fish에서, asdf.fish를 source하고 있는 행들을 삭제:
shell
source ~/.asdf/asdf.fish

그리고 자동완성을 다음 명령어로 제거:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. ~/.config/fish/config.fish에서, asdf.fish를 source하고 있는 행들을 삭제:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. 패키지 관리자를 사용하여 제거:
shell
brew uninstall asdf --force
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. ~/.config/fish/config.fish에서, asdf.fish를 source하고 있는 행들을 삭제:
shell
source /opt/asdf-vm/asdf.fish
  1. 패키지 관리자를 사용하여 제거:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. ~/.config/elvish/rc.elv에서, asdf 모듈을 사용하는 행들을 삭제:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

그리고 asdf 모듈을 다음 명령어로 제거:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. $HOME/.asdf 디렉토리 제거:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. ~/.config/elvish/rc.elv에서, asdf 모듈을 사용하는 행들을 삭제:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

그리고 asdf 모듈을 다음 명령어로 제거:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 패키지 관리자를 사용하여 제거:
shell
brew uninstall asdf --force
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. ~/.config/elvish/rc.elv에서, asdf 모듈을 사용하는 행들을 삭제:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

그리고 asdf 모듈을 다음 명령어로 제거:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 패키지 관리자를 사용하여 제거:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdf 디렉토리 제거:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. ~/.zshrc에서, asdf.sh 및 자동완성을 source하고 있는 행들을 삭제:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

혹은 사용된 ZSH 프레임워크 플러그인 제거.

  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. ~/.zshrc에서, asdf.sh을 source하고 있는 행들을 삭제:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. 패키지 관리자를 사용하여 제거:
shell
brew uninstall asdf --force && brew autoremove
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. ~/.zshrc에서, asdf.sh을 source하고 있는 행들을 삭제:
shell
. /opt/asdf-vm/asdf.sh
  1. 패키지 관리자를 사용하여 제거:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
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/ko-kr_manage_plugins.md.BStZ_uo9.js b/assets/ko-kr_manage_plugins.md.BStZ_uo9.js new file mode 100644 index 00000000..6124e7af --- /dev/null +++ b/assets/ko-kr_manage_plugins.md.BStZ_uo9.js @@ -0,0 +1,11 @@ +import{_ as a,c as i,a2 as l,o as e}from"./chunks/framework.BQmytedh.js";const g=JSON.parse('{"title":"플러그인","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/manage/plugins.md","filePath":"ko-kr/manage/plugins.md","lastUpdated":1734384735000}'),t={name:"ko-kr/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로 플러그인 추가하기:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

또는 플러그인 리포지토리에 short-name을 통해 추가하기:

shell
asdf plugin add <name>
+# asdf plugin add erlang

추천

short-name 리포지토리에 독립적인 긴 git-url 방식이 선호됩니다.

설치된 목록

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

모든 Short-name 리포지토리 목록

shell
asdf plugin list all

플러그인들의 전체 short-name 목록을 플러그인 Shortname 인덱스에서 확인하세요.

업데이트

shell
asdf plugin update --all

특정 패키지를 업데이트하고 싶다면, 다음 명령어를 사용하세요.

shell
asdf plugin update <name>
+# asdf plugin update erlang

이 명령어는 해당 플러그인 리포지토리의 origin 기본 브랜치가장 최근 커밋 을 fetch합니다. 버전화된 플러그인들과 업데이트들은 현재 개발 진행중 입니다 (#916).

제거

bash
asdf plugin remove <name>
+# asdf plugin remove erlang

플러그인 제거는 해당 툴과 관련된 모든 것을 제거합니다. 이것은 한 툴의 미사용중인 많은 버전들의 cleaning/pruning에 유용합니다.

asdf Short-name 리포지토리 동기화

Short-name 리포지토리는 로컬 머신에 주기적으로 동기화됩니다. 동기화 방식들로 다음 방식들이 있습니다:

  • 명령어들에 의한 동기화 이벤트:
    • asdf plugin add <name>
    • asdf plugin list all
  • 만약 disable_plugin_short_name_repository 설정 옵션이 yes로 설정되어 있다면, 동기화는 조기 종료됩니다. asdf 설정 문서에서 더보기.
  • 만약 동기화가 지난 X분 동안 진행되지 않았다면, 동기화가 진행됩니다.
    • X의 기본값은 60입니다만, .asdfrcplugin_repository_last_check_duration 옵션을 통해 설정될 수 있습니다. asdf 설정 문서에서 더보기.
`,26)]))}const c=a(t,[["render",n]]);export{g as __pageData,c as default}; diff --git a/assets/ko-kr_manage_plugins.md.BStZ_uo9.lean.js b/assets/ko-kr_manage_plugins.md.BStZ_uo9.lean.js new file mode 100644 index 00000000..6124e7af --- /dev/null +++ b/assets/ko-kr_manage_plugins.md.BStZ_uo9.lean.js @@ -0,0 +1,11 @@ +import{_ as a,c as i,a2 as l,o as e}from"./chunks/framework.BQmytedh.js";const g=JSON.parse('{"title":"플러그인","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/manage/plugins.md","filePath":"ko-kr/manage/plugins.md","lastUpdated":1734384735000}'),t={name:"ko-kr/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로 플러그인 추가하기:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

또는 플러그인 리포지토리에 short-name을 통해 추가하기:

shell
asdf plugin add <name>
+# asdf plugin add erlang

추천

short-name 리포지토리에 독립적인 긴 git-url 방식이 선호됩니다.

설치된 목록

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

모든 Short-name 리포지토리 목록

shell
asdf plugin list all

플러그인들의 전체 short-name 목록을 플러그인 Shortname 인덱스에서 확인하세요.

업데이트

shell
asdf plugin update --all

특정 패키지를 업데이트하고 싶다면, 다음 명령어를 사용하세요.

shell
asdf plugin update <name>
+# asdf plugin update erlang

이 명령어는 해당 플러그인 리포지토리의 origin 기본 브랜치가장 최근 커밋 을 fetch합니다. 버전화된 플러그인들과 업데이트들은 현재 개발 진행중 입니다 (#916).

제거

bash
asdf plugin remove <name>
+# asdf plugin remove erlang

플러그인 제거는 해당 툴과 관련된 모든 것을 제거합니다. 이것은 한 툴의 미사용중인 많은 버전들의 cleaning/pruning에 유용합니다.

asdf Short-name 리포지토리 동기화

Short-name 리포지토리는 로컬 머신에 주기적으로 동기화됩니다. 동기화 방식들로 다음 방식들이 있습니다:

  • 명령어들에 의한 동기화 이벤트:
    • asdf plugin add <name>
    • asdf plugin list all
  • 만약 disable_plugin_short_name_repository 설정 옵션이 yes로 설정되어 있다면, 동기화는 조기 종료됩니다. asdf 설정 문서에서 더보기.
  • 만약 동기화가 지난 X분 동안 진행되지 않았다면, 동기화가 진행됩니다.
    • X의 기본값은 60입니다만, .asdfrcplugin_repository_last_check_duration 옵션을 통해 설정될 수 있습니다. asdf 설정 문서에서 더보기.
`,26)]))}const c=a(t,[["render",n]]);export{g as __pageData,c as default}; diff --git a/assets/ko-kr_manage_versions.md.CMPcUJSc.js b/assets/ko-kr_manage_versions.md.CMPcUJSc.js new file mode 100644 index 00000000..55a3c66d --- /dev/null +++ b/assets/ko-kr_manage_versions.md.CMPcUJSc.js @@ -0,0 +1,30 @@ +import{_ as i,c as a,a2 as l,o as h}from"./chunks/framework.BQmytedh.js";const o=JSON.parse('{"title":"버전","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/manage/versions.md","filePath":"ko-kr/manage/versions.md","lastUpdated":1734384735000}'),t={name:"ko-kr/manage/versions.md"};function n(e,s,p,k,d,r){return h(),a("div",null,s[0]||(s[0]=[l(`

버전

버전 설치

shell
asdf install <name> <version>
+# asdf install erlang 17.3

플러그인이 소스에서 다운로드 & 컴파일을 지원하는 경우, ref:foo를 지정할 수 있으며 여기서 foo는 특정 브랜치, 태그 또는 커밋입니다. 제거할 때도 동일한 이름과 참조를 사용해야 합니다.

최신 안정 버전 설치

shell
asdf install <name> latest
+# asdf install erlang latest

주어진 문자열로 시작하는 최신 안정 버전을 설치합니다.

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

설치된 버전 목록

shell
asdf list <name>
+# asdf list erlang

주어진 문자열로 시작하는 버전으로 필터링합니다.

shell
asdf list <name> <version>
+# asdf list erlang 17

사용 가능한 모든 버전 목록

shell
asdf list all <name>
+# asdf list all erlang

주어진 문자열로 시작하는 버전으로 필터링합니다.

shell
asdf list all <name> <version>
+# asdf list all erlang 17

최신 안정 버전 보기

shell
asdf latest <name>
+# asdf latest erlang

주어진 문자열로 시작하는 최신 안정 버전을 보여줍니다.

shell
asdf latest <name> <version>
+# asdf latest erlang 17

현재 버전 설정

shell
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에 작성합니다.

현재 셸 세션에 대해서만, shellASDF_\${TOOL}_VERSION이라는 이름의 환경 변수로 버전을 설정합니다.

local은 해당 버전을 $PWD/.tool-versions에 작성합니다, 존재하지 않을 시에 새로 만듦.

세부 내용은 .tool-versions 설정 섹션에 파일을 참고하세요.

대체수단

현재 셸 세션에 대해서만 버전을 설정하려는 경우 또는 특정 툴 버전 하에 단순히 한개의 명령어만 실행하기 위해, 당신은 ASDF_\${TOOL}_VERSION과 같은 환경 변수를 설정할 수 있습니다.

다음 예시에서는 버전 1.4.0의 Elixir 프로젝트에서 테스트를 수행합니다. 버전 형식은 .tool-versions 파일에서 지원되는 것과 동일하게 지원됩니다.

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

시스템 버전으로의 폴백

asdf 관리 버전이 아닌 <name> 도구의 시스템 버전을 사용하려면 도구의 버전을 system으로 설정할 수 있습니다.

위에 현재 버전 설정 섹션에 나와있는대로, systemglobal, local or shell 중에 하나로 설정하세요.

shell
asdf local <name> system
+# asdf local python system

현재 버전 보기

shell
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

버전 제거

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

Shims

asdf는 패키지를 설치할 때 해당 패키지의 모든 실행 프로그램에 대한 shim들을 $ASDF_DATA_DIR/shims 디렉토리 (기본값은 ~/.asdf/shims)에 생성합니다. 이 디렉토리는 설치된 프로그램들이 이용가능하도록 $PATH (asdf.sh, asdf.fish 등)에 존재합니다.

Shim 자체는 플러그인 이름과 shim이 감싸고 있는 설치된 패키지의 실행파일의 경로를 넘겨주는 asdf exec라는 헬퍼 프로그램을 exec시키는 매우 단순한 wrapper입니다.

asdf exec 헬퍼는 (.tool-version 파일에 지정된 대로, asdf local... 또는 asdf global...에서 선택된 대로) 사용할 패키지의 버전을 결정합니다, (플러그인의 exec-path 콜백에 의해 조정될 수 있음) 패키지 설치 디렉토리의 실행 파일에 대한 최종 경로 및 (플러그인에 의해 제공된 - exec-env 스크립트) 실행할 환경을 결정하고, 최종적으로 이를 실행합니다.

노트

이 시스템은 exec 호출을 사용하기 때문에, 실행 대신 셸에 의해 source 되야하는 패키지의 스크립트는 shim wrapper를 통하지 않고 직접 액세스되야 합니다. 두 가지 asdf 명령어: whichwhere는 설치된 패키지로의 경로를 반환할 수 있습니다:

shell
# 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 shims 우회

어떠한 이유로 asdf의 shim들을 우회하고 싶거나 프로젝트의 디렉토리로 이동했을 때 자동으로 환경 변수를 설정되게 하고 싶으시면 asdf-direnv 플러그인이 도움이 될 것입니다. 상세한 내용은 README를 확인해 주세요.

`,45)]))}const c=i(t,[["render",n]]);export{o as __pageData,c as default}; diff --git a/assets/ko-kr_manage_versions.md.CMPcUJSc.lean.js b/assets/ko-kr_manage_versions.md.CMPcUJSc.lean.js new file mode 100644 index 00000000..55a3c66d --- /dev/null +++ b/assets/ko-kr_manage_versions.md.CMPcUJSc.lean.js @@ -0,0 +1,30 @@ +import{_ as i,c as a,a2 as l,o as h}from"./chunks/framework.BQmytedh.js";const o=JSON.parse('{"title":"버전","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/manage/versions.md","filePath":"ko-kr/manage/versions.md","lastUpdated":1734384735000}'),t={name:"ko-kr/manage/versions.md"};function n(e,s,p,k,d,r){return h(),a("div",null,s[0]||(s[0]=[l(`

버전

버전 설치

shell
asdf install <name> <version>
+# asdf install erlang 17.3

플러그인이 소스에서 다운로드 & 컴파일을 지원하는 경우, ref:foo를 지정할 수 있으며 여기서 foo는 특정 브랜치, 태그 또는 커밋입니다. 제거할 때도 동일한 이름과 참조를 사용해야 합니다.

최신 안정 버전 설치

shell
asdf install <name> latest
+# asdf install erlang latest

주어진 문자열로 시작하는 최신 안정 버전을 설치합니다.

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

설치된 버전 목록

shell
asdf list <name>
+# asdf list erlang

주어진 문자열로 시작하는 버전으로 필터링합니다.

shell
asdf list <name> <version>
+# asdf list erlang 17

사용 가능한 모든 버전 목록

shell
asdf list all <name>
+# asdf list all erlang

주어진 문자열로 시작하는 버전으로 필터링합니다.

shell
asdf list all <name> <version>
+# asdf list all erlang 17

최신 안정 버전 보기

shell
asdf latest <name>
+# asdf latest erlang

주어진 문자열로 시작하는 최신 안정 버전을 보여줍니다.

shell
asdf latest <name> <version>
+# asdf latest erlang 17

현재 버전 설정

shell
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에 작성합니다.

현재 셸 세션에 대해서만, shellASDF_\${TOOL}_VERSION이라는 이름의 환경 변수로 버전을 설정합니다.

local은 해당 버전을 $PWD/.tool-versions에 작성합니다, 존재하지 않을 시에 새로 만듦.

세부 내용은 .tool-versions 설정 섹션에 파일을 참고하세요.

대체수단

현재 셸 세션에 대해서만 버전을 설정하려는 경우 또는 특정 툴 버전 하에 단순히 한개의 명령어만 실행하기 위해, 당신은 ASDF_\${TOOL}_VERSION과 같은 환경 변수를 설정할 수 있습니다.

다음 예시에서는 버전 1.4.0의 Elixir 프로젝트에서 테스트를 수행합니다. 버전 형식은 .tool-versions 파일에서 지원되는 것과 동일하게 지원됩니다.

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

시스템 버전으로의 폴백

asdf 관리 버전이 아닌 <name> 도구의 시스템 버전을 사용하려면 도구의 버전을 system으로 설정할 수 있습니다.

위에 현재 버전 설정 섹션에 나와있는대로, systemglobal, local or shell 중에 하나로 설정하세요.

shell
asdf local <name> system
+# asdf local python system

현재 버전 보기

shell
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

버전 제거

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

Shims

asdf는 패키지를 설치할 때 해당 패키지의 모든 실행 프로그램에 대한 shim들을 $ASDF_DATA_DIR/shims 디렉토리 (기본값은 ~/.asdf/shims)에 생성합니다. 이 디렉토리는 설치된 프로그램들이 이용가능하도록 $PATH (asdf.sh, asdf.fish 등)에 존재합니다.

Shim 자체는 플러그인 이름과 shim이 감싸고 있는 설치된 패키지의 실행파일의 경로를 넘겨주는 asdf exec라는 헬퍼 프로그램을 exec시키는 매우 단순한 wrapper입니다.

asdf exec 헬퍼는 (.tool-version 파일에 지정된 대로, asdf local... 또는 asdf global...에서 선택된 대로) 사용할 패키지의 버전을 결정합니다, (플러그인의 exec-path 콜백에 의해 조정될 수 있음) 패키지 설치 디렉토리의 실행 파일에 대한 최종 경로 및 (플러그인에 의해 제공된 - exec-env 스크립트) 실행할 환경을 결정하고, 최종적으로 이를 실행합니다.

노트

이 시스템은 exec 호출을 사용하기 때문에, 실행 대신 셸에 의해 source 되야하는 패키지의 스크립트는 shim wrapper를 통하지 않고 직접 액세스되야 합니다. 두 가지 asdf 명령어: whichwhere는 설치된 패키지로의 경로를 반환할 수 있습니다:

shell
# 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 shims 우회

어떠한 이유로 asdf의 shim들을 우회하고 싶거나 프로젝트의 디렉토리로 이동했을 때 자동으로 환경 변수를 설정되게 하고 싶으시면 asdf-direnv 플러그인이 도움이 될 것입니다. 상세한 내용은 README를 확인해 주세요.

`,45)]))}const c=i(t,[["render",n]]);export{o as __pageData,c as default}; diff --git a/assets/ko-kr_more_community-projects.md.BGgZzLbH.js b/assets/ko-kr_more_community-projects.md.BGgZzLbH.js new file mode 100644 index 00000000..09942c46 --- /dev/null +++ b/assets/ko-kr_more_community-projects.md.BGgZzLbH.js @@ -0,0 +1 @@ +import{_ as t,c as a,a2 as o,o as r}from"./chunks/framework.BQmytedh.js";const f=JSON.parse('{"title":"커뮤니티 프로젝트","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/more/community-projects.md","filePath":"ko-kr/more/community-projects.md","lastUpdated":1734384735000}'),s={name:"ko-kr/more/community-projects.md"};function c(n,e,i,d,l,m){return r(),a("div",null,e[0]||(e[0]=[o('

커뮤니티 프로젝트

asdf와 관련된 커뮤니티 프로젝트들입니다:

노트

asdf 코어 팀은 이 프로젝트들 혹은 코드를 소유하지 않습니다. asdf 코어는 위의 목록들에 품질과 보안을 책임지지 않습니다.

',4)]))}const u=t(s,[["render",c]]);export{f as __pageData,u as default}; diff --git a/assets/ko-kr_more_community-projects.md.BGgZzLbH.lean.js b/assets/ko-kr_more_community-projects.md.BGgZzLbH.lean.js new file mode 100644 index 00000000..09942c46 --- /dev/null +++ b/assets/ko-kr_more_community-projects.md.BGgZzLbH.lean.js @@ -0,0 +1 @@ +import{_ as t,c as a,a2 as o,o as r}from"./chunks/framework.BQmytedh.js";const f=JSON.parse('{"title":"커뮤니티 프로젝트","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/more/community-projects.md","filePath":"ko-kr/more/community-projects.md","lastUpdated":1734384735000}'),s={name:"ko-kr/more/community-projects.md"};function c(n,e,i,d,l,m){return r(),a("div",null,e[0]||(e[0]=[o('

커뮤니티 프로젝트

asdf와 관련된 커뮤니티 프로젝트들입니다:

노트

asdf 코어 팀은 이 프로젝트들 혹은 코드를 소유하지 않습니다. asdf 코어는 위의 목록들에 품질과 보안을 책임지지 않습니다.

',4)]))}const u=t(s,[["render",c]]);export{f as __pageData,u as default}; diff --git a/assets/ko-kr_more_faq.md.De3gzoXB.js b/assets/ko-kr_more_faq.md.De3gzoXB.js new file mode 100644 index 00000000..d6363961 --- /dev/null +++ b/assets/ko-kr_more_faq.md.De3gzoXB.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as s}from"./chunks/framework.BQmytedh.js";const f=JSON.parse('{"title":"자주 묻는 질문","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/more/faq.md","filePath":"ko-kr/more/faq.md","lastUpdated":1734384735000}'),t={name:"ko-kr/more/faq.md"};function i(d,e,n,c,h,l){return s(),o("div",null,e[0]||(e[0]=[r('

자주 묻는 질문

asdf에 관련된 공통된 질문들입니다.

WSL1을 지원하나요?

WSL1 (Windows Subsystem for Linux 1)는 공식적으로 지원되지 않습니다. 어떤 부분의 asdf의 제대로 동작하지 않을 수 있습니다. 우리는 WSL1의 공식 지원을 추가할 계획이 없습니다.

WSL2을 지원하나요?

WSL2 (Windows Subsystem for Linux 2)는 당신이 선택한 WSL distro를 위한 설치 & dependency 설명서를 따르면 작동합니다.

중요한 것은, WSL2는 오직 현재 작업 디렉토리가 Unix 드라이브 그리고 Windows 드라이브에 종속되어 있지 않을때 정상적으로 동작합니다.

우리는 호스트 runner support가 GitHub Actions에서 사용가능할 때 WSL2에서 테스트 suite를 진행할 계획입니다만, 현재는 아직 이용가능하지 않은 것 같습니다.

새롭게 설치된 실행파일이 동작하지 않나요?

방금 npm install -g yarn, 그러나 yarn을 실행시킬 수 없습니다. 어떻게 해야하나요?

asdfshims를 사용하여 실행파일들을 관리합니다. 플러그인에 의해서 설치되는 실행파일들은 자동적으로 shim이 생성되지만, asdf가 관리하고 있는 툴에 의해서 실행파일이 설치 된 경우는 shim을 생성해야 한다고 하는 것을 asdf에 알려줄 필요가 있습니다. 이러한 경우, Yarn의 shim을 생성하기 위해 asdf reshim 명령어 문서를 참고하세요.

셸이 새롭게 설치된 shims들을 감지하지 못하나요?

만약 asdf reshim가 문제를 해결하지 못한다면, 대부분의 경우 asdf.sh 혹은 asdf.fish sourcing이 당신의 셸 설정 파일 (.bash_profile, .zshrc, config.fish etc) 아래쪽에 있지 않을 가능성이 높습니다. 당신의 $PATH가 설정 된 후에 그리고 사용중인 프레임워크 (oh-my-zsh etc)가 source 된 후에 source 되어야 합니다.

',13)]))}const p=a(t,[["render",i]]);export{f as __pageData,p as default}; diff --git a/assets/ko-kr_more_faq.md.De3gzoXB.lean.js b/assets/ko-kr_more_faq.md.De3gzoXB.lean.js new file mode 100644 index 00000000..d6363961 --- /dev/null +++ b/assets/ko-kr_more_faq.md.De3gzoXB.lean.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as s}from"./chunks/framework.BQmytedh.js";const f=JSON.parse('{"title":"자주 묻는 질문","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/more/faq.md","filePath":"ko-kr/more/faq.md","lastUpdated":1734384735000}'),t={name:"ko-kr/more/faq.md"};function i(d,e,n,c,h,l){return s(),o("div",null,e[0]||(e[0]=[r('

자주 묻는 질문

asdf에 관련된 공통된 질문들입니다.

WSL1을 지원하나요?

WSL1 (Windows Subsystem for Linux 1)는 공식적으로 지원되지 않습니다. 어떤 부분의 asdf의 제대로 동작하지 않을 수 있습니다. 우리는 WSL1의 공식 지원을 추가할 계획이 없습니다.

WSL2을 지원하나요?

WSL2 (Windows Subsystem for Linux 2)는 당신이 선택한 WSL distro를 위한 설치 & dependency 설명서를 따르면 작동합니다.

중요한 것은, WSL2는 오직 현재 작업 디렉토리가 Unix 드라이브 그리고 Windows 드라이브에 종속되어 있지 않을때 정상적으로 동작합니다.

우리는 호스트 runner support가 GitHub Actions에서 사용가능할 때 WSL2에서 테스트 suite를 진행할 계획입니다만, 현재는 아직 이용가능하지 않은 것 같습니다.

새롭게 설치된 실행파일이 동작하지 않나요?

방금 npm install -g yarn, 그러나 yarn을 실행시킬 수 없습니다. 어떻게 해야하나요?

asdfshims를 사용하여 실행파일들을 관리합니다. 플러그인에 의해서 설치되는 실행파일들은 자동적으로 shim이 생성되지만, asdf가 관리하고 있는 툴에 의해서 실행파일이 설치 된 경우는 shim을 생성해야 한다고 하는 것을 asdf에 알려줄 필요가 있습니다. 이러한 경우, Yarn의 shim을 생성하기 위해 asdf reshim 명령어 문서를 참고하세요.

셸이 새롭게 설치된 shims들을 감지하지 못하나요?

만약 asdf reshim가 문제를 해결하지 못한다면, 대부분의 경우 asdf.sh 혹은 asdf.fish sourcing이 당신의 셸 설정 파일 (.bash_profile, .zshrc, config.fish etc) 아래쪽에 있지 않을 가능성이 높습니다. 당신의 $PATH가 설정 된 후에 그리고 사용중인 프레임워크 (oh-my-zsh etc)가 source 된 후에 source 되어야 합니다.

',13)]))}const p=a(t,[["render",i]]);export{f as __pageData,p as default}; diff --git a/assets/ko-kr_more_thanks.md.DLiIYnLr.js b/assets/ko-kr_more_thanks.md.DLiIYnLr.js new file mode 100644 index 00000000..8961cea0 --- /dev/null +++ b/assets/ko-kr_more_thanks.md.DLiIYnLr.js @@ -0,0 +1 @@ +import{_ as a,c as r,a2 as t,o as h}from"./chunks/framework.BQmytedh.js";const u=JSON.parse('{"title":"감사인사","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/more/thanks.md","filePath":"ko-kr/more/thanks.md","lastUpdated":1734384735000}'),o={name:"ko-kr/more/thanks.md"};function s(l,e,i,n,d,c){return h(),r("div",null,e[0]||(e[0]=[t('

감사인사

asdf 저자들 & 기여자들을 위한 감사 페이지!

Credits

나 (@HashNuke), 고열, 감기, 기침.

2014년부터 종료까지의 저작권 (MIT License)

관리자

기여자

GitHub에서 기여자들의 목록를 확인하세요 🙏

',9)]))}const p=a(o,[["render",s]]);export{u as __pageData,p as default}; diff --git a/assets/ko-kr_more_thanks.md.DLiIYnLr.lean.js b/assets/ko-kr_more_thanks.md.DLiIYnLr.lean.js new file mode 100644 index 00000000..8961cea0 --- /dev/null +++ b/assets/ko-kr_more_thanks.md.DLiIYnLr.lean.js @@ -0,0 +1 @@ +import{_ as a,c as r,a2 as t,o as h}from"./chunks/framework.BQmytedh.js";const u=JSON.parse('{"title":"감사인사","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/more/thanks.md","filePath":"ko-kr/more/thanks.md","lastUpdated":1734384735000}'),o={name:"ko-kr/more/thanks.md"};function s(l,e,i,n,d,c){return h(),r("div",null,e[0]||(e[0]=[t('

감사인사

asdf 저자들 & 기여자들을 위한 감사 페이지!

Credits

나 (@HashNuke), 고열, 감기, 기침.

2014년부터 종료까지의 저작권 (MIT License)

관리자

기여자

GitHub에서 기여자들의 목록를 확인하세요 🙏

',9)]))}const p=a(o,[["render",s]]);export{u as __pageData,p as default}; diff --git a/assets/ko-kr_plugins_create.md.CGqR6Egc.js b/assets/ko-kr_plugins_create.md.CGqR6Egc.js new file mode 100644 index 00000000..3c3e7c82 --- /dev/null +++ b/assets/ko-kr_plugins_create.md.CGqR6Egc.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.BQmytedh.js";const x=JSON.parse('{"title":"플러그인 생성하기","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/plugins/create.md","filePath":"ko-kr/plugins/create.md","lastUpdated":1734384735000}'),h={name:"ko-kr/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에 의해 특정 명령어들을 받아 asdf list-all <name>, asdf install <name> <version> 등의 지원을 위해 실행됩니다.

빠른 시작

자체 플러그인을 만드는 것을 시작하는 두 가지 옵션이 있습니다:

  1. asdf-vm/asdf-plugin-template 리포지토리 사용해서 기본 스크립트가 구현된 (asdf-<tool_name> 이름으로) 플러그인 리포지토리 생성하기. 리포지토리가 생성되면, 그 리포지토리를 clone하고 템플릿을 유기적으로 업데이트하여 setup.bash 스크립트를 실행합니다.
  2. asdf-<tool_name>로 이룸 붙인 리포지토리를 시작하고 아래 문서에 필수 스크립트들을 구현하세요.

플리그인 스크립트들을 위한 황금률

  • 스크립트는 다른 asdf 명령어를 호출하면 안됩니다.
  • 셸 툴/명령어의 dependency를 최소로 유지하세요.
  • non-portable 툴이나 명령어 플래그의 사용을 피하세요. 예를 들어, sort -V. asdf core를 참고하세요 금지된 명령어 목록

스크립트 개요

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"}},"운영 체제별 dependencies 목록 출력")],-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"}},"바이너리 실행을 위한 환경 준비")],-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"}},[a("레거시 버전 파일의 이름 출력: "),i("code",null,".ruby-version")])],-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"}},"레거시 버전 파일들을 위한 맞춤 parser")],-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_TYPEversion 또는 ref
ASDF_INSTALL_VERSIONASDF_INSTALL_TYPE에 따른 풀 버전 번호 또는 Git Ref
ASDF_INSTALL_PATH툴이 설치 되어야하는 혹은 되어있는 경로
ASDF_CONCURRENCY소스 코드를 컴파일할 때 사용할 코어 수. make-j를 설정할 때 유용
ASDF_DOWNLOAD_PATHbin/download에 의해 소스 코드 또는 바이너리가 다운로드 된 경로
ASDF_PLUGIN_PATH플러그인이 설치된 경로
ASDF_PLUGIN_SOURCE_URL플러그인의 소스 URL
ASDF_PLUGIN_PREV_REF플러그인 리포지토리의 이전 git-ref
ASDF_PLUGIN_POST_REF플러그인 리포지토리의 업데이트 된 git-ref
ASDF_CMD_FILEsource 되는 파일의 전체 경로를 해결

노트

모든 스크립트에서 모든 환경 변수를 사용할 수 있는 것은 아닙니다. 아래 각 스크립트에 대한 문서를 확인하여 사용할 수 있는 환경 변수들을 확인하세요.

필수적 스크립트

',6)),i("h3",b,[s[26]||(s[26]=i("code",null,"bin/list-all",-1)),s[27]||(s[27]=a()),l(t,{type:"tip",text:"필수",vertical:"middle"}),s[28]||(s[28]=a()),s[29]||(s[29]=i("a",{class:"header-anchor",href:"#bin-list-all","aria-label":'Permalink to "`bin/list-all` "'},"​",-1))]),s[50]||(s[50]=e('

설명

설치 가능한 모든 버전 나열.

출력 형식

공백으로 구분된 문자열을 반드시 출력. 예를 들어:

txt
1.0.1 1.0.2 1.3.0 1.4

최신 버전이 마지막에 와야 합니다.

asdf core는 각 버전을 각각의 행에 출력하여, 일부 버전을 화면 밖으로 밀어낼 가능성이 있습니다.

정렬

웹사이트의 릴리스 페이지에서 버전을 가져오는 경우에는 이미 올바른 순서로 되어 있는 경우가 많기 때문에 제공된 순서대로 두는 것이 좋습니다. 역순으로 되어 있는 경우 tac을 통해 해당 버전들을 바로 잡는것으로 충분합니다.

정렬이 불가피한 경우, sort -V는 사용이 불가능하므로, 다음 중 하나를 제안합니다:

스크립트에서 사용 가능한 환경 변수

이 스크립트에는 환경 변수가 제공되지 않습니다.

이 스크립트를 호출하는 명령어

  • asdf list all <name> [version]
  • asdf list all nodejs: 이 스크립트에 의해 반환된 모든 버전을 나열합니다, 한 행에 한개씩.
  • asdf list all nodejs 18: 이 스크립트에 의해 반환된 모든 버전을 나열하며, 각 행에 하나씩, 18로 시작하는 모든 버전에 필터가 적용됩니다.

asdf core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}/bin/list-all"

',19)),i("h3",F,[s[30]||(s[30]=i("code",null,"bin/download",-1)),s[31]||(s[31]=a()),l(t,{type:"tip",text:"필수",vertical:"middle"}),s[32]||(s[32]=a()),s[33]||(s[33]=i("a",{class:"header-anchor",href:"#bin-download","aria-label":'Permalink to "`bin/download` "'},"​",-1))]),s[51]||(s[51]=e('

설명

지정된 장소에 지정된 버전에 대한 소스 코드 또는 바이너리 다운로드

구현 세부사항

  • 스크립트는 소스 또는 바이너리를 ASDF_DOWNLOAD_PATH에서 지정된 디렉토리에 다운로드해야합니다.
  • 압축 해제된 소스 코드 또는 바이너리만 ASDF_DOWNLOAD_PATH 디렉토리에 위치해야합니다.
  • 실패 시에는 ASDF_DOLOAD_PATH에 어떠한 파일도 남아서는 안 됩니다.
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.

레거시 플러그인

비록 이 스크립트는 모든 플러그인에서 _필수_로 되어 있지만, 이 스크립트가 도입되기 이전의 "레거시" 플러그인에서는 선택 입니다.

이 스크립트가 없는 경우, asdf는 bin/install 스크립트가 있다고 가정하고 해당 버전을 다운로드 그리고 설치합니다.

레거시 플러그인 지원은 최종적으로 제거될 예정이기 때문에 앞으로 작성할 모든 플러그인에서 이 스크립트를 포함해야합니다.

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • 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_DOWLOAD_PATH 디렉토리에 저장. 그 다음 bin/install 스크립트를 실행.

asdf core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}"/bin/download

',16)),i("h3",E,[s[34]||(s[34]=i("code",null,"bin/install",-1)),s[35]||(s[35]=a()),l(t,{type:"tip",text:"필수",vertical:"middle"}),s[36]||(s[36]=a()),s[37]||(s[37]=i("a",{class:"header-anchor",href:"#bin-install","aria-label":'Permalink to "`bin/install` "'},"​",-1))]),s[52]||(s[52]=e('

설명

특정 버전의 도구를 지정된 위치에 설치.

구현 세부사항

  • 스크립트는 ASDF_INSTALL_PATH 경로에 지정된 버전을 설치해야합니다.
  • Shim은 $ASDF_INSTALL_PATH/bin에 있는 어떠한 파일에 대해서든 기본적으로 생성됩니다. 이 동작은 선택적 bin/list-bin-paths 스크립트로 맞춤 설정 가능합니다.
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.
  • TOCTOU(Time-of-Check-to-Off-Use) 문제를 방지하려면, 툴의 빌드 및 설치가 성공적이라고 판단될때만 스크립트에서 파일을 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 (태그/커밋/브랜치).
  • 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: Node.js 버전 18.0.0ASDF_INSTALL_PATH 디렉토리에 설치.

asdf core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}"/bin/install

선택적 스크립트

',15)),i("h3",y,[s[38]||(s[38]=i("code",null,"bin/latest-stable",-1)),s[39]||(s[39]=a()),l(t,{type:"warning",text:"추천",vertical:"middle"}),s[40]||(s[40]=a()),s[41]||(s[41]=i("a",{class:"header-anchor",href:"#bin-latest-stable","aria-label":'Permalink to "`bin/latest-stable` "'},"​",-1))]),s[53]||(s[53]=e('

설명

도구의 최신 안정 버전을 결정합니다. 이 스크립트가 존재하지 않는 경우, asdf 코어는 bin/list-all의 출력을 비의도적으로 tail합니다.

구현 세부사항

  • 스크립트는 도구의 최신 안정 버전을 표준 출력에 출력해야합니다.
  • 비안정판이나 릴리스 후보판은 제외되어야 합니다.
  • 필터 쿼리는 스크립트의 첫 번째 인수로 제공됩니다 이 쿼리는 버전 번호나 툴 제공자에 의한 출력값을 필터하기 위해 사용되어야 합니다.
    • 예를 들어 ruby 플러그인에서의 asdf list all rubyjruby, 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이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf global <tool> latest: 툴의 글로벌 버전을 해당 툴의 최신 안정 버전으로 설정합니다.
  • asdf local <name> latest: 툴의 로컬 버전을 해당 툴의 최신 안정 버전으로 설정합니다.
  • asdf install <tool> latest: 최신 버전의 툴을 설치합니다.
  • asdf latest <tool> [<version>]: 선택적인 필터를 기반으로 도구의 최신 버전을 출력합니다.
  • asdf latest --all: asdf에서 관리하는 모든 툴의 최신 버전과 설치 여부를 출력합니다.

asdf core에서 호출 시그니처

이 스크립트는 필터 쿼리라는 하나의 인수를 받습니다.

bash
"${plugin_path}"/bin/latest-stable "$query"

bin/help.overview

설명

플러그인 및 관리 중인 툴에 대한 일반적인 설명을 출력.

구현 세부사항

  • 플러그인에 대한 도움말 출력을 표시하려면 이 스크립트가 필요합니다.
  • asdf 코어가 머리말를 인쇄하므로 머리말을 출력해서는 안 됩니다.
  • 자유로운 형식의 텍스트로 출력해도 상관없지만 짧은 한 단락 정도의 설명이 이상적입니다.
  • 핵심이 되는 asdf-vm 문서에서 이미 설명되어 있는 정보는 출력하지 않아야 합니다.
  • 운영 체제와 설치된 툴의 버전에 맞게 출력해야합니다 (필요에 따라 ASDF_INSTALL_VERSIONASDF_INSTALL_TYPE 환경 변수의 값을 사용하십시오).
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf help <name> [<version>]: 플러그인 및 도구 문서를 출력

asdf core에서 호출 시그니처

bash
"${plugin_path}"/bin/help.overview

bin/help.deps

설명

운영 체제에 맞는 dependencies 목록을 출합니다. 한 행마다 한 개의 dependency.

bash
git\ncurl\nsed

구현 세부사항

  • 이 스크립트의 출력되기 위해서는 bin/help.overview가 필요합니다.
  • 운영 체제와 설치된 툴의 버전에 맞게 출력해야합니다 (필요에 따라 ASDF_INSTALL_VERSIONASDF_INSTALL_TYPE 환경 변수의 값을 사용하십시오).
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf help <name> [<version>]: 플러그인 및 도구 문서를 출력

asdf core에서 호출 시그니처

bash
"${plugin_path}"/bin/help.deps

bin/help.config

설명

플러그인 및 도구에 필수적 또는 선택적 설정 출력. 예를 들어, 도구를 설치하거나 컴파일하는 데 필요한 환경 변수나 기타 플래그를 설명.

구현 세부사항

  • 이 스크립트의 출력되기 위해서는 bin/help.overview가 필요합니다.
  • 자유로운 형식의 텍스트로 출력할 수 있습니다.
  • 운영 체제와 설치된 툴의 버전에 맞게 출력해야합니다 (필요에 따라 ASDF_INSTALL_VERSIONASDF_INSTALL_TYPE 환경 변수의 값을 사용하십시오).
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf help <name> [<version>]: 플러그인 및 도구 문서를 출력

asdf core에서 호출 시그니처

bash
"${plugin_path}"/bin/help.config

설명

플러그인 및 툴과 관련된 링크 목록을 출력. 한 행마다 한 개의 링크.

bash
Git Repository:	https://github.com/vlang/v\nDocumentation:	https://vlang.io

구현 세부사항

  • 이 스크립트의 출력되기 위해서는 bin/help.overview가 필요합니다.
  • 한행마다 한 개의 링크.
  • 형식은 다음 중에 하나여야합니다:
    • <title>: <link>
    • 또는 그냥 <link>
  • 운영 체제와 설치된 툴의 버전에 맞게 출력해야합니다 (필요에 따라 ASDF_INSTALL_VERSIONASDF_INSTALL_TYPE 환경 변수의 값을 사용하십시오).
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf help <name> [<version>]: 플러그인 및 도구 문서를 출력

asdf core에서 호출 시그니처

bash
"${plugin_path}"/bin/help.links

bin/list-bin-paths

설명

툴의 특정 버전에서 실행파일이 포함된 디렉토리 목록을 출력.

구현 세부사항

  • 이 스크립트가 존재하지 않는 경우, asdf는 "${ASDF_INSTALL_PATH}"/bin 디렉토리 내에 있는 바이너리들을 찾아 그 바이너리를 위한 shim들을 생성합니다.
  • 실행파일이 포함된 디렉토리의 경로를 공백으로 구분하여 출력합니다.
  • 경로는 ASDF_INSTALL_PATH로의 상대 경로이어야 합니다. 출력 예시는 다음과 같습니다:
bash
bin tools veggies

이는 asdf가 그 파일들을 위한 shim들을 다음 위치에 생성하게 지시합니다:

  • "${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 (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf install <tool> [version]: 초기에 바이너리들을 위한 shim들 생성.
  • asdf reshim <tool> <version>: 바이너리들을 위한 shim들 재생성.

asdf core에서 호출 시그니처

bash
"${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 (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf which <command>: 실행파일의 경로 표시
  • asdf exec <command> [args...]: 현재 버전에서 shim 명령을 실행
  • asdf env <command> [util]: shim 명령어 실행 시 사용되는 환경에서 유틸리티(기본값: env)를 실행.

asdf core에서 호출 시그니처

bash
"${plugin_path}/bin/exec-env"

bin/exec-path

툴의 특정 버전의 실행파일 경로를 가져옵니다. 실행파일에 대한 상대 경로를 문자열로 출력해야합니다. 이는 플러그인이 shim에서 지정한 실행파일 경로를 조건부로 덮어쓰게 하거나, 그렇지 않으면 shim에서 지정한 기본 경로를 반환합니다.

설명

툴의 특정 버전의 실행파일 경로를 가져옵니다.

구현 세부사항

  • 실행파일에 대한 상대 경로를 문자열로 출력.
  • Shim에서 지정한 실행파일 경로를 조건부로 덮어쓰거나, 그렇지 않으면 shim에서 지정한 기본 경로를 반환.
shell
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 (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf which <command>: 실행파일의 경로 표시
  • asdf exec <command> [args...]: 현재 버전에서 shim 명령을 실행
  • asdf env <command> [util]: shim 명령어 실행 시 사용되는 환경에서 유틸리티(기본값: env)를 실행.

asdf core에서 호출 시그니처

bash
"${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 core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}/bin/uninstall"

bin/list-legacy-filenames

설명

툴 버전을 결정하는 데 사용된 레거시 설정 파일 목록을 출력.

구현 세부사항

  • 파일이름들의 목록을 공백으로 구분하여 출력.
    bash
    .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 (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

툴 버전을 가져오는 모든 명령에서 호출됩니다.

asdf core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}/bin/list-legacy-filenames"

bin/parse-legacy-file

설명

asdf에 의해 발견된 레거시 파일을 parse하여 툴의 버전을 결정. 자바스크립트의 package.json이나 Go 언어의 go.mod와 같은 파일에서 버전 번호를 추출하는 데 유용.

구현 세부사항

  • 이 스크립트가 존재하지 않는 경우, asdf는 단순히 레거시 파일을 cat하여 버전을 결정합니다.
  • 다음과 같은 상황에서도 결정론적이고 항상 동일하고 정확한 버전을 반환해야합니다:
    • 동일한 레거시 파일을 구문 parsing할 때.
    • 무엇이 설치되어 있는지 또는 레거시 버전이 유효하거나 완전한지는 관계 없이. 일부 레거시 파일 형식은 맞지 않을 수도 있습니다.
  • 아래와 같이 버전 번호를 한 줄로 출력해 주세요:
    bash
    1.2.3

스크립트에서 사용 가능한 환경 변수

이 스크립트가 호출되기 전에 환경 변수가 설정되지 않습니다.

이 스크립트를 호출하는 명령어

툴 버전을 가져오는 모든 명령에서 호출됩니다.

asdf core에서 호출 시그니처

이 스크립트는 레거시 파일의 내용을 읽기 위해 레거시 파일의 경로라는 하나의 인수를 받습니다.

bash
"${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 core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}/bin/post-plugin-add"

bin/post-plugin-update

설명

이 콜백 스크립트는 asdf가 asdf plugin update <tool> [<git-ref>] 커맨드로 플러그인 업데이트 를 다운로드한 후에 실행됩니다.

관련된 명령어 훅들을 참조하세요:

  • pre_asdf_plugin_update
  • pre_asdf_plugin_update_${plugin_name}
  • post_asdf_plugin_update
  • post_asdf_plugin_update_${plugin_name}

스크립트에서 사용 가능한 환경 변수

  • ASDF_PLUGIN_PATH: 플러그인이 설치된 경로.
  • ASDF_PLUGIN_PREV_REF: 플러그인의 이전 git-ref
  • ASDF_PLUGIN_POST_REF: 플러그인의 업데이트 된 git-ref

asdf core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${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 core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}/bin/pre-plugin-remove"
',172)),i("h2",m,[s[42]||(s[42]=a("asdf CLI 확장 명령어 ")),l(t,{type:"danger",text:"고급",vertical:"middle"}),s[43]||(s[43]=a()),s[44]||(s[44]=i("a",{class:"header-anchor",href:"#asdf-cli-확장-명령어","aria-label":'Permalink to "asdf CLI 확장 명령어 "'},"​",-1))]),s[54]||(s[54]=e('

lib/commands/command*.bash 스크립트 또는 플러그인 이름을 하위명령어로 사용하여 asdf 명령줄 인터페이스를 통해 호출할 수 있는 실행파일을 제공함으로써 새로운 asdf 명령어를 정의할 수 있습니다.

예를 들면, foo라고 하는 플러그인이 있다고 하면:

shell
foo/\n  lib/commands/\n    command.bash\n    command-bat.bash\n    command-bat-man.bash\n    command-help.bash

사용자는 아래 명령을 실행할 수 있게 됩니다:

shell
$ 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는 source 되는 파일의 전체 경로를 해결합니다.

haxe는 이 기능을 사용하는 플러그인의 좋은 예시입니다. 이 플러그인은 Haxe 실행파일이 해당 디렉토리에서 상대적으로 동적 라이브러리를 찾으려하는 문제해결을 위해 asdf haxe neko-dylibs-link를 제공합니다.

플러그인 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 템플릿 "'},"​",-1))]),s[55]||(s[55]=e(`

경고

반드시 필요한 경우에만 사용하세요.

asdf에서는 맞춤 shim 템플릿을 사용할 수 있습니다. foo라고 하는 실행파일에 대해, 플러그인 내에 shims/foo 파일이 존재하면, asdf는 표준 shim 템플릿을 사용하는 대신 그 파일을 복사합니다.

이 기능은 현명하게 사용해야합니다.

asdf 코어팀이 파악하고 있는 것은, 이 기능은 오직 공식 플러그인 Elixir 플러그인에서만 사용되고 있습니다. 이는 실행파일은 실행파일일 뿐만 아니라 Elixir 파일로도 읽히기 때문입니다. 이 때문에 표준 Bash shim을 사용할 수 없습니다.

테스팅

asdf에는 플러그인을 테스트하기 위한 plugin-test 명령어가 포함되어 있습니다:

shell
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 플러그인을 테스트하기 위해, 다음을 실행시킬 수 있습니다
    shell
    # asdf plugin test <plugin_name>  <plugin_url>                               [test_command]
    +  asdf plugin test nodejs         https://github.com/asdf-vm/asdf-nodejs.git node --version

노트

리눅스와 맥 운영체제 양쪽 CI 환경에서 모두 테스트하는 것을 권장합니다.

GitHub Action

asdf-vm/actions 리포지토리는 GitHub에서 호스팅되는 플러그인을 테스트하기 위한 GitHub Action을 제공합니다. .github/workflows/test.yaml 액션 워크플로우 예시:

yaml
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"

TravisCI 설정

.travis.yml 예시 파일, 필요에 따라 바꿔 사용하세요:

yaml
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를 사용하는 경우, 플러그인 위치에 대한 상대 경로를 전달할 필요가 있는 경우가 있습니다:

shell
asdf plugin test <tool_name> <path> '<tool_command> --version'

API 속도 제한

bin/list-all이나 bin/latest-stable과 같이 명령어가 외부 API에 대한 접근에 의존하고 있는 경우, 자동화 테스트 중에 속도 제한이 발생할 수 있습니다. 이를 줄이기 위해, 환경 변수를 통해 인증 토큰을 제공하는 코드 경로가 있는지 확인하십시오. 예를 들어:

shell
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 pipeline 환경 변수에 추가하십시오.

경고

절대 인증 토큰을 코드 리포지토리에 공개해서는 안됩니다.

플러그인 Shortname 인덱스

TIP

권장되는 플러그인 설치 방법은 URL을 바탕으로 직접 설치입니다:

shell
# asdf plugin add <name> <git_url>
+  asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

git_url이 지정되지 않은 경우, asdf는 사용될 git_url을 정확히 결정하기 위해 Shortname 인덱스 리포지토리를 사용합니다.

Shortname 인덱스에 설명서에 따라 플러그인을 해당 리포지토리에 추가할 수 있습니다.

`,27))])}const B=n(h,[["render",v]]);export{x as __pageData,B as default}; diff --git a/assets/ko-kr_plugins_create.md.CGqR6Egc.lean.js b/assets/ko-kr_plugins_create.md.CGqR6Egc.lean.js new file mode 100644 index 00000000..3c3e7c82 --- /dev/null +++ b/assets/ko-kr_plugins_create.md.CGqR6Egc.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.BQmytedh.js";const x=JSON.parse('{"title":"플러그인 생성하기","description":"","frontmatter":{},"headers":[],"relativePath":"ko-kr/plugins/create.md","filePath":"ko-kr/plugins/create.md","lastUpdated":1734384735000}'),h={name:"ko-kr/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에 의해 특정 명령어들을 받아 asdf list-all <name>, asdf install <name> <version> 등의 지원을 위해 실행됩니다.

빠른 시작

자체 플러그인을 만드는 것을 시작하는 두 가지 옵션이 있습니다:

  1. asdf-vm/asdf-plugin-template 리포지토리 사용해서 기본 스크립트가 구현된 (asdf-<tool_name> 이름으로) 플러그인 리포지토리 생성하기. 리포지토리가 생성되면, 그 리포지토리를 clone하고 템플릿을 유기적으로 업데이트하여 setup.bash 스크립트를 실행합니다.
  2. asdf-<tool_name>로 이룸 붙인 리포지토리를 시작하고 아래 문서에 필수 스크립트들을 구현하세요.

플리그인 스크립트들을 위한 황금률

  • 스크립트는 다른 asdf 명령어를 호출하면 안됩니다.
  • 셸 툴/명령어의 dependency를 최소로 유지하세요.
  • non-portable 툴이나 명령어 플래그의 사용을 피하세요. 예를 들어, sort -V. asdf core를 참고하세요 금지된 명령어 목록

스크립트 개요

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"}},"운영 체제별 dependencies 목록 출력")],-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"}},"바이너리 실행을 위한 환경 준비")],-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"}},[a("레거시 버전 파일의 이름 출력: "),i("code",null,".ruby-version")])],-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"}},"레거시 버전 파일들을 위한 맞춤 parser")],-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_TYPEversion 또는 ref
ASDF_INSTALL_VERSIONASDF_INSTALL_TYPE에 따른 풀 버전 번호 또는 Git Ref
ASDF_INSTALL_PATH툴이 설치 되어야하는 혹은 되어있는 경로
ASDF_CONCURRENCY소스 코드를 컴파일할 때 사용할 코어 수. make-j를 설정할 때 유용
ASDF_DOWNLOAD_PATHbin/download에 의해 소스 코드 또는 바이너리가 다운로드 된 경로
ASDF_PLUGIN_PATH플러그인이 설치된 경로
ASDF_PLUGIN_SOURCE_URL플러그인의 소스 URL
ASDF_PLUGIN_PREV_REF플러그인 리포지토리의 이전 git-ref
ASDF_PLUGIN_POST_REF플러그인 리포지토리의 업데이트 된 git-ref
ASDF_CMD_FILEsource 되는 파일의 전체 경로를 해결

노트

모든 스크립트에서 모든 환경 변수를 사용할 수 있는 것은 아닙니다. 아래 각 스크립트에 대한 문서를 확인하여 사용할 수 있는 환경 변수들을 확인하세요.

필수적 스크립트

',6)),i("h3",b,[s[26]||(s[26]=i("code",null,"bin/list-all",-1)),s[27]||(s[27]=a()),l(t,{type:"tip",text:"필수",vertical:"middle"}),s[28]||(s[28]=a()),s[29]||(s[29]=i("a",{class:"header-anchor",href:"#bin-list-all","aria-label":'Permalink to "`bin/list-all` "'},"​",-1))]),s[50]||(s[50]=e('

설명

설치 가능한 모든 버전 나열.

출력 형식

공백으로 구분된 문자열을 반드시 출력. 예를 들어:

txt
1.0.1 1.0.2 1.3.0 1.4

최신 버전이 마지막에 와야 합니다.

asdf core는 각 버전을 각각의 행에 출력하여, 일부 버전을 화면 밖으로 밀어낼 가능성이 있습니다.

정렬

웹사이트의 릴리스 페이지에서 버전을 가져오는 경우에는 이미 올바른 순서로 되어 있는 경우가 많기 때문에 제공된 순서대로 두는 것이 좋습니다. 역순으로 되어 있는 경우 tac을 통해 해당 버전들을 바로 잡는것으로 충분합니다.

정렬이 불가피한 경우, sort -V는 사용이 불가능하므로, 다음 중 하나를 제안합니다:

스크립트에서 사용 가능한 환경 변수

이 스크립트에는 환경 변수가 제공되지 않습니다.

이 스크립트를 호출하는 명령어

  • asdf list all <name> [version]
  • asdf list all nodejs: 이 스크립트에 의해 반환된 모든 버전을 나열합니다, 한 행에 한개씩.
  • asdf list all nodejs 18: 이 스크립트에 의해 반환된 모든 버전을 나열하며, 각 행에 하나씩, 18로 시작하는 모든 버전에 필터가 적용됩니다.

asdf core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}/bin/list-all"

',19)),i("h3",F,[s[30]||(s[30]=i("code",null,"bin/download",-1)),s[31]||(s[31]=a()),l(t,{type:"tip",text:"필수",vertical:"middle"}),s[32]||(s[32]=a()),s[33]||(s[33]=i("a",{class:"header-anchor",href:"#bin-download","aria-label":'Permalink to "`bin/download` "'},"​",-1))]),s[51]||(s[51]=e('

설명

지정된 장소에 지정된 버전에 대한 소스 코드 또는 바이너리 다운로드

구현 세부사항

  • 스크립트는 소스 또는 바이너리를 ASDF_DOWNLOAD_PATH에서 지정된 디렉토리에 다운로드해야합니다.
  • 압축 해제된 소스 코드 또는 바이너리만 ASDF_DOWNLOAD_PATH 디렉토리에 위치해야합니다.
  • 실패 시에는 ASDF_DOLOAD_PATH에 어떠한 파일도 남아서는 안 됩니다.
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.

레거시 플러그인

비록 이 스크립트는 모든 플러그인에서 _필수_로 되어 있지만, 이 스크립트가 도입되기 이전의 "레거시" 플러그인에서는 선택 입니다.

이 스크립트가 없는 경우, asdf는 bin/install 스크립트가 있다고 가정하고 해당 버전을 다운로드 그리고 설치합니다.

레거시 플러그인 지원은 최종적으로 제거될 예정이기 때문에 앞으로 작성할 모든 플러그인에서 이 스크립트를 포함해야합니다.

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • 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_DOWLOAD_PATH 디렉토리에 저장. 그 다음 bin/install 스크립트를 실행.

asdf core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}"/bin/download

',16)),i("h3",E,[s[34]||(s[34]=i("code",null,"bin/install",-1)),s[35]||(s[35]=a()),l(t,{type:"tip",text:"필수",vertical:"middle"}),s[36]||(s[36]=a()),s[37]||(s[37]=i("a",{class:"header-anchor",href:"#bin-install","aria-label":'Permalink to "`bin/install` "'},"​",-1))]),s[52]||(s[52]=e('

설명

특정 버전의 도구를 지정된 위치에 설치.

구현 세부사항

  • 스크립트는 ASDF_INSTALL_PATH 경로에 지정된 버전을 설치해야합니다.
  • Shim은 $ASDF_INSTALL_PATH/bin에 있는 어떠한 파일에 대해서든 기본적으로 생성됩니다. 이 동작은 선택적 bin/list-bin-paths 스크립트로 맞춤 설정 가능합니다.
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.
  • TOCTOU(Time-of-Check-to-Off-Use) 문제를 방지하려면, 툴의 빌드 및 설치가 성공적이라고 판단될때만 스크립트에서 파일을 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 (태그/커밋/브랜치).
  • 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: Node.js 버전 18.0.0ASDF_INSTALL_PATH 디렉토리에 설치.

asdf core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}"/bin/install

선택적 스크립트

',15)),i("h3",y,[s[38]||(s[38]=i("code",null,"bin/latest-stable",-1)),s[39]||(s[39]=a()),l(t,{type:"warning",text:"추천",vertical:"middle"}),s[40]||(s[40]=a()),s[41]||(s[41]=i("a",{class:"header-anchor",href:"#bin-latest-stable","aria-label":'Permalink to "`bin/latest-stable` "'},"​",-1))]),s[53]||(s[53]=e('

설명

도구의 최신 안정 버전을 결정합니다. 이 스크립트가 존재하지 않는 경우, asdf 코어는 bin/list-all의 출력을 비의도적으로 tail합니다.

구현 세부사항

  • 스크립트는 도구의 최신 안정 버전을 표준 출력에 출력해야합니다.
  • 비안정판이나 릴리스 후보판은 제외되어야 합니다.
  • 필터 쿼리는 스크립트의 첫 번째 인수로 제공됩니다 이 쿼리는 버전 번호나 툴 제공자에 의한 출력값을 필터하기 위해 사용되어야 합니다.
    • 예를 들어 ruby 플러그인에서의 asdf list all rubyjruby, 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이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf global <tool> latest: 툴의 글로벌 버전을 해당 툴의 최신 안정 버전으로 설정합니다.
  • asdf local <name> latest: 툴의 로컬 버전을 해당 툴의 최신 안정 버전으로 설정합니다.
  • asdf install <tool> latest: 최신 버전의 툴을 설치합니다.
  • asdf latest <tool> [<version>]: 선택적인 필터를 기반으로 도구의 최신 버전을 출력합니다.
  • asdf latest --all: asdf에서 관리하는 모든 툴의 최신 버전과 설치 여부를 출력합니다.

asdf core에서 호출 시그니처

이 스크립트는 필터 쿼리라는 하나의 인수를 받습니다.

bash
"${plugin_path}"/bin/latest-stable "$query"

bin/help.overview

설명

플러그인 및 관리 중인 툴에 대한 일반적인 설명을 출력.

구현 세부사항

  • 플러그인에 대한 도움말 출력을 표시하려면 이 스크립트가 필요합니다.
  • asdf 코어가 머리말를 인쇄하므로 머리말을 출력해서는 안 됩니다.
  • 자유로운 형식의 텍스트로 출력해도 상관없지만 짧은 한 단락 정도의 설명이 이상적입니다.
  • 핵심이 되는 asdf-vm 문서에서 이미 설명되어 있는 정보는 출력하지 않아야 합니다.
  • 운영 체제와 설치된 툴의 버전에 맞게 출력해야합니다 (필요에 따라 ASDF_INSTALL_VERSIONASDF_INSTALL_TYPE 환경 변수의 값을 사용하십시오).
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf help <name> [<version>]: 플러그인 및 도구 문서를 출력

asdf core에서 호출 시그니처

bash
"${plugin_path}"/bin/help.overview

bin/help.deps

설명

운영 체제에 맞는 dependencies 목록을 출합니다. 한 행마다 한 개의 dependency.

bash
git\ncurl\nsed

구현 세부사항

  • 이 스크립트의 출력되기 위해서는 bin/help.overview가 필요합니다.
  • 운영 체제와 설치된 툴의 버전에 맞게 출력해야합니다 (필요에 따라 ASDF_INSTALL_VERSIONASDF_INSTALL_TYPE 환경 변수의 값을 사용하십시오).
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf help <name> [<version>]: 플러그인 및 도구 문서를 출력

asdf core에서 호출 시그니처

bash
"${plugin_path}"/bin/help.deps

bin/help.config

설명

플러그인 및 도구에 필수적 또는 선택적 설정 출력. 예를 들어, 도구를 설치하거나 컴파일하는 데 필요한 환경 변수나 기타 플래그를 설명.

구현 세부사항

  • 이 스크립트의 출력되기 위해서는 bin/help.overview가 필요합니다.
  • 자유로운 형식의 텍스트로 출력할 수 있습니다.
  • 운영 체제와 설치된 툴의 버전에 맞게 출력해야합니다 (필요에 따라 ASDF_INSTALL_VERSIONASDF_INSTALL_TYPE 환경 변수의 값을 사용하십시오).
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf help <name> [<version>]: 플러그인 및 도구 문서를 출력

asdf core에서 호출 시그니처

bash
"${plugin_path}"/bin/help.config

설명

플러그인 및 툴과 관련된 링크 목록을 출력. 한 행마다 한 개의 링크.

bash
Git Repository:	https://github.com/vlang/v\nDocumentation:	https://vlang.io

구현 세부사항

  • 이 스크립트의 출력되기 위해서는 bin/help.overview가 필요합니다.
  • 한행마다 한 개의 링크.
  • 형식은 다음 중에 하나여야합니다:
    • <title>: <link>
    • 또는 그냥 <link>
  • 운영 체제와 설치된 툴의 버전에 맞게 출력해야합니다 (필요에 따라 ASDF_INSTALL_VERSIONASDF_INSTALL_TYPE 환경 변수의 값을 사용하십시오).
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf help <name> [<version>]: 플러그인 및 도구 문서를 출력

asdf core에서 호출 시그니처

bash
"${plugin_path}"/bin/help.links

bin/list-bin-paths

설명

툴의 특정 버전에서 실행파일이 포함된 디렉토리 목록을 출력.

구현 세부사항

  • 이 스크립트가 존재하지 않는 경우, asdf는 "${ASDF_INSTALL_PATH}"/bin 디렉토리 내에 있는 바이너리들을 찾아 그 바이너리를 위한 shim들을 생성합니다.
  • 실행파일이 포함된 디렉토리의 경로를 공백으로 구분하여 출력합니다.
  • 경로는 ASDF_INSTALL_PATH로의 상대 경로이어야 합니다. 출력 예시는 다음과 같습니다:
bash
bin tools veggies

이는 asdf가 그 파일들을 위한 shim들을 다음 위치에 생성하게 지시합니다:

  • "${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 (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf install <tool> [version]: 초기에 바이너리들을 위한 shim들 생성.
  • asdf reshim <tool> <version>: 바이너리들을 위한 shim들 재생성.

asdf core에서 호출 시그니처

bash
"${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 (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf which <command>: 실행파일의 경로 표시
  • asdf exec <command> [args...]: 현재 버전에서 shim 명령을 실행
  • asdf env <command> [util]: shim 명령어 실행 시 사용되는 환경에서 유틸리티(기본값: env)를 실행.

asdf core에서 호출 시그니처

bash
"${plugin_path}/bin/exec-env"

bin/exec-path

툴의 특정 버전의 실행파일 경로를 가져옵니다. 실행파일에 대한 상대 경로를 문자열로 출력해야합니다. 이는 플러그인이 shim에서 지정한 실행파일 경로를 조건부로 덮어쓰게 하거나, 그렇지 않으면 shim에서 지정한 기본 경로를 반환합니다.

설명

툴의 특정 버전의 실행파일 경로를 가져옵니다.

구현 세부사항

  • 실행파일에 대한 상대 경로를 문자열로 출력.
  • Shim에서 지정한 실행파일 경로를 조건부로 덮어쓰거나, 그렇지 않으면 shim에서 지정한 기본 경로를 반환.
shell
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 (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf which <command>: 실행파일의 경로 표시
  • asdf exec <command> [args...]: 현재 버전에서 shim 명령을 실행
  • asdf env <command> [util]: shim 명령어 실행 시 사용되는 환경에서 유틸리티(기본값: env)를 실행.

asdf core에서 호출 시그니처

bash
"${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 core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}/bin/uninstall"

bin/list-legacy-filenames

설명

툴 버전을 결정하는 데 사용된 레거시 설정 파일 목록을 출력.

구현 세부사항

  • 파일이름들의 목록을 공백으로 구분하여 출력.
    bash
    .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 (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

툴 버전을 가져오는 모든 명령에서 호출됩니다.

asdf core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}/bin/list-legacy-filenames"

bin/parse-legacy-file

설명

asdf에 의해 발견된 레거시 파일을 parse하여 툴의 버전을 결정. 자바스크립트의 package.json이나 Go 언어의 go.mod와 같은 파일에서 버전 번호를 추출하는 데 유용.

구현 세부사항

  • 이 스크립트가 존재하지 않는 경우, asdf는 단순히 레거시 파일을 cat하여 버전을 결정합니다.
  • 다음과 같은 상황에서도 결정론적이고 항상 동일하고 정확한 버전을 반환해야합니다:
    • 동일한 레거시 파일을 구문 parsing할 때.
    • 무엇이 설치되어 있는지 또는 레거시 버전이 유효하거나 완전한지는 관계 없이. 일부 레거시 파일 형식은 맞지 않을 수도 있습니다.
  • 아래와 같이 버전 번호를 한 줄로 출력해 주세요:
    bash
    1.2.3

스크립트에서 사용 가능한 환경 변수

이 스크립트가 호출되기 전에 환경 변수가 설정되지 않습니다.

이 스크립트를 호출하는 명령어

툴 버전을 가져오는 모든 명령에서 호출됩니다.

asdf core에서 호출 시그니처

이 스크립트는 레거시 파일의 내용을 읽기 위해 레거시 파일의 경로라는 하나의 인수를 받습니다.

bash
"${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 core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}/bin/post-plugin-add"

bin/post-plugin-update

설명

이 콜백 스크립트는 asdf가 asdf plugin update <tool> [<git-ref>] 커맨드로 플러그인 업데이트 를 다운로드한 후에 실행됩니다.

관련된 명령어 훅들을 참조하세요:

  • pre_asdf_plugin_update
  • pre_asdf_plugin_update_${plugin_name}
  • post_asdf_plugin_update
  • post_asdf_plugin_update_${plugin_name}

스크립트에서 사용 가능한 환경 변수

  • ASDF_PLUGIN_PATH: 플러그인이 설치된 경로.
  • ASDF_PLUGIN_PREV_REF: 플러그인의 이전 git-ref
  • ASDF_PLUGIN_POST_REF: 플러그인의 업데이트 된 git-ref

asdf core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${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 core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}/bin/pre-plugin-remove"
',172)),i("h2",m,[s[42]||(s[42]=a("asdf CLI 확장 명령어 ")),l(t,{type:"danger",text:"고급",vertical:"middle"}),s[43]||(s[43]=a()),s[44]||(s[44]=i("a",{class:"header-anchor",href:"#asdf-cli-확장-명령어","aria-label":'Permalink to "asdf CLI 확장 명령어 "'},"​",-1))]),s[54]||(s[54]=e('

lib/commands/command*.bash 스크립트 또는 플러그인 이름을 하위명령어로 사용하여 asdf 명령줄 인터페이스를 통해 호출할 수 있는 실행파일을 제공함으로써 새로운 asdf 명령어를 정의할 수 있습니다.

예를 들면, foo라고 하는 플러그인이 있다고 하면:

shell
foo/\n  lib/commands/\n    command.bash\n    command-bat.bash\n    command-bat-man.bash\n    command-help.bash

사용자는 아래 명령을 실행할 수 있게 됩니다:

shell
$ 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는 source 되는 파일의 전체 경로를 해결합니다.

haxe는 이 기능을 사용하는 플러그인의 좋은 예시입니다. 이 플러그인은 Haxe 실행파일이 해당 디렉토리에서 상대적으로 동적 라이브러리를 찾으려하는 문제해결을 위해 asdf haxe neko-dylibs-link를 제공합니다.

플러그인 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 템플릿 "'},"​",-1))]),s[55]||(s[55]=e(`

경고

반드시 필요한 경우에만 사용하세요.

asdf에서는 맞춤 shim 템플릿을 사용할 수 있습니다. foo라고 하는 실행파일에 대해, 플러그인 내에 shims/foo 파일이 존재하면, asdf는 표준 shim 템플릿을 사용하는 대신 그 파일을 복사합니다.

이 기능은 현명하게 사용해야합니다.

asdf 코어팀이 파악하고 있는 것은, 이 기능은 오직 공식 플러그인 Elixir 플러그인에서만 사용되고 있습니다. 이는 실행파일은 실행파일일 뿐만 아니라 Elixir 파일로도 읽히기 때문입니다. 이 때문에 표준 Bash shim을 사용할 수 없습니다.

테스팅

asdf에는 플러그인을 테스트하기 위한 plugin-test 명령어가 포함되어 있습니다:

shell
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 플러그인을 테스트하기 위해, 다음을 실행시킬 수 있습니다
    shell
    # asdf plugin test <plugin_name>  <plugin_url>                               [test_command]
    +  asdf plugin test nodejs         https://github.com/asdf-vm/asdf-nodejs.git node --version

노트

리눅스와 맥 운영체제 양쪽 CI 환경에서 모두 테스트하는 것을 권장합니다.

GitHub Action

asdf-vm/actions 리포지토리는 GitHub에서 호스팅되는 플러그인을 테스트하기 위한 GitHub Action을 제공합니다. .github/workflows/test.yaml 액션 워크플로우 예시:

yaml
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"

TravisCI 설정

.travis.yml 예시 파일, 필요에 따라 바꿔 사용하세요:

yaml
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를 사용하는 경우, 플러그인 위치에 대한 상대 경로를 전달할 필요가 있는 경우가 있습니다:

shell
asdf plugin test <tool_name> <path> '<tool_command> --version'

API 속도 제한

bin/list-all이나 bin/latest-stable과 같이 명령어가 외부 API에 대한 접근에 의존하고 있는 경우, 자동화 테스트 중에 속도 제한이 발생할 수 있습니다. 이를 줄이기 위해, 환경 변수를 통해 인증 토큰을 제공하는 코드 경로가 있는지 확인하십시오. 예를 들어:

shell
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 pipeline 환경 변수에 추가하십시오.

경고

절대 인증 토큰을 코드 리포지토리에 공개해서는 안됩니다.

플러그인 Shortname 인덱스

TIP

권장되는 플러그인 설치 방법은 URL을 바탕으로 직접 설치입니다:

shell
# asdf plugin add <name> <git_url>
+  asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

git_url이 지정되지 않은 경우, asdf는 사용될 git_url을 정확히 결정하기 위해 Shortname 인덱스 리포지토리를 사용합니다.

Shortname 인덱스에 설명서에 따라 플러그인을 해당 리포지토리에 추가할 수 있습니다.

`,27))])}const B=n(h,[["render",v]]);export{x as __pageData,B as default}; diff --git a/assets/manage_commands.md.-uGyRGzy.js b/assets/manage_commands.md.-uGyRGzy.js new file mode 100644 index 00000000..5f6c56ee --- /dev/null +++ b/assets/manage_commands.md.-uGyRGzy.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as e,o as l}from"./chunks/framework.BQmytedh.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(`

All Commands

The list of all commands available in asdf. This list is the asdf help command text.

txt
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
`,3)]))}const f=a(p,[["render",t]]);export{m as __pageData,f as default}; diff --git a/assets/manage_commands.md.-uGyRGzy.lean.js b/assets/manage_commands.md.-uGyRGzy.lean.js new file mode 100644 index 00000000..5f6c56ee --- /dev/null +++ b/assets/manage_commands.md.-uGyRGzy.lean.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as e,o as l}from"./chunks/framework.BQmytedh.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(`

All Commands

The list of all commands available in asdf. This list is the asdf help command text.

txt
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
`,3)]))}const f=a(p,[["render",t]]);export{m as __pageData,f as default}; diff --git a/assets/manage_configuration.md.Sdrc4tf7.js b/assets/manage_configuration.md.Sdrc4tf7.js new file mode 100644 index 00000000..2d09cd68 --- /dev/null +++ b/assets/manage_configuration.md.Sdrc4tf7.js @@ -0,0 +1,9 @@ +import{_ as n,c as i,a2 as s,j as e,a as o,G as a,B as d,o as r}from"./chunks/framework.BQmytedh.js";const S=JSON.parse('{"title":"Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"manage/configuration.md","filePath":"manage/configuration.md","lastUpdated":1699489504000}'),c={name:"manage/configuration.md"},u={tabindex:"0"},p={style:{"text-align":"left"}},f={tabindex:"0"},h={style:{"text-align":"left"}},g={tabindex:"0"},m={style:{"text-align":"left"}},y={tabindex:"0"},b={style:{"text-align":"left"}},v={tabindex:"0"},x={style:{"text-align":"left"}};function _(k,t,w,D,E,F){const l=d("Badge");return r(),i("div",null,[t[33]||(t[33]=s(`

Configuration

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 compile
  • path:~/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:

txt
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.

`,22)),e("table",u,[t[4]||(t[4]=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",p,[t[0]||(t[0]=e("code",null,"no",-1)),t[1]||(t[1]=o()),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[2]||(t[2]=e("td",{style:{"text-align":"left"}},[o("Use "),e("code",null,".tool-versions"),o(" to read versions")],-1))]),t[3]||(t[3]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},[o("Use plugin fallback to legacy version files ("),e("code",null,".ruby-version"),o(") if available")])],-1))])]),t[34]||(t[34]=e("h3",{id:"use-release-candidates",tabindex:"-1"},[e("code",null,"use_release_candidates"),o(),e("a",{class:"header-anchor",href:"#use-release-candidates","aria-label":'Permalink to "`use_release_candidates`"'},"​")],-1)),t[35]||(t[35]=e("p",null,[o("Configure the "),e("code",null,"asdf update"),o(" command to upgrade to the latest Release Candidate instead of the latest Semantic Version.")],-1)),e("table",f,[t[9]||(t[9]=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",h,[t[5]||(t[5]=e("code",null,"no",-1)),t[6]||(t[6]=o()),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[7]||(t[7]=e("td",{style:{"text-align":"left"}},"Semantic Version is used",-1))]),t[8]||(t[8]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"Release Candidate is used")],-1))])]),t[36]||(t[36]=e("h3",{id:"always-keep-download",tabindex:"-1"},[e("code",null,"always_keep_download"),o(),e("a",{class:"header-anchor",href:"#always-keep-download","aria-label":'Permalink to "`always_keep_download`"'},"​")],-1)),t[37]||(t[37]=e("p",null,[o("Configure the "),e("code",null,"asdf install"),o(" command to keep or delete the source code or binary it downloads.")],-1)),e("table",g,[t[14]||(t[14]=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",m,[t[10]||(t[10]=e("code",null,"no",-1)),t[11]||(t[11]=o()),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[12]||(t[12]=e("td",{style:{"text-align":"left"}},"Delete source code or binary after successful install",-1))]),t[13]||(t[13]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"Keep source code or binary after install")],-1))])]),t[38]||(t[38]=e("h3",{id:"plugin-repository-last-check-duration",tabindex:"-1"},[e("code",null,"plugin_repository_last_check_duration"),o(),e("a",{class:"header-anchor",href:"#plugin-repository-last-check-duration","aria-label":'Permalink to "`plugin_repository_last_check_duration`"'},"​")],-1)),t[39]||(t[39]=e("p",null,"Configure the duration (in minutes) between asdf plugin repository syncs. Trigger events result in a check of the duration. If more time has elapsed since the last sync than specified in the duration, a new sync occurs.",-1)),e("table",y,[t[27]||(t[27]=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",b,[t[15]||(t[15]=o("integer in range ")),t[16]||(t[16]=e("code",null,"1",-1)),t[17]||(t[17]=o(" to ")),t[18]||(t[18]=e("code",null,"999999999",-1)),t[19]||(t[19]=o()),t[20]||(t[20]=e("br",null,null,-1)),t[21]||(t[21]=o()),t[22]||(t[22]=e("code",null,"60",-1)),t[23]||(t[23]=o(" is ")),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[24]||(t[24]=e("td",{style:{"text-align":"left"}},"Sync on trigger event if duration (in minutes) since last sync has been exceeded",-1))]),t[25]||(t[25]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"0")]),e("td",{style:{"text-align":"left"}},"Sync on each trigger event")],-1)),t[26]||(t[26]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"never")]),e("td",{style:{"text-align":"left"}},"Never sync")],-1))])]),t[40]||(t[40]=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

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.

OptionsDescription
integerNumber of cores to use when compiling the source code
autoCalculate 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.

Plugin Hooks

It is possible to execute custom code:

  • Before or after a plugin is installed, reshimed, updated, or uninstalled
  • Before or after a plugin command is executed

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:

text
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.

Environment Variables

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.

  • If Unset: $HOME/.asdfrc will be used.
  • Usage: 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.

  • If Unset: .tool-versions will be used.
  • Usage: 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.

  • If Unset: the parent directory of the bin/asdf executable is used.
  • Usage: 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.

  • If Unset: $HOME/.asdf if it exists, or else the value of ASDF_DIR
  • Usage: 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.

  • If Unset: the asdf config concurrency value is used.
  • Usage: 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.

  • If Unset: On macOS, defaults to yes; but on other systems, defaults to no
  • If yes: Force asdf directories to the front of the PATH
  • If set to any string other than yes: Do not force asdf directories to the front of the PATH
  • Usage: ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"

Full Configuration Example

Following a simple asdf setup with:

  • a Bash Shell
  • an installation location of $HOME/.asdf
  • installed via Git
  • NO environment variables set
  • NO custom .asdfrc file

would result in the following outcomes:

ConfigurationValueCalculated by
config file location$HOME/.asdfrcASDF_CONFIG_FILE is empty, so use $HOME/.asdfrc
default tool versions filename.tool-versionsASDF_DEFAULT_TOOL_VERSIONS_FILENAME is empty, so use .tool-versions
asdf dir$HOME/.asdfASDF_DIR is empty, so use parent dir of bin/asdf
asdf data dir$HOME/.asdfASDF_DATA_DIR is empty so use $HOME/.asdf as $HOME exists.
concurrencyautoASDF_CONCURRENCY is empty, so rely on concurrency value from the default configuration
legacy_version_filenoNo custom .asdfrc, so use the default configuration
use_release_candidatesnoNo custom .asdfrc, so use the default configuration
always_keep_downloadnoNo custom .asdfrc, so use the default configuration
plugin_repository_last_check_duration60No custom .asdfrc, so use the default configuration
disable_plugin_short_name_repositorynoNo custom .asdfrc, so use the default configuration

Internal 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.
',46))])}const A=n(c,[["render",_]]);export{S as __pageData,A as default}; diff --git a/assets/manage_configuration.md.Sdrc4tf7.lean.js b/assets/manage_configuration.md.Sdrc4tf7.lean.js new file mode 100644 index 00000000..2d09cd68 --- /dev/null +++ b/assets/manage_configuration.md.Sdrc4tf7.lean.js @@ -0,0 +1,9 @@ +import{_ as n,c as i,a2 as s,j as e,a as o,G as a,B as d,o as r}from"./chunks/framework.BQmytedh.js";const S=JSON.parse('{"title":"Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"manage/configuration.md","filePath":"manage/configuration.md","lastUpdated":1699489504000}'),c={name:"manage/configuration.md"},u={tabindex:"0"},p={style:{"text-align":"left"}},f={tabindex:"0"},h={style:{"text-align":"left"}},g={tabindex:"0"},m={style:{"text-align":"left"}},y={tabindex:"0"},b={style:{"text-align":"left"}},v={tabindex:"0"},x={style:{"text-align":"left"}};function _(k,t,w,D,E,F){const l=d("Badge");return r(),i("div",null,[t[33]||(t[33]=s(`

Configuration

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 compile
  • path:~/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:

txt
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.

`,22)),e("table",u,[t[4]||(t[4]=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",p,[t[0]||(t[0]=e("code",null,"no",-1)),t[1]||(t[1]=o()),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[2]||(t[2]=e("td",{style:{"text-align":"left"}},[o("Use "),e("code",null,".tool-versions"),o(" to read versions")],-1))]),t[3]||(t[3]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},[o("Use plugin fallback to legacy version files ("),e("code",null,".ruby-version"),o(") if available")])],-1))])]),t[34]||(t[34]=e("h3",{id:"use-release-candidates",tabindex:"-1"},[e("code",null,"use_release_candidates"),o(),e("a",{class:"header-anchor",href:"#use-release-candidates","aria-label":'Permalink to "`use_release_candidates`"'},"​")],-1)),t[35]||(t[35]=e("p",null,[o("Configure the "),e("code",null,"asdf update"),o(" command to upgrade to the latest Release Candidate instead of the latest Semantic Version.")],-1)),e("table",f,[t[9]||(t[9]=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",h,[t[5]||(t[5]=e("code",null,"no",-1)),t[6]||(t[6]=o()),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[7]||(t[7]=e("td",{style:{"text-align":"left"}},"Semantic Version is used",-1))]),t[8]||(t[8]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"Release Candidate is used")],-1))])]),t[36]||(t[36]=e("h3",{id:"always-keep-download",tabindex:"-1"},[e("code",null,"always_keep_download"),o(),e("a",{class:"header-anchor",href:"#always-keep-download","aria-label":'Permalink to "`always_keep_download`"'},"​")],-1)),t[37]||(t[37]=e("p",null,[o("Configure the "),e("code",null,"asdf install"),o(" command to keep or delete the source code or binary it downloads.")],-1)),e("table",g,[t[14]||(t[14]=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",m,[t[10]||(t[10]=e("code",null,"no",-1)),t[11]||(t[11]=o()),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[12]||(t[12]=e("td",{style:{"text-align":"left"}},"Delete source code or binary after successful install",-1))]),t[13]||(t[13]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"Keep source code or binary after install")],-1))])]),t[38]||(t[38]=e("h3",{id:"plugin-repository-last-check-duration",tabindex:"-1"},[e("code",null,"plugin_repository_last_check_duration"),o(),e("a",{class:"header-anchor",href:"#plugin-repository-last-check-duration","aria-label":'Permalink to "`plugin_repository_last_check_duration`"'},"​")],-1)),t[39]||(t[39]=e("p",null,"Configure the duration (in minutes) between asdf plugin repository syncs. Trigger events result in a check of the duration. If more time has elapsed since the last sync than specified in the duration, a new sync occurs.",-1)),e("table",y,[t[27]||(t[27]=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",b,[t[15]||(t[15]=o("integer in range ")),t[16]||(t[16]=e("code",null,"1",-1)),t[17]||(t[17]=o(" to ")),t[18]||(t[18]=e("code",null,"999999999",-1)),t[19]||(t[19]=o()),t[20]||(t[20]=e("br",null,null,-1)),t[21]||(t[21]=o()),t[22]||(t[22]=e("code",null,"60",-1)),t[23]||(t[23]=o(" is ")),a(l,{type:"tip",text:"default",vertical:"middle"})]),t[24]||(t[24]=e("td",{style:{"text-align":"left"}},"Sync on trigger event if duration (in minutes) since last sync has been exceeded",-1))]),t[25]||(t[25]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"0")]),e("td",{style:{"text-align":"left"}},"Sync on each trigger event")],-1)),t[26]||(t[26]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"never")]),e("td",{style:{"text-align":"left"}},"Never sync")],-1))])]),t[40]||(t[40]=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

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.

OptionsDescription
integerNumber of cores to use when compiling the source code
autoCalculate 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.

Plugin Hooks

It is possible to execute custom code:

  • Before or after a plugin is installed, reshimed, updated, or uninstalled
  • Before or after a plugin command is executed

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:

text
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.

Environment Variables

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.

  • If Unset: $HOME/.asdfrc will be used.
  • Usage: 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.

  • If Unset: .tool-versions will be used.
  • Usage: 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.

  • If Unset: the parent directory of the bin/asdf executable is used.
  • Usage: 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.

  • If Unset: $HOME/.asdf if it exists, or else the value of ASDF_DIR
  • Usage: 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.

  • If Unset: the asdf config concurrency value is used.
  • Usage: 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.

  • If Unset: On macOS, defaults to yes; but on other systems, defaults to no
  • If yes: Force asdf directories to the front of the PATH
  • If set to any string other than yes: Do not force asdf directories to the front of the PATH
  • Usage: ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"

Full Configuration Example

Following a simple asdf setup with:

  • a Bash Shell
  • an installation location of $HOME/.asdf
  • installed via Git
  • NO environment variables set
  • NO custom .asdfrc file

would result in the following outcomes:

ConfigurationValueCalculated by
config file location$HOME/.asdfrcASDF_CONFIG_FILE is empty, so use $HOME/.asdfrc
default tool versions filename.tool-versionsASDF_DEFAULT_TOOL_VERSIONS_FILENAME is empty, so use .tool-versions
asdf dir$HOME/.asdfASDF_DIR is empty, so use parent dir of bin/asdf
asdf data dir$HOME/.asdfASDF_DATA_DIR is empty so use $HOME/.asdf as $HOME exists.
concurrencyautoASDF_CONCURRENCY is empty, so rely on concurrency value from the default configuration
legacy_version_filenoNo custom .asdfrc, so use the default configuration
use_release_candidatesnoNo custom .asdfrc, so use the default configuration
always_keep_downloadnoNo custom .asdfrc, so use the default configuration
plugin_repository_last_check_duration60No custom .asdfrc, so use the default configuration
disable_plugin_short_name_repositorynoNo custom .asdfrc, so use the default configuration

Internal 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.
',46))])}const A=n(c,[["render",_]]);export{S as __pageData,A as default}; diff --git a/assets/manage_core.md.D6WBxbgc.js b/assets/manage_core.md.D6WBxbgc.js new file mode 100644 index 00000000..be642d9e --- /dev/null +++ b/assets/manage_core.md.D6WBxbgc.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as t,o as l}from"./chunks/framework.BQmytedh.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(`

Core

The core asdf command list is rather small, but can facilitate many workflows.

Installation & Setup

Covered in the Getting Started guide.

Exec

shell
asdf exec <command> [args...]

Executes the command shim for the current version.

Env

shell
asdf env <command> [util]

Info

shell
asdf info

A helper command to print the OS, Shell and asdf debug information. Share this when making a bug report.

Reshim

shell
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 .

Shim-versions

shell
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:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

Update

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:

MethodLatest Stable ReleaseLatest commit on master
asdf (via Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
PacmanDownload a new PKGBUILD & rebuild
or use your preferred AUR helper

Uninstall

To uninstall asdf follow these steps:

Bash & Git
  1. In your ~/.bashrc remove the lines that source asdf.sh and the completions:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. In your ~/.bash_profile remove the lines that source asdf.sh and the completions:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. In your ~/.bashrc remove the lines that source asdf.sh and the completions:
shell
. $(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.

  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

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.

  1. In your ~/.bash_profile remove the lines that source asdf.sh and the completions:
shell
. $(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.

  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. In your ~/.bashrc remove the lines that source asdf.sh and the completions:
shell
. /opt/asdf-vm/asdf.sh
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. In your ~/.config/fish/config.fish remove the lines that source asdf.fish:
shell
source ~/.asdf/asdf.fish

and remove completions with this command:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. Remove the $HOME/.asdf dir:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. In your ~/.config/fish/config.fish remove the lines that source asdf.fish:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. In your ~/.config/fish/config.fish remove the lines that source asdf.fish:
shell
source /opt/asdf-vm/asdf.fish
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. In your ~/.config/elvish/rc.elv remove the lines that use the asdf module:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

and uninstall the asdf module with this command:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Remove the $HOME/.asdf dir:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. In your ~/.config/elvish/rc.elv remove the lines that use the asdf module:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

and uninstall the asdf module with this command:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. In your ~/.config/elvish/rc.elv remove the lines that use the asdf module:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

and uninstall the asdf module with this command:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. In your ~/.zshrc remove the lines that source asdf.sh and completions:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

OR the ZSH Framework plugin if used.

  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. In your ~/.zshrc remove the lines that source asdf.sh:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. Uninstall with your package manager:
shell
brew uninstall asdf --force && brew autoremove
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. In your ~/.zshrc remove the lines that source asdf.sh:
shell
. /opt/asdf-vm/asdf.sh
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
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.D6WBxbgc.lean.js b/assets/manage_core.md.D6WBxbgc.lean.js new file mode 100644 index 00000000..be642d9e --- /dev/null +++ b/assets/manage_core.md.D6WBxbgc.lean.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as t,o as l}from"./chunks/framework.BQmytedh.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(`

Core

The core asdf command list is rather small, but can facilitate many workflows.

Installation & Setup

Covered in the Getting Started guide.

Exec

shell
asdf exec <command> [args...]

Executes the command shim for the current version.

Env

shell
asdf env <command> [util]

Info

shell
asdf info

A helper command to print the OS, Shell and asdf debug information. Share this when making a bug report.

Reshim

shell
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 .

Shim-versions

shell
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:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

Update

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:

MethodLatest Stable ReleaseLatest commit on master
asdf (via Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
PacmanDownload a new PKGBUILD & rebuild
or use your preferred AUR helper

Uninstall

To uninstall asdf follow these steps:

Bash & Git
  1. In your ~/.bashrc remove the lines that source asdf.sh and the completions:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. In your ~/.bash_profile remove the lines that source asdf.sh and the completions:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. In your ~/.bashrc remove the lines that source asdf.sh and the completions:
shell
. $(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.

  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

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.

  1. In your ~/.bash_profile remove the lines that source asdf.sh and the completions:
shell
. $(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.

  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. In your ~/.bashrc remove the lines that source asdf.sh and the completions:
shell
. /opt/asdf-vm/asdf.sh
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. In your ~/.config/fish/config.fish remove the lines that source asdf.fish:
shell
source ~/.asdf/asdf.fish

and remove completions with this command:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. Remove the $HOME/.asdf dir:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. In your ~/.config/fish/config.fish remove the lines that source asdf.fish:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. In your ~/.config/fish/config.fish remove the lines that source asdf.fish:
shell
source /opt/asdf-vm/asdf.fish
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. In your ~/.config/elvish/rc.elv remove the lines that use the asdf module:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

and uninstall the asdf module with this command:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Remove the $HOME/.asdf dir:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. In your ~/.config/elvish/rc.elv remove the lines that use the asdf module:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

and uninstall the asdf module with this command:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. In your ~/.config/elvish/rc.elv remove the lines that use the asdf module:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

and uninstall the asdf module with this command:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. In your ~/.zshrc remove the lines that source asdf.sh and completions:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

OR the ZSH Framework plugin if used.

  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. In your ~/.zshrc remove the lines that source asdf.sh:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. Uninstall with your package manager:
shell
brew uninstall asdf --force && brew autoremove
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. In your ~/.zshrc remove the lines that source asdf.sh:
shell
. /opt/asdf-vm/asdf.sh
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
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.BLO16oTi.js b/assets/manage_plugins.md.BLO16oTi.js new file mode 100644 index 00000000..71c6af14 --- /dev/null +++ b/assets/manage_plugins.md.BLO16oTi.js @@ -0,0 +1,11 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.BQmytedh.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

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

Add plugins via their Git URL:

shell
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:

shell
asdf plugin add <name>
+# asdf plugin add erlang

Recommendation

Prefer the longer git-url method as it is independent of the short-name repo.

List Installed

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

List All in Short-name Repository

shell
asdf plugin list all

See Plugins Shortname Index for the entire short-name list of plugins.

Update

shell
asdf plugin update --all

If you want to update a specific package, just say so.

shell
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)

Remove

bash
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.

Syncing the asdf Short-name Repository

The short-name repo is synced to your local machine and periodically refreshed. This method to determine a sync is as follows:

  • sync events are triggered by commands:
    • asdf plugin add <name>
    • asdf plugin list all
  • if configuration option disable_plugin_short_name_repository is set to yes, then sync is aborted early. See the asdf config docs for more.
  • if there has not been a synchronization in the last 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.
`,26)]))}const c=i(l,[["render",n]]);export{g as __pageData,c as default}; diff --git a/assets/manage_plugins.md.BLO16oTi.lean.js b/assets/manage_plugins.md.BLO16oTi.lean.js new file mode 100644 index 00000000..71c6af14 --- /dev/null +++ b/assets/manage_plugins.md.BLO16oTi.lean.js @@ -0,0 +1,11 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.BQmytedh.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

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

Add plugins via their Git URL:

shell
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:

shell
asdf plugin add <name>
+# asdf plugin add erlang

Recommendation

Prefer the longer git-url method as it is independent of the short-name repo.

List Installed

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

List All in Short-name Repository

shell
asdf plugin list all

See Plugins Shortname Index for the entire short-name list of plugins.

Update

shell
asdf plugin update --all

If you want to update a specific package, just say so.

shell
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)

Remove

bash
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.

Syncing the asdf Short-name Repository

The short-name repo is synced to your local machine and periodically refreshed. This method to determine a sync is as follows:

  • sync events are triggered by commands:
    • asdf plugin add <name>
    • asdf plugin list all
  • if configuration option disable_plugin_short_name_repository is set to yes, then sync is aborted early. See the asdf config docs for more.
  • if there has not been a synchronization in the last 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.
`,26)]))}const c=i(l,[["render",n]]);export{g as __pageData,c as default}; diff --git a/assets/manage_versions.md.C6EGWNcY.js b/assets/manage_versions.md.C6EGWNcY.js new file mode 100644 index 00000000..97b02464 --- /dev/null +++ b/assets/manage_versions.md.C6EGWNcY.js @@ -0,0 +1,30 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.BQmytedh.js";const g=JSON.parse('{"title":"Versions","description":"","frontmatter":{},"headers":[],"relativePath":"manage/versions.md","filePath":"manage/versions.md","lastUpdated":1734464980000}'),n={name:"manage/versions.md"};function l(h,s,p,k,r,d){return t(),a("div",null,s[0]||(s[0]=[e(`

Versions

Install Version

shell
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.

Install Latest Stable Version

shell
asdf install <name> latest
+# asdf install erlang latest

Install latest stable version that begins with a given string.

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

List Installed Versions

shell
asdf list <name>
+# asdf list erlang

Filter versions to those that begin with a given string.

shell
asdf list <name> <version>
+# asdf list erlang 17

List All Available Versions

shell
asdf list all <name>
+# asdf list all erlang

Filter versions to those that begin with a given string.

shell
asdf list all <name> <version>
+# asdf list all erlang 17

Show Latest Stable Version

shell
asdf latest <name>
+# asdf latest erlang

Show latest stable version that begins with a given string.

shell
asdf latest <name> <version>
+# asdf latest erlang 17

Set Current Version

shell
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 sets 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.

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

Fallback to System Version

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.

shell
asdf local <name> system
+# asdf local python system

View Current Version

shell
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

Uninstall Version

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

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, 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:

shell
# 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

By-passing asdf shims

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.C6EGWNcY.lean.js b/assets/manage_versions.md.C6EGWNcY.lean.js new file mode 100644 index 00000000..97b02464 --- /dev/null +++ b/assets/manage_versions.md.C6EGWNcY.lean.js @@ -0,0 +1,30 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.BQmytedh.js";const g=JSON.parse('{"title":"Versions","description":"","frontmatter":{},"headers":[],"relativePath":"manage/versions.md","filePath":"manage/versions.md","lastUpdated":1734464980000}'),n={name:"manage/versions.md"};function l(h,s,p,k,r,d){return t(),a("div",null,s[0]||(s[0]=[e(`

Versions

Install Version

shell
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.

Install Latest Stable Version

shell
asdf install <name> latest
+# asdf install erlang latest

Install latest stable version that begins with a given string.

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

List Installed Versions

shell
asdf list <name>
+# asdf list erlang

Filter versions to those that begin with a given string.

shell
asdf list <name> <version>
+# asdf list erlang 17

List All Available Versions

shell
asdf list all <name>
+# asdf list all erlang

Filter versions to those that begin with a given string.

shell
asdf list all <name> <version>
+# asdf list all erlang 17

Show Latest Stable Version

shell
asdf latest <name>
+# asdf latest erlang

Show latest stable version that begins with a given string.

shell
asdf latest <name> <version>
+# asdf latest erlang 17

Set Current Version

shell
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 sets 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.

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

Fallback to System Version

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.

shell
asdf local <name> system
+# asdf local python system

View Current Version

shell
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

Uninstall Version

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

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, 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:

shell
# 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

By-passing asdf shims

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.yoPbi1N_.js b/assets/more_community-projects.md.yoPbi1N_.js new file mode 100644 index 00000000..28ba5aec --- /dev/null +++ b/assets/more_community-projects.md.yoPbi1N_.js @@ -0,0 +1 @@ +import{_ as t,c as o,a2 as r,o as a}from"./chunks/framework.BQmytedh.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('

Community Projects

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.

',4)]))}const f=t(s,[["render",c]]);export{u as __pageData,f as default}; diff --git a/assets/more_community-projects.md.yoPbi1N_.lean.js b/assets/more_community-projects.md.yoPbi1N_.lean.js new file mode 100644 index 00000000..28ba5aec --- /dev/null +++ b/assets/more_community-projects.md.yoPbi1N_.lean.js @@ -0,0 +1 @@ +import{_ as t,c as o,a2 as r,o as a}from"./chunks/framework.BQmytedh.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('

Community Projects

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.

',4)]))}const f=t(s,[["render",c]]);export{u as __pageData,f as default}; diff --git a/assets/more_faq.md.sc8Q06z2.js b/assets/more_faq.md.sc8Q06z2.js new file mode 100644 index 00000000..a99814f5 --- /dev/null +++ b/assets/more_faq.md.sc8Q06z2.js @@ -0,0 +1 @@ +import{_ as o,c as t,a2 as a,o as n}from"./chunks/framework.BQmytedh.js";const p=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"more/faq.md","filePath":"more/faq.md","lastUpdated":1671778129000}'),r={name:"more/faq.md"};function s(i,e,d,l,c,h){return n(),t("div",null,e[0]||(e[0]=[a('

FAQ

Here are some common questions regarding asdf.

WSL1 support?

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 support?

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.

Newly installed executable not running?

I just npm install -g yarn, but cannot execute yarn. 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.

Shell not detecting newly installed shims?

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.

',13)]))}const f=o(r,[["render",s]]);export{p as __pageData,f as default}; diff --git a/assets/more_faq.md.sc8Q06z2.lean.js b/assets/more_faq.md.sc8Q06z2.lean.js new file mode 100644 index 00000000..a99814f5 --- /dev/null +++ b/assets/more_faq.md.sc8Q06z2.lean.js @@ -0,0 +1 @@ +import{_ as o,c as t,a2 as a,o as n}from"./chunks/framework.BQmytedh.js";const p=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"more/faq.md","filePath":"more/faq.md","lastUpdated":1671778129000}'),r={name:"more/faq.md"};function s(i,e,d,l,c,h){return n(),t("div",null,e[0]||(e[0]=[a('

FAQ

Here are some common questions regarding asdf.

WSL1 support?

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 support?

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.

Newly installed executable not running?

I just npm install -g yarn, but cannot execute yarn. 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.

Shell not detecting newly installed shims?

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.

',13)]))}const f=o(r,[["render",s]]);export{p as __pageData,f as default}; diff --git a/assets/more_thanks.md.Bx4bXB2q.js b/assets/more_thanks.md.Bx4bXB2q.js new file mode 100644 index 00000000..f5674960 --- /dev/null +++ b/assets/more_thanks.md.Bx4bXB2q.js @@ -0,0 +1 @@ +import{_ as a,c as t,a2 as r,o}from"./chunks/framework.BQmytedh.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('

Thanks

Thank you page to the asdf authors & contributors!

Credits

Me (@HashNuke), High-fever, cold, cough.

Copyright 2014 to the end of time (MIT License)

Maintainers

Contributors

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.Bx4bXB2q.lean.js b/assets/more_thanks.md.Bx4bXB2q.lean.js new file mode 100644 index 00000000..f5674960 --- /dev/null +++ b/assets/more_thanks.md.Bx4bXB2q.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,a2 as r,o}from"./chunks/framework.BQmytedh.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('

Thanks

Thank you page to the asdf authors & contributors!

Credits

Me (@HashNuke), High-fever, cold, cough.

Copyright 2014 to the end of time (MIT License)

Maintainers

Contributors

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.DOuyNDOe.js b/assets/plugins_create.md.DOuyNDOe.js new file mode 100644 index 00000000..3fa581b7 --- /dev/null +++ b/assets/plugins_create.md.DOuyNDOe.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.BQmytedh.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('

Create a Plugin

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.

Quickstart

There are two options to get started with creating your own plugin:

  1. use the asdf-vm/asdf-plugin-template repository to generate a plugin repo (named asdf-<tool_name>) with default scripts implemented. Once generated, clone the repo and run the setup.bash script to interactively update the template.
  2. start your own repo called asdf-<tool_name> and implement the required scripts as listed in the documentation below.

Golden Rules for Plugin Scripts

  • scripts should NOT call other asdf commands
  • keep your dependency list of Shell tools/commands small
  • avoid non-portable tools or command flags. For example, sort -V. See our asdf core list of banned commands

Scripts Overview

The 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.

Environment Variables Overview

The full list of Environment Variables used throughout all scripts.

Environment VariablesDescription
ASDF_INSTALL_TYPEversion or ref
ASDF_INSTALL_VERSIONfull version number or Git Ref depending on ASDF_INSTALL_TYPE
ASDF_INSTALL_PATHthe path to where the tool should, or has been installed
ASDF_CONCURRENCYthe number of cores to use when compiling the source code. Useful for setting make -j
ASDF_DOWNLOAD_PATHthe path to where the source code or binary was downloaded to by bin/download
ASDF_PLUGIN_PATHthe path the plugin was installed
ASDF_PLUGIN_SOURCE_URLthe source URL of the plugin
ASDF_PLUGIN_PREV_REFprevous git-ref of the plugin repo
ASDF_PLUGIN_POST_REFupdated git-ref of the plugin repo
ASDF_CMD_FILEresolves 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.

Required Scripts

',6)),s("h3",b,[i[26]||(i[26]=s("code",null,"bin/list-all",-1)),i[27]||(i[27]=e()),a(t,{type:"tip",text:"required",vertical:"middle"}),i[28]||(i[28]=e()),i[29]||(i[29]=s("a",{class:"header-anchor",href:"#bin-list-all","aria-label":'Permalink to "`bin/list-all` "'},"​",-1))]),i[50]||(i[50]=l('

Description

List all installable versions.

Output Format

Must print a string with a space-separated list of versions. For example:

txt
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:

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.

bash
"${plugin_path}/bin/list-all"

',19)),s("h3",m,[i[30]||(i[30]=s("code",null,"bin/download",-1)),i[31]||(i[31]=e()),a(t,{type:"tip",text:"required",vertical:"middle"}),i[32]||(i[32]=e()),i[33]||(i[33]=s("a",{class:"header-anchor",href:"#bin-download","aria-label":'Permalink to "`bin/download` "'},"​",-1))]),i[51]||(i[51]=l('

Description

Download the source code or binary for a specific version of a tool to a specified location.

Implementation Details

  • The script must download the source or binary to the directory specified by ASDF_DOWNLOAD_PATH.
  • Only the decompressed source code or binary should be placed in the ASDF_DOWNLOAD_PATH directory.
  • On failure, no files should be placed in ASDF_DOWNLOAD_PATH.
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

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:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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.

bash
"${plugin_path}"/bin/download

',16)),s("h3",f,[i[34]||(i[34]=s("code",null,"bin/install",-1)),i[35]||(i[35]=e()),a(t,{type:"tip",text:"required",vertical:"middle"}),i[36]||(i[36]=e()),i[37]||(i[37]=s("a",{class:"header-anchor",href:"#bin-install","aria-label":'Permalink to "`bin/install` "'},"​",-1))]),i[52]||(i[52]=l('

Description

Install a specific version of a tool to a specified location.

Implementation Details

  • The script should install the specified version in the path ASDF_INSTALL_PATH.
  • Shims will be created by default for any files in $ASDF_INSTALL_PATH/bin. This behaviour can be customised with the optional bin/list-bin-paths script.
  • Success should exit with 0.
  • Failure should exit with a non-zero status.
  • To avoid TOCTOU (Time-of-Check-to-Time-of-Use) issues, ensure the script only places files in 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:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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.

bash
"${plugin_path}"/bin/install

Optional Scripts

',15)),s("h3",y,[i[38]||(i[38]=s("code",null,"bin/latest-stable",-1)),i[39]||(i[39]=e()),a(t,{type:"warning",text:"recommended",vertical:"middle"}),i[40]||(i[40]=e()),i[41]||(i[41]=s("a",{class:"header-anchor",href:"#bin-latest-stable","aria-label":'Permalink to "`bin/latest-stable` "'},"​",-1))]),i[53]||(i[53]=l('

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

  • The script should print the latest stable version of the tool to stdout.
  • Non-stable or release candidate versions should be omitted.
  • A filter query is provided as the first argument to the script. This should be used to filter the output by version number or tool provider.
    • For instance, the output of 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
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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.

bash
"${plugin_path}"/bin/latest-stable "$query"

bin/help.overview

Description

Output a general description about the plugin and the tool being managed.

Implementation Details

  • This script is required for any help output to be displayed for the plugin.
  • No heading should be printed as asdf core will print headings.
  • Output may be free-form text but ideally only one short paragraph.
  • Must not output any information that is already covered in the core asdf-vm documentation.
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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 tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.overview

bin/help.deps

Description

Output the list of dependencies tailored to the operating system. One dependency per line.

bash
git\ncurl\nsed

Implementation Details

  • This script requires bin/help.overview for its output to be considered.
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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 tool

Call signature from asdf core

bash
"${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

  • This script requires bin/help.overview for its output to be considered.
  • Output can be free-form text.
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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 tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.config

Description

Output a list of links relevant to the plugin and tool. One link per line.

bash
Git Repository:	https://github.com/vlang/v\nDocumentation:	https://vlang.io

Implementation Details

  • This script requires bin/help.overview for its output to be considered.
  • One link per line.
  • Format must be either:
    • <title>: <link>
    • or just <link>
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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 tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.links

bin/list-bin-paths

Description

List directories containing executables for the specified version of the tool.

Implementation Details

  • If this script is not present, asdf will look for binaries in the "${ASDF_INSTALL_PATH}"/bin directory & create shims for those.
  • Output a space-separated list of paths containing executables.
  • Paths must be relative to ASDF_INSTALL_PATH. Example output would be:
bash
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:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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

bash
"${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:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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 executable
  • 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.

Call signature from asdf core

bash
"${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

  • Must print a string with the relative executable path.
  • Conditionally override the shim's specified executable path, otherwise return the default path specified by the shim.
shell
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:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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 executable
  • 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.

Call signature from asdf core

bash
"${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.

bash
"${plugin_path}/bin/uninstall"

bin/list-legacy-filenames

Description

List legacy configuration filenames for determining the specified version of the tool.

Implementation Details

  • Output a space-separated list of filenames.
    bash
    .ruby-version .rvmrc
  • Only applies for users who have enabled the legacy_version_file option in their "${HOME}"/.asdfrc.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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.

bash
"${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

  • If not present, asdf will simply cat the legacy file to determine the version.
  • Should be deterministic and always return the same exact version:
    • when parsing the same legacy file.
    • regardless of what is installed on the machine or whether the legacy version is valid or complete. Some legacy file formats may not be suitable.
  • Output a single line with the version:
    bash
    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.

bash
"${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.

bash
"${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-ref
  • ASDF_PLUGIN_POST_REF: the plugin's updated git-ref

Call signature from asdf core

No parameters provided.

bash
"${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.

bash
"${plugin_path}/bin/pre-plugin-remove"
',172)),s("h2",F,[i[42]||(i[42]=e("Extension Commands for asdf CLI ")),a(t,{type:"danger",text:"advanced",vertical:"middle"}),i[43]||(i[43]=e()),i[44]||(i[44]=s("a",{class:"header-anchor",href:"#extension-commands-for-asdf-cli","aria-label":'Permalink to "Extension Commands for asdf CLI "'},"​",-1))]),i[54]||(i[54]=l('

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:

shell
foo/\n  lib/commands/\n    command.bash\n    command-bat.bash\n    command-bat-man.bash\n    command-help.bash

Users can now execute:

shell
$ 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 Templates "'},"​",-1))]),i[55]||(i[55]=l(`

WARNING

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.

Testing

asdf contains the plugin-test command to test your plugin:

shell
asdf plugin test <plugin_name> <plugin_url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git_ref>] [test_command...]
  • <plugin_name> & <plugin_url> are required
  • If optional [--asdf-tool-version <version>] is specified, the tool will be installed with that specific version. Defaults to asdf latest <plugin-name>
  • If optional [--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.
  • Optional parameter [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
    shell
    # 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

GitHub Action

The asdf-vm/actions repo provides a GitHub Action for testing your plugins hosted on GitHub. A sample .github/workflows/test.yaml Actions Workflow:

yaml
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"

TravisCI Config

A sample .travis.yml file, customize it to your needs

yaml
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:

shell
asdf plugin test <tool_name> <path> '<tool_command> --version'

API Rate Limiting

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:

shell
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

Plugin Shortname Index

TIP

The recommended installation method for a plugin is via direct URL installation:

shell
# 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.DOuyNDOe.lean.js b/assets/plugins_create.md.DOuyNDOe.lean.js new file mode 100644 index 00000000..3fa581b7 --- /dev/null +++ b/assets/plugins_create.md.DOuyNDOe.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.BQmytedh.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('

Create a Plugin

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.

Quickstart

There are two options to get started with creating your own plugin:

  1. use the asdf-vm/asdf-plugin-template repository to generate a plugin repo (named asdf-<tool_name>) with default scripts implemented. Once generated, clone the repo and run the setup.bash script to interactively update the template.
  2. start your own repo called asdf-<tool_name> and implement the required scripts as listed in the documentation below.

Golden Rules for Plugin Scripts

  • scripts should NOT call other asdf commands
  • keep your dependency list of Shell tools/commands small
  • avoid non-portable tools or command flags. For example, sort -V. See our asdf core list of banned commands

Scripts Overview

The 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.

Environment Variables Overview

The full list of Environment Variables used throughout all scripts.

Environment VariablesDescription
ASDF_INSTALL_TYPEversion or ref
ASDF_INSTALL_VERSIONfull version number or Git Ref depending on ASDF_INSTALL_TYPE
ASDF_INSTALL_PATHthe path to where the tool should, or has been installed
ASDF_CONCURRENCYthe number of cores to use when compiling the source code. Useful for setting make -j
ASDF_DOWNLOAD_PATHthe path to where the source code or binary was downloaded to by bin/download
ASDF_PLUGIN_PATHthe path the plugin was installed
ASDF_PLUGIN_SOURCE_URLthe source URL of the plugin
ASDF_PLUGIN_PREV_REFprevous git-ref of the plugin repo
ASDF_PLUGIN_POST_REFupdated git-ref of the plugin repo
ASDF_CMD_FILEresolves 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.

Required Scripts

',6)),s("h3",b,[i[26]||(i[26]=s("code",null,"bin/list-all",-1)),i[27]||(i[27]=e()),a(t,{type:"tip",text:"required",vertical:"middle"}),i[28]||(i[28]=e()),i[29]||(i[29]=s("a",{class:"header-anchor",href:"#bin-list-all","aria-label":'Permalink to "`bin/list-all` "'},"​",-1))]),i[50]||(i[50]=l('

Description

List all installable versions.

Output Format

Must print a string with a space-separated list of versions. For example:

txt
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:

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.

bash
"${plugin_path}/bin/list-all"

',19)),s("h3",m,[i[30]||(i[30]=s("code",null,"bin/download",-1)),i[31]||(i[31]=e()),a(t,{type:"tip",text:"required",vertical:"middle"}),i[32]||(i[32]=e()),i[33]||(i[33]=s("a",{class:"header-anchor",href:"#bin-download","aria-label":'Permalink to "`bin/download` "'},"​",-1))]),i[51]||(i[51]=l('

Description

Download the source code or binary for a specific version of a tool to a specified location.

Implementation Details

  • The script must download the source or binary to the directory specified by ASDF_DOWNLOAD_PATH.
  • Only the decompressed source code or binary should be placed in the ASDF_DOWNLOAD_PATH directory.
  • On failure, no files should be placed in ASDF_DOWNLOAD_PATH.
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

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:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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.

bash
"${plugin_path}"/bin/download

',16)),s("h3",f,[i[34]||(i[34]=s("code",null,"bin/install",-1)),i[35]||(i[35]=e()),a(t,{type:"tip",text:"required",vertical:"middle"}),i[36]||(i[36]=e()),i[37]||(i[37]=s("a",{class:"header-anchor",href:"#bin-install","aria-label":'Permalink to "`bin/install` "'},"​",-1))]),i[52]||(i[52]=l('

Description

Install a specific version of a tool to a specified location.

Implementation Details

  • The script should install the specified version in the path ASDF_INSTALL_PATH.
  • Shims will be created by default for any files in $ASDF_INSTALL_PATH/bin. This behaviour can be customised with the optional bin/list-bin-paths script.
  • Success should exit with 0.
  • Failure should exit with a non-zero status.
  • To avoid TOCTOU (Time-of-Check-to-Time-of-Use) issues, ensure the script only places files in 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:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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.

bash
"${plugin_path}"/bin/install

Optional Scripts

',15)),s("h3",y,[i[38]||(i[38]=s("code",null,"bin/latest-stable",-1)),i[39]||(i[39]=e()),a(t,{type:"warning",text:"recommended",vertical:"middle"}),i[40]||(i[40]=e()),i[41]||(i[41]=s("a",{class:"header-anchor",href:"#bin-latest-stable","aria-label":'Permalink to "`bin/latest-stable` "'},"​",-1))]),i[53]||(i[53]=l('

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

  • The script should print the latest stable version of the tool to stdout.
  • Non-stable or release candidate versions should be omitted.
  • A filter query is provided as the first argument to the script. This should be used to filter the output by version number or tool provider.
    • For instance, the output of 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
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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.

bash
"${plugin_path}"/bin/latest-stable "$query"

bin/help.overview

Description

Output a general description about the plugin and the tool being managed.

Implementation Details

  • This script is required for any help output to be displayed for the plugin.
  • No heading should be printed as asdf core will print headings.
  • Output may be free-form text but ideally only one short paragraph.
  • Must not output any information that is already covered in the core asdf-vm documentation.
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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 tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.overview

bin/help.deps

Description

Output the list of dependencies tailored to the operating system. One dependency per line.

bash
git\ncurl\nsed

Implementation Details

  • This script requires bin/help.overview for its output to be considered.
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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 tool

Call signature from asdf core

bash
"${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

  • This script requires bin/help.overview for its output to be considered.
  • Output can be free-form text.
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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 tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.config

Description

Output a list of links relevant to the plugin and tool. One link per line.

bash
Git Repository:	https://github.com/vlang/v\nDocumentation:	https://vlang.io

Implementation Details

  • This script requires bin/help.overview for its output to be considered.
  • One link per line.
  • Format must be either:
    • <title>: <link>
    • or just <link>
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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 tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.links

bin/list-bin-paths

Description

List directories containing executables for the specified version of the tool.

Implementation Details

  • If this script is not present, asdf will look for binaries in the "${ASDF_INSTALL_PATH}"/bin directory & create shims for those.
  • Output a space-separated list of paths containing executables.
  • Paths must be relative to ASDF_INSTALL_PATH. Example output would be:
bash
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:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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

bash
"${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:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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 executable
  • 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.

Call signature from asdf core

bash
"${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

  • Must print a string with the relative executable path.
  • Conditionally override the shim's specified executable path, otherwise return the default path specified by the shim.
shell
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:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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 executable
  • 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.

Call signature from asdf core

bash
"${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.

bash
"${plugin_path}/bin/uninstall"

bin/list-legacy-filenames

Description

List legacy configuration filenames for determining the specified version of the tool.

Implementation Details

  • Output a space-separated list of filenames.
    bash
    .ruby-version .rvmrc
  • Only applies for users who have enabled the legacy_version_file option in their "${HOME}"/.asdfrc.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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.

bash
"${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

  • If not present, asdf will simply cat the legacy file to determine the version.
  • Should be deterministic and always return the same exact version:
    • when parsing the same legacy file.
    • regardless of what is installed on the machine or whether the legacy version is valid or complete. Some legacy file formats may not be suitable.
  • Output a single line with the version:
    bash
    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.

bash
"${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.

bash
"${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-ref
  • ASDF_PLUGIN_POST_REF: the plugin's updated git-ref

Call signature from asdf core

No parameters provided.

bash
"${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.

bash
"${plugin_path}/bin/pre-plugin-remove"
',172)),s("h2",F,[i[42]||(i[42]=e("Extension Commands for asdf CLI ")),a(t,{type:"danger",text:"advanced",vertical:"middle"}),i[43]||(i[43]=e()),i[44]||(i[44]=s("a",{class:"header-anchor",href:"#extension-commands-for-asdf-cli","aria-label":'Permalink to "Extension Commands for asdf CLI "'},"​",-1))]),i[54]||(i[54]=l('

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:

shell
foo/\n  lib/commands/\n    command.bash\n    command-bat.bash\n    command-bat-man.bash\n    command-help.bash

Users can now execute:

shell
$ 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 Templates "'},"​",-1))]),i[55]||(i[55]=l(`

WARNING

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.

Testing

asdf contains the plugin-test command to test your plugin:

shell
asdf plugin test <plugin_name> <plugin_url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git_ref>] [test_command...]
  • <plugin_name> & <plugin_url> are required
  • If optional [--asdf-tool-version <version>] is specified, the tool will be installed with that specific version. Defaults to asdf latest <plugin-name>
  • If optional [--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.
  • Optional parameter [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
    shell
    # 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

GitHub Action

The asdf-vm/actions repo provides a GitHub Action for testing your plugins hosted on GitHub. A sample .github/workflows/test.yaml Actions Workflow:

yaml
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"

TravisCI Config

A sample .travis.yml file, customize it to your needs

yaml
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:

shell
asdf plugin test <tool_name> <path> '<tool_command> --version'

API Rate Limiting

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:

shell
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

Plugin Shortname Index

TIP

The recommended installation method for a plugin is via direct URL installation:

shell
# 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.BYmf6nEE.js b/assets/pt-br_contribute_core.md.BYmf6nEE.js new file mode 100644 index 00000000..aa470509 --- /dev/null +++ b/assets/pt-br_contribute_core.md.BYmf6nEE.js @@ -0,0 +1,25 @@ +import{_ as s,c as a,a2 as i,o as t}from"./chunks/framework.BQmytedh.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(`

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.

guia de contribuição principal asdf.

Configuração inicial

Fork asdf no GitHub e/ou Git clone o branch padrão:

shell
# 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:

shell
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:

shell
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:

  • bats-core: Bash Automated Testing System, para testes unitários de scripts compatíveis com Bash ou POSIX.
  • shellcheck: Ferramenta de análise estática para scripts de shell.
  • shfmt: Um analisador, formatador e interpretador de shell com suporte a bash; inclui shfmt

Desenvolvimento

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:

shell
# 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

Teste de BATS

É 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:

shell
# 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.

Pull Requests, Releases e Commits Convencionais

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 patchfeat: 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.

Imagens Docker

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.BYmf6nEE.lean.js b/assets/pt-br_contribute_core.md.BYmf6nEE.lean.js new file mode 100644 index 00000000..aa470509 --- /dev/null +++ b/assets/pt-br_contribute_core.md.BYmf6nEE.lean.js @@ -0,0 +1,25 @@ +import{_ as s,c as a,a2 as i,o as t}from"./chunks/framework.BQmytedh.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(`

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.

guia de contribuição principal asdf.

Configuração inicial

Fork asdf no GitHub e/ou Git clone o branch padrão:

shell
# 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:

shell
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:

shell
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:

  • bats-core: Bash Automated Testing System, para testes unitários de scripts compatíveis com Bash ou POSIX.
  • shellcheck: Ferramenta de análise estática para scripts de shell.
  • shfmt: Um analisador, formatador e interpretador de shell com suporte a bash; inclui shfmt

Desenvolvimento

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:

shell
# 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

Teste de BATS

É 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:

shell
# 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.

Pull Requests, Releases e Commits Convencionais

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 patchfeat: 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.

Imagens Docker

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.DIVmFQtc.js b/assets/pt-br_contribute_documentation.md.DIVmFQtc.js new file mode 100644 index 00000000..3c5e0085 --- /dev/null +++ b/assets/pt-br_contribute_documentation.md.DIVmFQtc.js @@ -0,0 +1,29 @@ +import{_ as a,c as i,a2 as e,o as n}from"./chunks/framework.BQmytedh.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(`

Docs & Site

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.

Configuração inicial

Fork asdf no GitHub e/ou Git clone o branch padrão:

shell
# 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:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

Instale a(s) versão(ões) da ferramenta com:

shell
asdf install
  • Node.js: tempo de execução JavaScript criado no mecanismo JavaScript V8 do Chrome.

Instale as dependências do Node.js do docs/package.json:

shell
npm install

Desenvolvimento

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:

@code json{3-5}

Para iniciar o servidor de desenvolvimento local:

shell
npm run dev

Formate o código antes de confirmar:

shell
npm run format

Pull Requests, Releases e Commits Convencionais

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>.

Vuepress

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.

I18n

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 é:

js
{
+  ...
+  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:

shell
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.DIVmFQtc.lean.js b/assets/pt-br_contribute_documentation.md.DIVmFQtc.lean.js new file mode 100644 index 00000000..3c5e0085 --- /dev/null +++ b/assets/pt-br_contribute_documentation.md.DIVmFQtc.lean.js @@ -0,0 +1,29 @@ +import{_ as a,c as i,a2 as e,o as n}from"./chunks/framework.BQmytedh.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(`

Docs & Site

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.

Configuração inicial

Fork asdf no GitHub e/ou Git clone o branch padrão:

shell
# 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:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

Instale a(s) versão(ões) da ferramenta com:

shell
asdf install
  • Node.js: tempo de execução JavaScript criado no mecanismo JavaScript V8 do Chrome.

Instale as dependências do Node.js do docs/package.json:

shell
npm install

Desenvolvimento

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:

@code json{3-5}

Para iniciar o servidor de desenvolvimento local:

shell
npm run dev

Formate o código antes de confirmar:

shell
npm run format

Pull Requests, Releases e Commits Convencionais

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>.

Vuepress

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.

I18n

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 é:

js
{
+  ...
+  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:

shell
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.BJkV62VO.js b/assets/pt-br_contribute_first-party-plugins.md.BJkV62VO.js new file mode 100644 index 00000000..590ef9bf --- /dev/null +++ b/assets/pt-br_contribute_first-party-plugins.md.BJkV62VO.js @@ -0,0 +1 @@ +import{_ as a,c as t,a2 as r,o as i}from"./chunks/framework.BQmytedh.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('

First-Party Plugins

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:

',6)]))}const g=a(o,[["render",s]]);export{f as __pageData,g as default}; diff --git a/assets/pt-br_contribute_first-party-plugins.md.BJkV62VO.lean.js b/assets/pt-br_contribute_first-party-plugins.md.BJkV62VO.lean.js new file mode 100644 index 00000000..590ef9bf --- /dev/null +++ b/assets/pt-br_contribute_first-party-plugins.md.BJkV62VO.lean.js @@ -0,0 +1 @@ +import{_ as a,c as t,a2 as r,o as i}from"./chunks/framework.BQmytedh.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('

First-Party Plugins

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:

',6)]))}const g=a(o,[["render",s]]);export{f as __pageData,g as default}; diff --git a/assets/pt-br_contribute_github-actions.md.08xeI_Lh.js b/assets/pt-br_contribute_github-actions.md.08xeI_Lh.js new file mode 100644 index 00000000..bf464c8c --- /dev/null +++ b/assets/pt-br_contribute_github-actions.md.08xeI_Lh.js @@ -0,0 +1 @@ +import{_ as o,c as s,j as e,a as t,o as i}from"./chunks/framework.BQmytedh.js";const h=JSON.parse('{"title":"GitHub Actions","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/contribute/github-actions.md","filePath":"pt-br/contribute/github-actions.md","lastUpdated":1650978118000}'),r={name:"pt-br/contribute/github-actions.md"};function n(c,a,l,d,u,p){return i(),s("div",null,a[0]||(a[0]=[e("h1",{id:"github-actions",tabindex:"-1"},[t("GitHub Actions "),e("a",{class:"header-anchor",href:"#github-actions","aria-label":'Permalink to "GitHub Actions"'},"​")],-1),e("blockquote",null,[e("p",null,`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.`)],-1),e("p",null,[t("Obrigado pelo seu interesse, consulte o "),e("a",{href:"https://github.com/asdf-vm/actions",target:"_blank",rel:"noreferrer"},"repositório de ações asdf"),t(" para ver os problemas, conversas e diretrizes de contribuição existentes.")],-1)]))}const m=o(r,[["render",n]]);export{h as __pageData,m as default}; diff --git a/assets/pt-br_contribute_github-actions.md.08xeI_Lh.lean.js b/assets/pt-br_contribute_github-actions.md.08xeI_Lh.lean.js new file mode 100644 index 00000000..bf464c8c --- /dev/null +++ b/assets/pt-br_contribute_github-actions.md.08xeI_Lh.lean.js @@ -0,0 +1 @@ +import{_ as o,c as s,j as e,a as t,o as i}from"./chunks/framework.BQmytedh.js";const h=JSON.parse('{"title":"GitHub Actions","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/contribute/github-actions.md","filePath":"pt-br/contribute/github-actions.md","lastUpdated":1650978118000}'),r={name:"pt-br/contribute/github-actions.md"};function n(c,a,l,d,u,p){return i(),s("div",null,a[0]||(a[0]=[e("h1",{id:"github-actions",tabindex:"-1"},[t("GitHub Actions "),e("a",{class:"header-anchor",href:"#github-actions","aria-label":'Permalink to "GitHub Actions"'},"​")],-1),e("blockquote",null,[e("p",null,`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.`)],-1),e("p",null,[t("Obrigado pelo seu interesse, consulte o "),e("a",{href:"https://github.com/asdf-vm/actions",target:"_blank",rel:"noreferrer"},"repositório de ações asdf"),t(" para ver os problemas, conversas e diretrizes de contribuição existentes.")],-1)]))}const m=o(r,[["render",n]]);export{h as __pageData,m as default}; diff --git a/assets/pt-br_guide_getting-started.md.B2F3eseE.js b/assets/pt-br_guide_getting-started.md.B2F3eseE.js new file mode 100644 index 00000000..8339e22c --- /dev/null +++ b/assets/pt-br_guide_getting-started.md.B2F3eseE.js @@ -0,0 +1,13 @@ +import{_ as a,c as i,a2 as e,o as t}from"./chunks/framework.BQmytedh.js";const k=JSON.parse('{"title":"Começando","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/guide/getting-started.md","filePath":"pt-br/guide/getting-started.md","lastUpdated":1734536933000}'),l={name:"pt-br/guide/getting-started.md"};function n(o,s,h,d,p,r){return t(),i("div",null,s[0]||(s[0]=[e(`

Começando

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:

  1. Instalar as dependências
  2. Instalar o núcleo do asdf
  3. Adicionar o asdf ao seu shell
  4. Instalar um plugin para cada ferramenta que você gostaria de gerenciar
  5. Instalar uma versão desta ferramenta
  6. Definir uma versão global e uma versão local através do arquivo de configuração .tool-versions

Você pode também acompanhar o passo a passo da instalação através deste vídeo.

1. Instalando as dependências

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).

OSPackage ManagerCommand
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

Note

sudo may be required depending on your system configuration.

2. Download asdf

Official Download

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.15.0

Community Supported Download Methods

We highly recommend using the official git method.

MethodCommand
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper

3. Adicionando ao seu shell

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:

Bash & Git

Adicione esta linha ao seu ~/.bashrc:

shell
. "$HOME/.asdf/asdf.sh"

O auto completar deve ser configurado manualmente a partir da adição da seguinte linha ao .bashrc:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

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:

shell
. "$HOME/.asdf/asdf.sh"

O auto completar deve ser configurado manualmente a partir da adição da seguinte linha ao .bash_profile:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

Adicione asdf.sh ao ~/.bashrc através do comando:

shell
echo -e "\\n. $(brew --prefix asdf)/asdf.sh" >> ~/.bashrc

O auto completar deve ser configurado seguindo as instruções da Homebrew, ou as seguintes:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Bash & Homebrew (macOS)

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:

shell
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:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Bash & Pacman

Adicione a seguinte linha ao seu ~/.bashrc:

shell
. /opt/asdf-vm/asdf.sh

O pacote bash-completion precisa ser instalado para o auto completar funcionar.

Fish & Git

Adicione a seguinte linha ao seu ~/.config/fish/config.fish:

shell
source ~/.asdf/asdf.fish

O auto completar deve ser configurado manualmente através do seguinte comando:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

Adicione asdf.fish ao seu ~/.config/fish/config.fish através do comando:

shell
echo -e "\\nsource "(brew --prefix asdf)"/asdf.fish" >> ~/.config/fish/config.fish

O auto completar é configurado pela Homebrew para o fish shell.

Fish & Pacman

Adicione a seguinte linha ao seu ~/.config/fish/config.fish:

shell
source /opt/asdf-vm/asdf.fish

O auto completar é configurado automaticamente durante a instalação do pacote AUR.

Elvish & Git

Adicione asdf.elv ao ~/.config/elvish/rc.elv através do comando:

shell
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

Elvish & Homebrew

Adicione asdf.elv ao ~/.config/elvish/rc.elv através do comando:

shell
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

Elvish & Pacman

Adicione asdf.elv ao ~/.config/elvish/rc.elv através do comando:

shell
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

ZSH & Git

Adicione a seguinte linha ao seu ~/.zshrc:

shell
. "$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:

shell
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • Se você está utilizando uma configuração compinit customizada, garanta que compinit esteja abaixo chamada asdf.sh
  • Se você está utilizando uma configuração 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.

ZSH & Homebrew

Adicione asdf.sh ao seu ~/.zshrc através do comando:

shell
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.

ZSH & Pacman

Adicione a seguinte linha ao seu ~/.zshrc:

shell
. /opt/asdf-vm/asdf.sh
PowerShell Core & Git

Adicione a seguinte linha ao seu ~/.config/powershell/profile.ps1:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

Adicione asdf.ps1 ao seu ~/.config/powershell/profile.ps1 através do comando:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

Adicione a seguinte linha ao seu ~/.config/powershell/profile.ps1:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

Adicione asdf.nu ao seu ~/.config/nushell/config.nu através do comando:

shell
"\\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

Nushell & Homebrew

Adicione asdf.nu ao seu ~/.config/nushell/config.nu através do comando:

shell
"\\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

Nushell & Pacman

Adicione asdf.nu ao seu ~/.config/nushell/config.nu através do comando:

shell
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

Ao concluir atualizará automaticamente

POSIX Shell & Git

Adicione a seguinte linha ao seu ~/.profile:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

Adicione asdf.sh ao ~/.profile através do comando:

shell
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
POSIX Shell & Pacman

Adicione a seguinte linha ao seu ~/.profile:

shell
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á.

4. Instalando um plugin

Para demonstração, vamos instalar e configurar o Node.js através do plugin asdf-nodejs.

Dependências dos plugins

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:

SOInstalação de dependencia
Linux (Debian)apt-get install dirmngr gpg curl gawk
macOSbrew install gpg gawk

Devemos instalar instalar as dependências primeiro, pois alguns plugins exigem algumas ações após a instalação.

Instalando o plugin

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. Instalando uma versão

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:

shell
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.

6. Definindo uma versã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.

Versões globais

Os padrões globais são gerenciados em $HOME/.tool-versions. Defina uma versão global através do comando:

shell
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

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:

shell
asdf local nodejs latest

$PWD/.tool-versions ficará assim:

nodejs 16.5.0

Usando arquivos de versão existentes

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.

Setup finalizado!

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:

`,79)]))}const g=a(l,[["render",n]]);export{k as __pageData,g as default}; diff --git a/assets/pt-br_guide_getting-started.md.B2F3eseE.lean.js b/assets/pt-br_guide_getting-started.md.B2F3eseE.lean.js new file mode 100644 index 00000000..8339e22c --- /dev/null +++ b/assets/pt-br_guide_getting-started.md.B2F3eseE.lean.js @@ -0,0 +1,13 @@ +import{_ as a,c as i,a2 as e,o as t}from"./chunks/framework.BQmytedh.js";const k=JSON.parse('{"title":"Começando","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/guide/getting-started.md","filePath":"pt-br/guide/getting-started.md","lastUpdated":1734536933000}'),l={name:"pt-br/guide/getting-started.md"};function n(o,s,h,d,p,r){return t(),i("div",null,s[0]||(s[0]=[e(`

Começando

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:

  1. Instalar as dependências
  2. Instalar o núcleo do asdf
  3. Adicionar o asdf ao seu shell
  4. Instalar um plugin para cada ferramenta que você gostaria de gerenciar
  5. Instalar uma versão desta ferramenta
  6. Definir uma versão global e uma versão local através do arquivo de configuração .tool-versions

Você pode também acompanhar o passo a passo da instalação através deste vídeo.

1. Instalando as dependências

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).

OSPackage ManagerCommand
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

Note

sudo may be required depending on your system configuration.

2. Download asdf

Official Download

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.15.0

Community Supported Download Methods

We highly recommend using the official git method.

MethodCommand
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper

3. Adicionando ao seu shell

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:

Bash & Git

Adicione esta linha ao seu ~/.bashrc:

shell
. "$HOME/.asdf/asdf.sh"

O auto completar deve ser configurado manualmente a partir da adição da seguinte linha ao .bashrc:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

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:

shell
. "$HOME/.asdf/asdf.sh"

O auto completar deve ser configurado manualmente a partir da adição da seguinte linha ao .bash_profile:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

Adicione asdf.sh ao ~/.bashrc através do comando:

shell
echo -e "\\n. $(brew --prefix asdf)/asdf.sh" >> ~/.bashrc

O auto completar deve ser configurado seguindo as instruções da Homebrew, ou as seguintes:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Bash & Homebrew (macOS)

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:

shell
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:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Bash & Pacman

Adicione a seguinte linha ao seu ~/.bashrc:

shell
. /opt/asdf-vm/asdf.sh

O pacote bash-completion precisa ser instalado para o auto completar funcionar.

Fish & Git

Adicione a seguinte linha ao seu ~/.config/fish/config.fish:

shell
source ~/.asdf/asdf.fish

O auto completar deve ser configurado manualmente através do seguinte comando:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

Adicione asdf.fish ao seu ~/.config/fish/config.fish através do comando:

shell
echo -e "\\nsource "(brew --prefix asdf)"/asdf.fish" >> ~/.config/fish/config.fish

O auto completar é configurado pela Homebrew para o fish shell.

Fish & Pacman

Adicione a seguinte linha ao seu ~/.config/fish/config.fish:

shell
source /opt/asdf-vm/asdf.fish

O auto completar é configurado automaticamente durante a instalação do pacote AUR.

Elvish & Git

Adicione asdf.elv ao ~/.config/elvish/rc.elv através do comando:

shell
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

Elvish & Homebrew

Adicione asdf.elv ao ~/.config/elvish/rc.elv através do comando:

shell
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

Elvish & Pacman

Adicione asdf.elv ao ~/.config/elvish/rc.elv através do comando:

shell
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

ZSH & Git

Adicione a seguinte linha ao seu ~/.zshrc:

shell
. "$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:

shell
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • Se você está utilizando uma configuração compinit customizada, garanta que compinit esteja abaixo chamada asdf.sh
  • Se você está utilizando uma configuração 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.

ZSH & Homebrew

Adicione asdf.sh ao seu ~/.zshrc através do comando:

shell
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.

ZSH & Pacman

Adicione a seguinte linha ao seu ~/.zshrc:

shell
. /opt/asdf-vm/asdf.sh
PowerShell Core & Git

Adicione a seguinte linha ao seu ~/.config/powershell/profile.ps1:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

Adicione asdf.ps1 ao seu ~/.config/powershell/profile.ps1 através do comando:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

Adicione a seguinte linha ao seu ~/.config/powershell/profile.ps1:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

Adicione asdf.nu ao seu ~/.config/nushell/config.nu através do comando:

shell
"\\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

Nushell & Homebrew

Adicione asdf.nu ao seu ~/.config/nushell/config.nu através do comando:

shell
"\\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

Nushell & Pacman

Adicione asdf.nu ao seu ~/.config/nushell/config.nu através do comando:

shell
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

Ao concluir atualizará automaticamente

POSIX Shell & Git

Adicione a seguinte linha ao seu ~/.profile:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

Adicione asdf.sh ao ~/.profile através do comando:

shell
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
POSIX Shell & Pacman

Adicione a seguinte linha ao seu ~/.profile:

shell
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á.

4. Instalando um plugin

Para demonstração, vamos instalar e configurar o Node.js através do plugin asdf-nodejs.

Dependências dos plugins

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:

SOInstalação de dependencia
Linux (Debian)apt-get install dirmngr gpg curl gawk
macOSbrew install gpg gawk

Devemos instalar instalar as dependências primeiro, pois alguns plugins exigem algumas ações após a instalação.

Instalando o plugin

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. Instalando uma versão

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:

shell
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.

6. Definindo uma versã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.

Versões globais

Os padrões globais são gerenciados em $HOME/.tool-versions. Defina uma versão global através do comando:

shell
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

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:

shell
asdf local nodejs latest

$PWD/.tool-versions ficará assim:

nodejs 16.5.0

Usando arquivos de versão existentes

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.

Setup finalizado!

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:

`,79)]))}const g=a(l,[["render",n]]);export{k as __pageData,g as default}; diff --git a/assets/pt-br_guide_introduction.md.DuS2bVcZ.js b/assets/pt-br_guide_introduction.md.DuS2bVcZ.js new file mode 100644 index 00000000..da427bfe --- /dev/null +++ b/assets/pt-br_guide_introduction.md.DuS2bVcZ.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as s}from"./chunks/framework.BQmytedh.js";const p=JSON.parse('{"title":"Introdução","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/guide/introduction.md","filePath":"pt-br/guide/introduction.md","lastUpdated":1643288544000}'),t={name:"pt-br/guide/introduction.md"};function n(i,e,d,c,m,u){return s(),o("div",null,e[0]||(e[0]=[r('

Introduçã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.

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.

Funcionamento

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.

Projetos relacionados

nvm / n / rbenv etc

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.

direnv

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.

Homebrew

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.

NixOS

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.

Por que usar o asdf?

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.

',26)]))}const f=a(t,[["render",n]]);export{p as __pageData,f as default}; diff --git a/assets/pt-br_guide_introduction.md.DuS2bVcZ.lean.js b/assets/pt-br_guide_introduction.md.DuS2bVcZ.lean.js new file mode 100644 index 00000000..da427bfe --- /dev/null +++ b/assets/pt-br_guide_introduction.md.DuS2bVcZ.lean.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as s}from"./chunks/framework.BQmytedh.js";const p=JSON.parse('{"title":"Introdução","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/guide/introduction.md","filePath":"pt-br/guide/introduction.md","lastUpdated":1643288544000}'),t={name:"pt-br/guide/introduction.md"};function n(i,e,d,c,m,u){return s(),o("div",null,e[0]||(e[0]=[r('

Introduçã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.

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.

Funcionamento

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.

Projetos relacionados

nvm / n / rbenv etc

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.

direnv

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.

Homebrew

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.

NixOS

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.

Por que usar o asdf?

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.

',26)]))}const f=a(t,[["render",n]]);export{p as __pageData,f as default}; diff --git a/assets/pt-br_index.md.ByjSzZoa.js b/assets/pt-br_index.md.ByjSzZoa.js new file mode 100644 index 00000000..eed15c14 --- /dev/null +++ b/assets/pt-br_index.md.ByjSzZoa.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a}from"./chunks/framework.BQmytedh.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"asdf","text":"O Gerenciador de Múltiplas Versões de Tempo de Execução","tagline":"Gerencie todas as suas versões de tempo de execução com uma ferramenta!","actions":[{"theme":"brand","text":"Começar","link":"/pt-br/guide/getting-started"},{"theme":"alt","text":"O que é asdf?","link":"/pt-br/guide/introduction"},{"theme":"alt","text":"Ver no GitHub","link":"https://github.com/asdf-vm/asdf"}]},"features":[{"title":"Uma super ferramenta","details":"Gerencie cada um dos runtimes e ferramentas dos seus projetos com uma única ferramenta de CLI","icon":"🎉"},{"title":"Plugins","details":"Grande ecossistema de runtimes e ferramentas existentes. API simples para adicionar suporte para novas ferramentas conforme necessário!","icon":"🔌"},{"title":"Compatível com vários arquivos de configuração","details":"Suporte para arquivos de configuração existentes .nvmrc, .node-version, .ruby-version para uma migração tranquila!","icon":"⏮"},{"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","icon":"📄"},{"title":"Shells","details":"Suporta Bash, ZSH, Fish & Elvish com autocomplete.","icon":"🐚"},{"title":"GitHub Actions","details":"Fornece um GitHub Action para instalar e utilizar seu .tool-verions em seu fluxo de trabalho CICD.","icon":"🤖"}]},"headers":[],"relativePath":"pt-br/index.md","filePath":"pt-br/index.md","lastUpdated":1700090238000}'),r={name:"pt-br/index.md"};function s(o,i,n,d,m,c){return a(),t("div")}const p=e(r,[["render",s]]);export{l as __pageData,p as default}; diff --git a/assets/pt-br_index.md.ByjSzZoa.lean.js b/assets/pt-br_index.md.ByjSzZoa.lean.js new file mode 100644 index 00000000..eed15c14 --- /dev/null +++ b/assets/pt-br_index.md.ByjSzZoa.lean.js @@ -0,0 +1 @@ +import{_ as e,c as t,o as a}from"./chunks/framework.BQmytedh.js";const l=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"asdf","text":"O Gerenciador de Múltiplas Versões de Tempo de Execução","tagline":"Gerencie todas as suas versões de tempo de execução com uma ferramenta!","actions":[{"theme":"brand","text":"Começar","link":"/pt-br/guide/getting-started"},{"theme":"alt","text":"O que é asdf?","link":"/pt-br/guide/introduction"},{"theme":"alt","text":"Ver no GitHub","link":"https://github.com/asdf-vm/asdf"}]},"features":[{"title":"Uma super ferramenta","details":"Gerencie cada um dos runtimes e ferramentas dos seus projetos com uma única ferramenta de CLI","icon":"🎉"},{"title":"Plugins","details":"Grande ecossistema de runtimes e ferramentas existentes. API simples para adicionar suporte para novas ferramentas conforme necessário!","icon":"🔌"},{"title":"Compatível com vários arquivos de configuração","details":"Suporte para arquivos de configuração existentes .nvmrc, .node-version, .ruby-version para uma migração tranquila!","icon":"⏮"},{"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","icon":"📄"},{"title":"Shells","details":"Suporta Bash, ZSH, Fish & Elvish com autocomplete.","icon":"🐚"},{"title":"GitHub Actions","details":"Fornece um GitHub Action para instalar e utilizar seu .tool-verions em seu fluxo de trabalho CICD.","icon":"🤖"}]},"headers":[],"relativePath":"pt-br/index.md","filePath":"pt-br/index.md","lastUpdated":1700090238000}'),r={name:"pt-br/index.md"};function s(o,i,n,d,m,c){return a(),t("div")}const p=e(r,[["render",s]]);export{l as __pageData,p as default}; diff --git a/assets/pt-br_manage_commands.md.Dr6_3Llb.js b/assets/pt-br_manage_commands.md.Dr6_3Llb.js new file mode 100644 index 00000000..06551af6 --- /dev/null +++ b/assets/pt-br_manage_commands.md.Dr6_3Llb.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as e,o as p}from"./chunks/framework.BQmytedh.js";const m=JSON.parse('{"title":"All Commands","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/manage/commands.md","filePath":"pt-br/manage/commands.md","lastUpdated":1687069487000}'),l={name:"pt-br/manage/commands.md"};function t(i,s,o,c,r,d){return p(),n("div",null,s[0]||(s[0]=[e(`

All Commands

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.

txt
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
`,4)]))}const f=a(l,[["render",t]]);export{m as __pageData,f as default}; diff --git a/assets/pt-br_manage_commands.md.Dr6_3Llb.lean.js b/assets/pt-br_manage_commands.md.Dr6_3Llb.lean.js new file mode 100644 index 00000000..06551af6 --- /dev/null +++ b/assets/pt-br_manage_commands.md.Dr6_3Llb.lean.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as e,o as p}from"./chunks/framework.BQmytedh.js";const m=JSON.parse('{"title":"All Commands","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/manage/commands.md","filePath":"pt-br/manage/commands.md","lastUpdated":1687069487000}'),l={name:"pt-br/manage/commands.md"};function t(i,s,o,c,r,d){return p(),n("div",null,s[0]||(s[0]=[e(`

All Commands

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.

txt
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
`,4)]))}const f=a(l,[["render",t]]);export{m as __pageData,f as default}; diff --git a/assets/pt-br_manage_configuration.md.r47RkzYy.js b/assets/pt-br_manage_configuration.md.r47RkzYy.js new file mode 100644 index 00000000..652e0be7 --- /dev/null +++ b/assets/pt-br_manage_configuration.md.r47RkzYy.js @@ -0,0 +1 @@ +import{_ as o,c as a,a2 as s,o as d}from"./chunks/framework.BQmytedh.js";const m=JSON.parse('{"title":"Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/manage/configuration.md","filePath":"pt-br/manage/configuration.md","lastUpdated":1687069487000}'),i={name:"pt-br/manage/configuration.md"};function r(c,e,n,t,l,p){return d(),a("div",null,e[0]||(e[0]=[s('

Configuration

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.

.tool-versions

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 compi
  • path:~/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.

Variáveis de ambiente

  • 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.
',22)]))}const f=o(i,[["render",r]]);export{m as __pageData,f as default}; diff --git a/assets/pt-br_manage_configuration.md.r47RkzYy.lean.js b/assets/pt-br_manage_configuration.md.r47RkzYy.lean.js new file mode 100644 index 00000000..652e0be7 --- /dev/null +++ b/assets/pt-br_manage_configuration.md.r47RkzYy.lean.js @@ -0,0 +1 @@ +import{_ as o,c as a,a2 as s,o as d}from"./chunks/framework.BQmytedh.js";const m=JSON.parse('{"title":"Configuration","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/manage/configuration.md","filePath":"pt-br/manage/configuration.md","lastUpdated":1687069487000}'),i={name:"pt-br/manage/configuration.md"};function r(c,e,n,t,l,p){return d(),a("div",null,e[0]||(e[0]=[s('

Configuration

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.

.tool-versions

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 compi
  • path:~/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.

Variáveis de ambiente

  • 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.
',22)]))}const f=o(i,[["render",r]]);export{m as __pageData,f as default}; diff --git a/assets/pt-br_manage_core.md.Zj8lFw0P.js b/assets/pt-br_manage_core.md.Zj8lFw0P.js new file mode 100644 index 00000000..0dfdecea --- /dev/null +++ b/assets/pt-br_manage_core.md.Zj8lFw0P.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.BQmytedh.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(`

Core

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.

Instalação e configuração

Baseado no Guia de Introdução.

Execute

shell
asdf exec <command> [args...]

Executa o comando shim para a versão atual

Variável de Ambiente

shell
asdf env <command> [util]

Informações

shell
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.

Reshim

shell
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.

Versionamento do Shim

shell
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:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

Atualizar

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:

MethodLatest Stable ReleaseLatest commit on master
asdf (via Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
PacmanObter manualmente um novo PKGBUILD e
reconstruir ou usar suas preferências de AUR.

Desinstalar

Para desinstalar asdf siga os passos:

Bash & Git
  1. Em seu ~/.bashrc remova as linhas do asdf.sh e seus complementos:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. Em seu ~/.bash_profile remova as linhas do asdf.sh e remova seus complementos:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. Em seu ~/.bashrc remova as linhas do asdf.sh e remova seus complementos:
shell
. $(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.

  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

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.

  1. Em seu ~/.bash_profile remova as linhas do asdf.sh e remova seus complementos:
shell
. $(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.

  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. Em seu ~/.bashrc remova as linhas do asdf.sh e seus complementos:
shell
. /opt/asdf-vm/asdf.sh
  1. Desinstale usando seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. Em seu ~/.config/fish/config.fish remova as linhas do asdf.sh:
shell
source ~/.asdf/asdf.fish

e remova os complementos de com esse comando:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. Em seu ~/.config/fish/config.fish remova as linhas do asdf.fish:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. Em seu ~/.config/fish/config.fish remova as linhas do asdf.fish:
shell
source /opt/asdf-vm/asdf.fish
  1. Desinstale usando seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. Em seu ~/.config/elvish/rc.elv remova as linhas que importa o módulo asdf:
shell
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:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Remova o diretório $HOME/.asdf:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Execute este comando para remover todos os arquivos de configuração asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. Em seu ~/.config/elvish/rc.elv remova as linhas que importa o módulo asdf:
shell
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:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Desinstale com seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute este comando para remover todos os arquivos de configuração asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. Em seu ~/.config/elvish/rc.elv remova as linhas que importa o módulo asdf:
shell
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:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Desinstale com seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $ HOME/.asdf:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Execute este comando para remover todos os arquivos de configuração asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. Em seu ~/.zshrc remova as linhas do asdf.sh e seus complementos:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

Ou use ZSH Framework plugin.

  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. Em seu ~/.zshrc remova as linhas do asdf.sh:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. Em seu ~/.zshrc remova as linhas do asdf.sh:
shell
. /opt/asdf-vm/asdf.sh
  1. Desinstale usando seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
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.Zj8lFw0P.lean.js b/assets/pt-br_manage_core.md.Zj8lFw0P.lean.js new file mode 100644 index 00000000..0dfdecea --- /dev/null +++ b/assets/pt-br_manage_core.md.Zj8lFw0P.lean.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.BQmytedh.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(`

Core

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.

Instalação e configuração

Baseado no Guia de Introdução.

Execute

shell
asdf exec <command> [args...]

Executa o comando shim para a versão atual

Variável de Ambiente

shell
asdf env <command> [util]

Informações

shell
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.

Reshim

shell
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.

Versionamento do Shim

shell
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:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

Atualizar

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:

MethodLatest Stable ReleaseLatest commit on master
asdf (via Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
PacmanObter manualmente um novo PKGBUILD e
reconstruir ou usar suas preferências de AUR.

Desinstalar

Para desinstalar asdf siga os passos:

Bash & Git
  1. Em seu ~/.bashrc remova as linhas do asdf.sh e seus complementos:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. Em seu ~/.bash_profile remova as linhas do asdf.sh e remova seus complementos:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. Em seu ~/.bashrc remova as linhas do asdf.sh e remova seus complementos:
shell
. $(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.

  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

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.

  1. Em seu ~/.bash_profile remova as linhas do asdf.sh e remova seus complementos:
shell
. $(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.

  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. Em seu ~/.bashrc remova as linhas do asdf.sh e seus complementos:
shell
. /opt/asdf-vm/asdf.sh
  1. Desinstale usando seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. Em seu ~/.config/fish/config.fish remova as linhas do asdf.sh:
shell
source ~/.asdf/asdf.fish

e remova os complementos de com esse comando:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. Em seu ~/.config/fish/config.fish remova as linhas do asdf.fish:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. Em seu ~/.config/fish/config.fish remova as linhas do asdf.fish:
shell
source /opt/asdf-vm/asdf.fish
  1. Desinstale usando seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. Em seu ~/.config/elvish/rc.elv remova as linhas que importa o módulo asdf:
shell
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:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Remova o diretório $HOME/.asdf:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Execute este comando para remover todos os arquivos de configuração asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. Em seu ~/.config/elvish/rc.elv remova as linhas que importa o módulo asdf:
shell
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:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Desinstale com seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute este comando para remover todos os arquivos de configuração asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. Em seu ~/.config/elvish/rc.elv remova as linhas que importa o módulo asdf:
shell
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:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Desinstale com seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $ HOME/.asdf:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Execute este comando para remover todos os arquivos de configuração asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. Em seu ~/.zshrc remova as linhas do asdf.sh e seus complementos:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

Ou use ZSH Framework plugin.

  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. Em seu ~/.zshrc remova as linhas do asdf.sh:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. Em seu ~/.zshrc remova as linhas do asdf.sh:
shell
. /opt/asdf-vm/asdf.sh
  1. Desinstale usando seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
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.2hxhV7Yu.js b/assets/pt-br_manage_plugins.md.2hxhV7Yu.js new file mode 100644 index 00000000..46adfdaf --- /dev/null +++ b/assets/pt-br_manage_plugins.md.2hxhV7Yu.js @@ -0,0 +1,11 @@ +import{_ as a,c as i,a2 as e,o as t}from"./chunks/framework.BQmytedh.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(`

Plugins

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.

Adicionar

Adicione os plugins via sua Url Git:

shell
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:

shell
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.

Listar Instalados

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

Listar todos nomes abreviados no repositório

shell
asdf plugin list all

Veja Plugins Shortname Index para toda a lista de nomes curtos de plugins.

Atualizar

shell
asdf plugin update --all

Se você quiser atualizar um pacote específico, apenas use.

shell
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)

Remover

bash
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.

Sincronizar nome abreviado no repositório

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:

  • comandos asdf plugin add <name> ou asdf plugin list all disparam a sincronização
  • ocorre uma sincronização se não houver nenhuma nos últimos X minutos
  • X 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.
`,27)]))}const g=a(n,[["render",l]]);export{c as __pageData,g as default}; diff --git a/assets/pt-br_manage_plugins.md.2hxhV7Yu.lean.js b/assets/pt-br_manage_plugins.md.2hxhV7Yu.lean.js new file mode 100644 index 00000000..46adfdaf --- /dev/null +++ b/assets/pt-br_manage_plugins.md.2hxhV7Yu.lean.js @@ -0,0 +1,11 @@ +import{_ as a,c as i,a2 as e,o as t}from"./chunks/framework.BQmytedh.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(`

Plugins

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.

Adicionar

Adicione os plugins via sua Url Git:

shell
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:

shell
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.

Listar Instalados

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

Listar todos nomes abreviados no repositório

shell
asdf plugin list all

Veja Plugins Shortname Index para toda a lista de nomes curtos de plugins.

Atualizar

shell
asdf plugin update --all

Se você quiser atualizar um pacote específico, apenas use.

shell
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)

Remover

bash
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.

Sincronizar nome abreviado no repositório

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:

  • comandos asdf plugin add <name> ou asdf plugin list all disparam a sincronização
  • ocorre uma sincronização se não houver nenhuma nos últimos X minutos
  • X 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.
`,27)]))}const g=a(n,[["render",l]]);export{c as __pageData,g as default}; diff --git a/assets/pt-br_manage_versions.md.CSTMJus-.js b/assets/pt-br_manage_versions.md.CSTMJus-.js new file mode 100644 index 00000000..514d0dd4 --- /dev/null +++ b/assets/pt-br_manage_versions.md.CSTMJus-.js @@ -0,0 +1,30 @@ +import{_ as a,c as i,a2 as e,o as t}from"./chunks/framework.BQmytedh.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(`

Versões

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.

Instalar Versão

shell
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.

Instalar última versão estável

shell
asdf install <name> latest
+# asdf install erlang latest

Instale a última versão estável que inicia com um texto.

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

Listar versões instaladas

shell
asdf list <name>
+# asdf list erlang

Limite as versões que inicie com um determinado texto.

shell
asdf list <name> <version>
+# asdf list erlang 17

Listar todas as versões disponíveis

shell
asdf list all <name>
+# asdf list all erlang

Limite as versões que inicie com um determinado texto.

shell
asdf list all <name> <version>
+# asdf list all erlang 17

Mostrar última versão estável

shell
asdf latest <name>
+# asdf latest erlang

Mostrar última versão estável que inicie com um determinado texto.

shell
asdf latest <name> <version>
+# asdf latest erlang 17

Selecionar versão atual

shell
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.

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

Resposta do sistema de versão

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.

shell
asdf local <name> system
+# asdf local python system

Verificar a versão atual

shell
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)

Desinstalar versão

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

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, 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:

shell
# 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

Ignorando shims do asdf

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.CSTMJus-.lean.js b/assets/pt-br_manage_versions.md.CSTMJus-.lean.js new file mode 100644 index 00000000..514d0dd4 --- /dev/null +++ b/assets/pt-br_manage_versions.md.CSTMJus-.lean.js @@ -0,0 +1,30 @@ +import{_ as a,c as i,a2 as e,o as t}from"./chunks/framework.BQmytedh.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(`

Versões

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.

Instalar Versão

shell
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.

Instalar última versão estável

shell
asdf install <name> latest
+# asdf install erlang latest

Instale a última versão estável que inicia com um texto.

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

Listar versões instaladas

shell
asdf list <name>
+# asdf list erlang

Limite as versões que inicie com um determinado texto.

shell
asdf list <name> <version>
+# asdf list erlang 17

Listar todas as versões disponíveis

shell
asdf list all <name>
+# asdf list all erlang

Limite as versões que inicie com um determinado texto.

shell
asdf list all <name> <version>
+# asdf list all erlang 17

Mostrar última versão estável

shell
asdf latest <name>
+# asdf latest erlang

Mostrar última versão estável que inicie com um determinado texto.

shell
asdf latest <name> <version>
+# asdf latest erlang 17

Selecionar versão atual

shell
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.

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

Resposta do sistema de versão

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.

shell
asdf local <name> system
+# asdf local python system

Verificar a versão atual

shell
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)

Desinstalar versão

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

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, 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:

shell
# 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

Ignorando shims do asdf

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.CHEVJOJv.js b/assets/pt-br_more_community-projects.md.CHEVJOJv.js new file mode 100644 index 00000000..feb14830 --- /dev/null +++ b/assets/pt-br_more_community-projects.md.CHEVJOJv.js @@ -0,0 +1 @@ +import{_ as t,c as o,a2 as r,o as a}from"./chunks/framework.BQmytedh.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('

Community Projects

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.

',4)]))}const f=t(s,[["render",c]]);export{u as __pageData,f as default}; diff --git a/assets/pt-br_more_community-projects.md.CHEVJOJv.lean.js b/assets/pt-br_more_community-projects.md.CHEVJOJv.lean.js new file mode 100644 index 00000000..feb14830 --- /dev/null +++ b/assets/pt-br_more_community-projects.md.CHEVJOJv.lean.js @@ -0,0 +1 @@ +import{_ as t,c as o,a2 as r,o as a}from"./chunks/framework.BQmytedh.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('

Community Projects

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.

',4)]))}const f=t(s,[["render",c]]);export{u as __pageData,f as default}; diff --git a/assets/pt-br_more_faq.md.BTGkaPN-.js b/assets/pt-br_more_faq.md.BTGkaPN-.js new file mode 100644 index 00000000..8aa1287d --- /dev/null +++ b/assets/pt-br_more_faq.md.BTGkaPN-.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as s}from"./chunks/framework.BQmytedh.js";const p=JSON.parse('{"title":"Perguntas frequentes","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/more/faq.md","filePath":"pt-br/more/faq.md","lastUpdated":1671778129000}'),t={name:"pt-br/more/faq.md"};function n(i,e,d,c,u,l){return s(),o("div",null,e[0]||(e[0]=[r('

Perguntas frequentes

Aqui estão algumas perguntas comuns sobre asdf.

Suporte WSL1?

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.

Suporte WSL2?

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.

Exectable recém-instalado não está funcionando?

Acabei de instalar o npm -g yarn, mas não consigo executar o yarn. 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).

Shell não detecta shims recém-instalados?

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.

',13)]))}const f=a(t,[["render",n]]);export{p as __pageData,f as default}; diff --git a/assets/pt-br_more_faq.md.BTGkaPN-.lean.js b/assets/pt-br_more_faq.md.BTGkaPN-.lean.js new file mode 100644 index 00000000..8aa1287d --- /dev/null +++ b/assets/pt-br_more_faq.md.BTGkaPN-.lean.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as s}from"./chunks/framework.BQmytedh.js";const p=JSON.parse('{"title":"Perguntas frequentes","description":"","frontmatter":{},"headers":[],"relativePath":"pt-br/more/faq.md","filePath":"pt-br/more/faq.md","lastUpdated":1671778129000}'),t={name:"pt-br/more/faq.md"};function n(i,e,d,c,u,l){return s(),o("div",null,e[0]||(e[0]=[r('

Perguntas frequentes

Aqui estão algumas perguntas comuns sobre asdf.

Suporte WSL1?

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.

Suporte WSL2?

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.

Exectable recém-instalado não está funcionando?

Acabei de instalar o npm -g yarn, mas não consigo executar o yarn. 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).

Shell não detecta shims recém-instalados?

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.

',13)]))}const f=a(t,[["render",n]]);export{p as __pageData,f as default}; diff --git a/assets/pt-br_more_thanks.md.Bvo3xrmB.js b/assets/pt-br_more_thanks.md.Bvo3xrmB.js new file mode 100644 index 00000000..05a461ef --- /dev/null +++ b/assets/pt-br_more_thanks.md.Bvo3xrmB.js @@ -0,0 +1 @@ +import{_ as r,c as t,a2 as a,o}from"./chunks/framework.BQmytedh.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('

Créditos

Eu (@HashNuke), febre alta, resfriado e tosse.

Copyright 2014 até o final dos tempos (MIT License)

Mantenedores

Contribuidores

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.Bvo3xrmB.lean.js b/assets/pt-br_more_thanks.md.Bvo3xrmB.lean.js new file mode 100644 index 00000000..05a461ef --- /dev/null +++ b/assets/pt-br_more_thanks.md.Bvo3xrmB.lean.js @@ -0,0 +1 @@ +import{_ as r,c as t,a2 as a,o}from"./chunks/framework.BQmytedh.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('

Créditos

Eu (@HashNuke), febre alta, resfriado e tosse.

Copyright 2014 até o final dos tempos (MIT License)

Mantenedores

Contribuidores

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.C5Tg4ylk.js b/assets/pt-br_plugins_create.md.C5Tg4ylk.js new file mode 100644 index 00000000..fa7868c4 --- /dev/null +++ b/assets/pt-br_plugins_create.md.C5Tg4ylk.js @@ -0,0 +1,35 @@ +import{_ as s,c as e,a2 as i,o}from"./chunks/framework.BQmytedh.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(`

Criar um plug-in

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 que há em um plug-in

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.

Scripts obrigatórios

  • bin/list-all - lista todas as versões instaláveis
  • bin/download - baixe o código fonte ou binário para a versão especificada
  • bin/install - instala a versão especificada

Variavéis de Ambiente

Todos 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.

bin/list-all

Deve imprimir uma string com uma lista de versões separadas por espaço. A saída de exemplo seria a seguinte:

shell
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.

bin/download

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.

bin/install

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.

Scripts Opcional

scripts bin/help

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.

bin/list-bin-paths

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:

shell
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.

bin/exec-env

Configure o env para executar os binários no pacote.

bin/exec-path

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.

shell
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

bin/uninstall

Desinstala uma versão específica de uma ferramenta.

bin/list-legacy-filenames

Registre arquivos setter adicionais para este plugin. Deve imprimir uma string com uma lista de nomes de arquivos separados por espaços.

shell
.ruby-version .rvmrc

Nota: Isso só se aplica a usuários que habilitaram a opção legacy_version_file em seu ~/.asdfrc.

bin/parse-legacy-file

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.

bin/post-plugin-add

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}

bin/pre-plugin-remove

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}

Comandos de extensão para asdf CLI.

É 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:

shell
foo/
+  lib/commands/
+    command.bash
+    command-bat.bash
+    command-bat-man.bash
+    command-help.bash

Os usuários agora podem executar

shell
$ 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.

Modelos de calços personalizados

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.

Testando plug-ins

asdf contém o comando plugin-test para testar seu plugin. Você pode usá-lo da seguinte forma

shell
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

shell
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.

Exemplo GitHub Action

O repositório asdf-vm/actions fornece uma ação do GitHub para testar seus plugins hospedados no github.

yaml
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

Exemplo de configuração do TravisCI

Aqui está um arquivo .travis.yml de amostra, personalize-o de acordo com suas necessidades

yaml
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'.

Limitação de taxa da API do GitHub

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

shell
cmd="curl -s"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"

Enviando plugins para o repositório oficial de plugins

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.C5Tg4ylk.lean.js b/assets/pt-br_plugins_create.md.C5Tg4ylk.lean.js new file mode 100644 index 00000000..fa7868c4 --- /dev/null +++ b/assets/pt-br_plugins_create.md.C5Tg4ylk.lean.js @@ -0,0 +1,35 @@ +import{_ as s,c as e,a2 as i,o}from"./chunks/framework.BQmytedh.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(`

Criar um plug-in

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 que há em um plug-in

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.

Scripts obrigatórios

  • bin/list-all - lista todas as versões instaláveis
  • bin/download - baixe o código fonte ou binário para a versão especificada
  • bin/install - instala a versão especificada

Variavéis de Ambiente

Todos 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.

bin/list-all

Deve imprimir uma string com uma lista de versões separadas por espaço. A saída de exemplo seria a seguinte:

shell
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.

bin/download

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.

bin/install

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.

Scripts Opcional

scripts bin/help

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.

bin/list-bin-paths

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:

shell
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.

bin/exec-env

Configure o env para executar os binários no pacote.

bin/exec-path

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.

shell
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

bin/uninstall

Desinstala uma versão específica de uma ferramenta.

bin/list-legacy-filenames

Registre arquivos setter adicionais para este plugin. Deve imprimir uma string com uma lista de nomes de arquivos separados por espaços.

shell
.ruby-version .rvmrc

Nota: Isso só se aplica a usuários que habilitaram a opção legacy_version_file em seu ~/.asdfrc.

bin/parse-legacy-file

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.

bin/post-plugin-add

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}

bin/pre-plugin-remove

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}

Comandos de extensão para asdf CLI.

É 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:

shell
foo/
+  lib/commands/
+    command.bash
+    command-bat.bash
+    command-bat-man.bash
+    command-help.bash

Os usuários agora podem executar

shell
$ 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.

Modelos de calços personalizados

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.

Testando plug-ins

asdf contém o comando plugin-test para testar seu plugin. Você pode usá-lo da seguinte forma

shell
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

shell
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.

Exemplo GitHub Action

O repositório asdf-vm/actions fornece uma ação do GitHub para testar seus plugins hospedados no github.

yaml
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

Exemplo de configuração do TravisCI

Aqui está um arquivo .travis.yml de amostra, personalize-o de acordo com suas necessidades

yaml
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'.

Limitação de taxa da API do GitHub

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

shell
cmd="curl -s"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"

Enviando plugins para o repositório oficial de plugins

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.BjfE0TmN.css b/assets/style.BjfE0TmN.css new file mode 100644 index 00000000..3ae76a81 --- /dev/null +++ b/assets/style.BjfE0TmN.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, 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")}.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;-webkit-user-select:none;user-select:none;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-93dc4167]{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-93dc4167]:active{transition:color .1s,border-color .1s,background-color .1s}.VPButton.medium[data-v-93dc4167]{border-radius:20px;padding:0 20px;line-height:38px;font-size:14px}.VPButton.big[data-v-93dc4167]{border-radius:24px;padding:0 24px;line-height:46px;font-size:16px}.VPButton.brand[data-v-93dc4167]{border-color:var(--vp-button-brand-border);color:var(--vp-button-brand-text);background-color:var(--vp-button-brand-bg)}.VPButton.brand[data-v-93dc4167]: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-93dc4167]: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-93dc4167]{border-color:var(--vp-button-alt-border);color:var(--vp-button-alt-text);background-color:var(--vp-button-alt-bg)}.VPButton.alt[data-v-93dc4167]: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-93dc4167]: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-93dc4167]{border-color:var(--vp-button-sponsor-border);color:var(--vp-button-sponsor-text);background-color:var(--vp-button-sponsor-bg)}.VPButton.sponsor[data-v-93dc4167]: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-93dc4167]: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-7eeeb2dc]{margin:12px -12px 0;border-top:1px solid var(--vp-c-divider);padding:12px 12px 0}.link[data-v-7eeeb2dc]{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-7eeeb2dc]:hover{color:var(--vp-c-brand-1);background-color:var(--vp-c-default-soft)}.link.active[data-v-7eeeb2dc]{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-bfe7971f]{position:relative}.VPFlyout[data-v-bfe7971f]:hover{color:var(--vp-c-brand-1);transition:color .25s}.VPFlyout:hover .text[data-v-bfe7971f]{color:var(--vp-c-text-2)}.VPFlyout:hover .icon[data-v-bfe7971f]{fill:var(--vp-c-text-2)}.VPFlyout.active .text[data-v-bfe7971f]{color:var(--vp-c-brand-1)}.VPFlyout.active:hover .text[data-v-bfe7971f]{color:var(--vp-c-brand-2)}.button[aria-expanded=false]+.menu[data-v-bfe7971f]{opacity:0;visibility:hidden;transform:translateY(0)}.VPFlyout:hover .menu[data-v-bfe7971f],.button[aria-expanded=true]+.menu[data-v-bfe7971f]{opacity:1;visibility:visible;transform:translateY(0)}.button[data-v-bfe7971f]{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-bfe7971f]{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-bfe7971f]{margin-right:0;font-size:16px}.text-icon[data-v-bfe7971f]{margin-left:4px;font-size:14px}.icon[data-v-bfe7971f]{font-size:20px;transition:fill .25s}.menu[data-v-bfe7971f]{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-60a9a2d3]{display:flex;justify-content:center;align-items:center;width:36px;height:36px;color:var(--vp-c-text-2);transition:color .5s}.VPSocialLink[data-v-60a9a2d3]:hover{color:var(--vp-c-text-1);transition:color .25s}.VPSocialLink[data-v-60a9a2d3]>svg,.VPSocialLink[data-v-60a9a2d3]>[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-815115f5]{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-815115f5],.VPNavBarMenuLink[data-v-815115f5]: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-9f43907a]{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-9f43907a]{flex-shrink:0}.VPNavBarTitle.has-sidebar .title[data-v-9f43907a]{border-bottom-color:var(--vp-c-divider)}}[data-v-9f43907a] .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-fa963d97]{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-fa963d97]:hover{color:var(--vp-c-brand-1)}.VPNavScreenMenuGroupLink[data-v-e04f3e85]{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-e04f3e85]: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-68e678c9]{position:fixed;z-index:100;top:0;right:0;bottom:0;left:0;display:flex}.backdrop[data-v-68e678c9]{position:absolute;top:0;right:0;bottom:0;left:0;background:var(--vp-backdrop-bg-color);transition:opacity .5s}.shell[data-v-68e678c9]{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-68e678c9]{margin:0;width:100vw;height:100vh;max-height:none;border-radius:0}}.search-bar[data-v-68e678c9]{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-68e678c9]{padding:0 8px}}.search-bar[data-v-68e678c9]:focus-within{border-color:var(--vp-c-brand-1)}.local-search-icon[data-v-68e678c9]{display:block;font-size:18px}.navigate-icon[data-v-68e678c9]{display:block;font-size:14px}.search-icon[data-v-68e678c9]{margin:8px}@media (max-width: 767px){.search-icon[data-v-68e678c9]{display:none}}.search-input[data-v-68e678c9]{padding:6px 12px;font-size:inherit;width:100%}@media (max-width: 767px){.search-input[data-v-68e678c9]{padding:6px 4px}}.search-actions[data-v-68e678c9]{display:flex;gap:4px}@media (any-pointer: coarse){.search-actions[data-v-68e678c9]{gap:8px}}@media (min-width: 769px){.search-actions.before[data-v-68e678c9]{display:none}}.search-actions button[data-v-68e678c9]{padding:8px}.search-actions button[data-v-68e678c9]:not([disabled]):hover,.toggle-layout-button.detailed-list[data-v-68e678c9]{color:var(--vp-c-brand-1)}.search-actions button.clear-button[data-v-68e678c9]:disabled{opacity:.37}.search-keyboard-shortcuts[data-v-68e678c9]{font-size:.8rem;opacity:75%;display:flex;flex-wrap:wrap;gap:16px;line-height:14px}.search-keyboard-shortcuts span[data-v-68e678c9]{display:flex;align-items:center;gap:4px}@media (max-width: 767px){.search-keyboard-shortcuts[data-v-68e678c9]{display:none}}.search-keyboard-shortcuts kbd[data-v-68e678c9]{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-68e678c9]{display:flex;flex-direction:column;gap:6px;overflow-x:hidden;overflow-y:auto;overscroll-behavior:contain}.result[data-v-68e678c9]{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-68e678c9]{margin:12px;width:100%;overflow:hidden}@media (max-width: 767px){.result>div[data-v-68e678c9]{margin:8px}}.titles[data-v-68e678c9]{display:flex;flex-wrap:wrap;gap:4px;position:relative;z-index:1001;padding:2px 0}.title[data-v-68e678c9]{display:flex;align-items:center;gap:4px}.title.main[data-v-68e678c9]{font-weight:500}.title-icon[data-v-68e678c9]{opacity:.5;font-weight:500;color:var(--vp-c-brand-1)}.title svg[data-v-68e678c9]{opacity:.5}.result.selected[data-v-68e678c9]{--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-68e678c9]{position:relative}.excerpt[data-v-68e678c9]{opacity:50%;pointer-events:none;max-height:140px;overflow:hidden;position:relative;margin-top:4px}.result.selected .excerpt[data-v-68e678c9]{opacity:1}.excerpt[data-v-68e678c9] *{font-size:.8rem!important;line-height:130%!important}.titles[data-v-68e678c9] mark,.excerpt[data-v-68e678c9] 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-68e678c9] .vp-code-group .tabs{display:none}.excerpt[data-v-68e678c9] .vp-code-group div[class*=language-]{border-radius:8px!important}.excerpt-gradient-bottom[data-v-68e678c9]{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-68e678c9]{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-68e678c9],.result.selected .title-icon[data-v-68e678c9]{color:var(--vp-c-brand-1)!important}.no-results[data-v-68e678c9]{font-size:.9rem;text-align:center;padding:12px}svg[data-v-68e678c9]{flex:none} diff --git a/assets/zh-hans_contribute_core.md.BeVZjd7j.js b/assets/zh-hans_contribute_core.md.BeVZjd7j.js new file mode 100644 index 00000000..e40e1225 --- /dev/null +++ b/assets/zh-hans_contribute_core.md.BeVZjd7j.js @@ -0,0 +1,25 @@ +import{_ as a,c as e,a2 as i,o as t}from"./chunks/framework.BQmytedh.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

asdf 核心贡献指南.

初始化安装

在 Github 上 fork asdf 并且/或者使用 Git 克隆默认分支:

shell
# 克隆你 fork 的 asdf
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# 或者直接克隆 asdf
+git clone https://github.com/asdf-vm/asdf.git

核心开发所需的工具都列举在这个存储库的 .tool-versions 文件中。如果你想要使用 asdf 自身来管理它,请使用以下命令添加这些插件:

shell
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

shell
asdf install

在本地机器的开发过程中不使用 asdf 来管理工具 或许 对你有帮助,因为你可能需要打破某些可能会影响到你的开发工具链的功能。以下是所需工具的原始列表:

  • bats-core:Bash 自动化测试系统,用于单元测试 Bash 或 POSIX 兼容脚本。
  • shellcheck:Shell 脚本的静态分析工具。
  • shfmt:支持 Bash 的 Shell 解析器、格式化器和解释器;包含 shfmt。

开发

如果你想要在不更改已安装的 asdf 的情况下尝试应用你的更改,可以将 $ASDF_DIR 变量设置为克隆存储库的路径,并临时将目录的 binshims 目录添加到你的路径中。

最好在提交或推送到远程之前,在本地做好格式化、lint 检查和测试你的代码。可以使用以下脚本/命令:

shell
# 脚本检查
+./scripts/shellcheck.bash
+
+# 格式化
+./scripts/shfmt.bash
+
+# 测试:所有案例
+bats test/
+# 测试:特定命令
+bats test/list_commands.bash

提示

增加测试! - 新特性需要进行测试,并加快错误修复的审查速度。请在创建拉取请求之前覆盖新的代码路径。查看 bats-core 文档 了解更多。

Bats 测试

强烈建议在编写测试之前检查现有的测试套件和 bats-core 文档

Bats 调试有时可能很困难。使用带有 -t 标识的 TAP 输出将使你能够在测试执行期间打印带有特殊文件描述符 >&3 的输出,从而简化调试。例如:

shell
# 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> 的所有类型包含: featfixdocsstylerefactorperftestbuildcichorerevert

  • !:表示重大更改
  • fix:将会创建一个新的 SemVer patch 补丁
  • feat:将会创建一个新的 SemVer minor 小版本
  • <type>!:将会创建一个新的 SemVer major 大版本

拉取请求标题必须遵循这种格式。

提示

请使用约定式提交信息格式作为拉取请求标题。

Docker 镜像

asdf-alpineasdf-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.BeVZjd7j.lean.js b/assets/zh-hans_contribute_core.md.BeVZjd7j.lean.js new file mode 100644 index 00000000..e40e1225 --- /dev/null +++ b/assets/zh-hans_contribute_core.md.BeVZjd7j.lean.js @@ -0,0 +1,25 @@ +import{_ as a,c as e,a2 as i,o as t}from"./chunks/framework.BQmytedh.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

asdf 核心贡献指南.

初始化安装

在 Github 上 fork asdf 并且/或者使用 Git 克隆默认分支:

shell
# 克隆你 fork 的 asdf
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# 或者直接克隆 asdf
+git clone https://github.com/asdf-vm/asdf.git

核心开发所需的工具都列举在这个存储库的 .tool-versions 文件中。如果你想要使用 asdf 自身来管理它,请使用以下命令添加这些插件:

shell
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

shell
asdf install

在本地机器的开发过程中不使用 asdf 来管理工具 或许 对你有帮助,因为你可能需要打破某些可能会影响到你的开发工具链的功能。以下是所需工具的原始列表:

  • bats-core:Bash 自动化测试系统,用于单元测试 Bash 或 POSIX 兼容脚本。
  • shellcheck:Shell 脚本的静态分析工具。
  • shfmt:支持 Bash 的 Shell 解析器、格式化器和解释器;包含 shfmt。

开发

如果你想要在不更改已安装的 asdf 的情况下尝试应用你的更改,可以将 $ASDF_DIR 变量设置为克隆存储库的路径,并临时将目录的 binshims 目录添加到你的路径中。

最好在提交或推送到远程之前,在本地做好格式化、lint 检查和测试你的代码。可以使用以下脚本/命令:

shell
# 脚本检查
+./scripts/shellcheck.bash
+
+# 格式化
+./scripts/shfmt.bash
+
+# 测试:所有案例
+bats test/
+# 测试:特定命令
+bats test/list_commands.bash

提示

增加测试! - 新特性需要进行测试,并加快错误修复的审查速度。请在创建拉取请求之前覆盖新的代码路径。查看 bats-core 文档 了解更多。

Bats 测试

强烈建议在编写测试之前检查现有的测试套件和 bats-core 文档

Bats 调试有时可能很困难。使用带有 -t 标识的 TAP 输出将使你能够在测试执行期间打印带有特殊文件描述符 >&3 的输出,从而简化调试。例如:

shell
# 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> 的所有类型包含: featfixdocsstylerefactorperftestbuildcichorerevert

  • !:表示重大更改
  • fix:将会创建一个新的 SemVer patch 补丁
  • feat:将会创建一个新的 SemVer minor 小版本
  • <type>!:将会创建一个新的 SemVer major 大版本

拉取请求标题必须遵循这种格式。

提示

请使用约定式提交信息格式作为拉取请求标题。

Docker 镜像

asdf-alpineasdf-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.DNvwQkgi.js b/assets/zh-hans_contribute_documentation.md.DNvwQkgi.js new file mode 100644 index 00000000..80ae6f76 --- /dev/null +++ b/assets/zh-hans_contribute_documentation.md.DNvwQkgi.js @@ -0,0 +1,29 @@ +import{_ as a,c as i,a2 as e,o as n}from"./chunks/framework.BQmytedh.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 克隆默认分支:

shell
# 克隆你 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 进行管理。使用以下命令添加插件:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

使用以下命令安装工具版本:

shell
asdf install
  • Node.js:基于 Chrome 的 V8 引擎的 JavaScript 运行环境。

根据 docs/package.json 文件安装 Node.js 依赖:

shell
npm install

开发

Vuepress (v2) 是我们用来构建 asdf 文档网站的静态站点生成器(SSG)。它被选中来取代 Docsify.js,因为我们希望在用户没有可用或未启用 JavaScript 时支持仅依靠 HTML。Docsify 无法做到这一点。除此之外,两者特性集合大致相同,重点是 Vuepress 可以用最少的配置编写 Markdown 文件。

package.json 包含了开发所需的脚本:

@code json{3-5}

启动本地开发服务器:

shell
npm run dev

在提交之前格式化代码:

shell
npm run format

拉取请求、发布以及约定式提交

asdf 正在使用依赖 PR 标题中的约定式提交的自动化发布流水线。具体的文档可以查看 核心贡献指南.

当为文档更改创建 PR 请求时,请确保 PR 标题使用了约定式提交类型 docs 以及 docs: <description> 的格式。

Vuepress

网站的配置包含在几个 JavaScript 文件中,其中 JS 对象用于表示配置。它们是:

  • docs/.vuepress/config.js:网站的根配置文件。请查看 Vuepress 文档 了解更多详情。

为了简化根配置文件,更大的 JS 对象表示 导航栏和侧边栏 配置已经被提取并按照语言类型分隔开来。请参考以下文件:

  • docs/.vuepress/navbar.js
  • docs/.vuepress/sidebar.js

这些配置的官方文档位于 默认主题参考

I18n 国际化

Vuepress 有一流的国际化支持。根配置文件 docs/.vuepress/config.js 定义了支持的语言类型及其 URL、在选择下拉菜单中的标题以及导航栏/侧边栏配置引用。

导航栏/侧边栏配置在上述配置文件中捕获,按语言类型分隔开并单独导出。

每种语言的 markdown 内容必须位于与根配置文件中 locale 键同名的目录位置。也就是:

js
{
+  ...
+  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/ 目录下,如下所示:

shell
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.DNvwQkgi.lean.js b/assets/zh-hans_contribute_documentation.md.DNvwQkgi.lean.js new file mode 100644 index 00000000..80ae6f76 --- /dev/null +++ b/assets/zh-hans_contribute_documentation.md.DNvwQkgi.lean.js @@ -0,0 +1,29 @@ +import{_ as a,c as i,a2 as e,o as n}from"./chunks/framework.BQmytedh.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 克隆默认分支:

shell
# 克隆你 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 进行管理。使用以下命令添加插件:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

使用以下命令安装工具版本:

shell
asdf install
  • Node.js:基于 Chrome 的 V8 引擎的 JavaScript 运行环境。

根据 docs/package.json 文件安装 Node.js 依赖:

shell
npm install

开发

Vuepress (v2) 是我们用来构建 asdf 文档网站的静态站点生成器(SSG)。它被选中来取代 Docsify.js,因为我们希望在用户没有可用或未启用 JavaScript 时支持仅依靠 HTML。Docsify 无法做到这一点。除此之外,两者特性集合大致相同,重点是 Vuepress 可以用最少的配置编写 Markdown 文件。

package.json 包含了开发所需的脚本:

@code json{3-5}

启动本地开发服务器:

shell
npm run dev

在提交之前格式化代码:

shell
npm run format

拉取请求、发布以及约定式提交

asdf 正在使用依赖 PR 标题中的约定式提交的自动化发布流水线。具体的文档可以查看 核心贡献指南.

当为文档更改创建 PR 请求时,请确保 PR 标题使用了约定式提交类型 docs 以及 docs: <description> 的格式。

Vuepress

网站的配置包含在几个 JavaScript 文件中,其中 JS 对象用于表示配置。它们是:

  • docs/.vuepress/config.js:网站的根配置文件。请查看 Vuepress 文档 了解更多详情。

为了简化根配置文件,更大的 JS 对象表示 导航栏和侧边栏 配置已经被提取并按照语言类型分隔开来。请参考以下文件:

  • docs/.vuepress/navbar.js
  • docs/.vuepress/sidebar.js

这些配置的官方文档位于 默认主题参考

I18n 国际化

Vuepress 有一流的国际化支持。根配置文件 docs/.vuepress/config.js 定义了支持的语言类型及其 URL、在选择下拉菜单中的标题以及导航栏/侧边栏配置引用。

导航栏/侧边栏配置在上述配置文件中捕获,按语言类型分隔开并单独导出。

每种语言的 markdown 内容必须位于与根配置文件中 locale 键同名的目录位置。也就是:

js
{
+  ...
+  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/ 目录下,如下所示:

shell
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.CkiCExlE.js b/assets/zh-hans_contribute_first-party-plugins.md.CkiCExlE.js new file mode 100644 index 00000000..dc917b11 --- /dev/null +++ b/assets/zh-hans_contribute_first-party-plugins.md.CkiCExlE.js @@ -0,0 +1 @@ +import{_ as a,c as r,a2 as t,o as s}from"./chunks/framework.BQmytedh.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 核心团队已经开发了一些与他们日常工作相关的插件。随时欢迎大家维护和改进这些插件。这些插件所对应的存储库链接如下所示:

对于社区插件,请参考:

',5)]))}const u=a(i,[["render",l]]);export{p as __pageData,u as default}; diff --git a/assets/zh-hans_contribute_first-party-plugins.md.CkiCExlE.lean.js b/assets/zh-hans_contribute_first-party-plugins.md.CkiCExlE.lean.js new file mode 100644 index 00000000..dc917b11 --- /dev/null +++ b/assets/zh-hans_contribute_first-party-plugins.md.CkiCExlE.lean.js @@ -0,0 +1 @@ +import{_ as a,c as r,a2 as t,o as s}from"./chunks/framework.BQmytedh.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 核心团队已经开发了一些与他们日常工作相关的插件。随时欢迎大家维护和改进这些插件。这些插件所对应的存储库链接如下所示:

对于社区插件,请参考:

',5)]))}const u=a(i,[["render",l]]);export{p as __pageData,u as default}; diff --git a/assets/zh-hans_contribute_github-actions.md.DoUyLvGI.js b/assets/zh-hans_contribute_github-actions.md.DoUyLvGI.js new file mode 100644 index 00000000..fcf0b085 --- /dev/null +++ b/assets/zh-hans_contribute_github-actions.md.DoUyLvGI.js @@ -0,0 +1 @@ +import{_ as n,c as s,j as t,a,o as i}from"./chunks/framework.BQmytedh.js";const p=JSON.parse('{"title":"GitHub Actions","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/contribute/github-actions.md","filePath":"zh-hans/contribute/github-actions.md","lastUpdated":1643288544000}'),o={name:"zh-hans/contribute/github-actions.md"};function r(c,e,h,d,u,l){return i(),s("div",null,e[0]||(e[0]=[t("h1",{id:"github-actions",tabindex:"-1"},[a("GitHub Actions "),t("a",{class:"header-anchor",href:"#github-actions","aria-label":'Permalink to "GitHub Actions"'},"​")],-1),t("p",null,[a("感谢你的关注,请参考 "),t("a",{href:"https://github.com/asdf-vm/actions",target:"_blank",rel:"noreferrer"},"asdf actions repo"),a(" 了解现有的问题、对话和贡献指南。")],-1)]))}const f=n(o,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/zh-hans_contribute_github-actions.md.DoUyLvGI.lean.js b/assets/zh-hans_contribute_github-actions.md.DoUyLvGI.lean.js new file mode 100644 index 00000000..fcf0b085 --- /dev/null +++ b/assets/zh-hans_contribute_github-actions.md.DoUyLvGI.lean.js @@ -0,0 +1 @@ +import{_ as n,c as s,j as t,a,o as i}from"./chunks/framework.BQmytedh.js";const p=JSON.parse('{"title":"GitHub Actions","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/contribute/github-actions.md","filePath":"zh-hans/contribute/github-actions.md","lastUpdated":1643288544000}'),o={name:"zh-hans/contribute/github-actions.md"};function r(c,e,h,d,u,l){return i(),s("div",null,e[0]||(e[0]=[t("h1",{id:"github-actions",tabindex:"-1"},[a("GitHub Actions "),t("a",{class:"header-anchor",href:"#github-actions","aria-label":'Permalink to "GitHub Actions"'},"​")],-1),t("p",null,[a("感谢你的关注,请参考 "),t("a",{href:"https://github.com/asdf-vm/actions",target:"_blank",rel:"noreferrer"},"asdf actions repo"),a(" 了解现有的问题、对话和贡献指南。")],-1)]))}const f=n(o,[["render",r]]);export{p as __pageData,f as default}; diff --git a/assets/zh-hans_guide_getting-started.md.DY6HBraC.js b/assets/zh-hans_guide_getting-started.md.DY6HBraC.js new file mode 100644 index 00000000..a22cefe9 --- /dev/null +++ b/assets/zh-hans_guide_getting-started.md.DY6HBraC.js @@ -0,0 +1,13 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.BQmytedh.js";const c=JSON.parse('{"title":"快速入门","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/guide/getting-started.md","filePath":"zh-hans/guide/getting-started.md","lastUpdated":1734536933000}'),l={name:"zh-hans/guide/getting-started.md"};function h(n,s,p,d,o,k){return t(),a("div",null,s[0]||(s[0]=[e(`

快速入门

asdf 安装过程包括:

  1. 安装依赖
  2. 下载 asdf 核心
  3. 安装 asdf
  4. 为每一个你想要管理的工具/运行环境安装插件
  5. 安装工具/运行环境的一个版本
  6. 通过 .tool-versions 配置文件设置全局和项目版本

1. 安装依赖

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).

OSPackage ManagerCommand
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

Note

sudo may be required depending on your system configuration.

2. 下载 asdf

Official Download

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.15.0

Community Supported Download Methods

We highly recommend using the official git method.

MethodCommand
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper

3. 安装 asdf

根据 Shell 脚本、操作系统和安装方法的组合不同,相应的配置也会不同。展开以下与你的系统最匹配的选项:

Bash & Git

~/.bashrc 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.sh"

补全功能必须在 .bashrc 文件中加入以下内容来配置完成:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

如果你正在使用 macOS Catalina 或者更新的版本, 默认的 shell 已经被修改为 ZSH。除非修改回 Bash, 否则请遵循 ZSH 的说明。

~/.bash_profile 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.sh"

补全功能必须在 .bash_profile 文件中使用以下内容手动配置完成:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

使用以下命令将 asdf.sh 加入到 ~/.bashrc 文件中:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bashrc

补全功能将需要 按照 Homebrew 的说明完成配置 或者执行以下命令:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Bash & Homebrew (macOS)

如果你正在使用 macOS Catalina 或者更新的版本, 默认的 shell 已经被修改为 ZSH。除非修改回 Bash, 否则请遵循 ZSH 的说明。

使用以下命令将 asdf.sh 加入到 ~/.bash_profile 文件中:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bash_profile

补全功能将需要 按照 Homebrew 的说明完成配置 或者执行以下命令:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Bash & Pacman

~/.bashrc 文件中加入以下内容:

shell
. /opt/asdf-vm/asdf.sh

为了让补全功能正常工作需要安装 bash-completion

Fish & Git

~/.config/fish/config.fish 文件中加入以下内容:

shell
source ~/.asdf/asdf.fish

补全功能必须按照以下命令手动配置完成:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

使用以下命令将 asdf.fish 加入到 ~/.config/fish/config.fish 文件中:

shell
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

Fish shell 的补全功能可以交给 Homebrew 处理. 很友好!

Fish & Pacman

~/.config/fish/config.fish 文件中加入以下内容:

shell
source /opt/asdf-vm/asdf.fish

补全功能将会在安装过程中由 AUR 包管理器自动配置完成。

Elvish & Git

使用以下命令将 asdf.elv 加入到 ~/.config/elvish/rc.elv 文件中:

shell
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

补全功能将会自动配置。

Elvish & Homebrew

使用以下命令将 asdf.elv 加入到 ~/.config/elvish/rc.elv 文件中:

shell
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

补全功能将会自动配置。

Elvish & Pacman

使用以下命令将 asdf.elv 加入到 ~/.config/elvish/rc.elv 文件中:

shell
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

补全功能将会自动配置。

ZSH & Git

~/.zshrc 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.sh"

或者 使用 ZSH 框架插件,比如 asdf for oh-my-zsh 将会使脚本生效并安装补全功能。

补全功能会被 ZSH 框架 asdf 插件或者通过在 .zshrc 文件中加入以下内容自动配置:

shell
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • 如果你正在使用自定义的 compinit 配置,请确保 compinitasdf.sh 生效位置的下方
  • 如果你正在使用自定义的 compinit 配置和 ZSH 框架,请确保 compinit 在框架生效位置的下方

警告

如果你正在使用 ZSH 框架,有关的 asdf 插件或许需要更新才能通过 fpath 正确地使用最新的 ZSH 补全功能。Oh-My-ZSH asdf 插件还在更新中,请查看 ohmyzsh/ohmyzsh#8837 了解更多。

ZSH & Homebrew

使用以下命令将 asdf.sh 加入到 ~/.zshrc 文件中:

shell
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 了解更多。

ZSH & Pacman

~/.zshrc 文件中加入以下内容:

shell
. /opt/asdf-vm/asdf.sh

补全功能会被放在一个对 ZSH 很友好的位置,但是 ZSH 必须使用自动补全完成配置

PowerShell Core & Git

~/.config/powershell/profile.ps1 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

使用以下命令将 asdf.ps1 加入到 ~/.config/powershell/profile.ps1 文件中:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

~/.config/powershell/profile.ps1 文件中加入以下内容:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

使用以下命令将 asdf.nu 加入到 ~/.config/nushell/config.nu 文件中:

shell
"\\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

补全功能将会自动配置。

Nushell & Homebrew

使用以下命令将 asdf.nu 加入到 ~/.config/nushell/config.nu 文件中:

shell
"\\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

补全功能将会自动配置。

Nushell & Pacman

使用以下命令将 asdf.nu 加入到 ~/.config/nushell/config.nu 文件中:

shell
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

补全功能将会自动配置。

POSIX Shell & Git

~/.profile 文件中加入以下内容:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

使用以下命令将 asdf.sh 加入到 ~/.profile 文件中:

shell
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
POSIX Shell & Pacman

~/.profile 文件中加入以下内容:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

asdf 脚本需要在设置好的 $PATH 之后和已经生效的框架(比如 oh-my-zsh 等等)之后的位置生效。

通常打开一个新的终端标签页来重启你的 shell 让 PATH 更改即时生效。

核心安装完成!

这样就完成了 asdf 核心的安装 🎉

asdf 仅在你安装插件工具和管理它们的版本时才开始真正发挥作用。请继续阅读下面的指南来了解这些是如何做到的。

4. 安装插件

出于演示目的,我们将通过 asdf-nodejs 插件来安装和设置 Node.js

插件依赖

每个插件都有依赖,所以我们需要确认应该列举了这些依赖的插件源码。对于 asdf-nodejs 来说,它们是:

操作系统安装依赖
Linux (Debian)apt-get install dirmngr gpg curl gawk
macOSbrew install gpg gawk

我们应该提前安装这些依赖,因为有些插件有 post-install 钩子。

安装插件

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. 安装指定版本

现在我们已经有了 Node.js 插件,所以我们可以开始安装某个版本了。

我们通过 asdf list all nodejs 可以看到所有可用的版本或者通过 asdf list all nodejs 14 查看版本子集。

我们将只安装最新可用的 latest 版本:

shell
asdf install nodejs latest

注意

asdf 强制使用准确的版本。latest 是一个通过 asdf 来解析到执行时刻的实际版本号的辅助工具。

6. 设置默认版本

asdf 在从当前工作目录一直到 $HOME 目录的所有 .tool-versions 文件中进行工具的版本查找。查找在执行 asdf 管理的工具时实时发生。

警告

如果没有为工具找到指定的版本,则会出现错误asdf current 将显示当前目录中的工具和版本解析结果,或者不存在,以便你可以观察哪些工具将无法执行。

全局

全局默认配置在 $HOME/.tool-versions 文件中进行管理。使用以下命令可以设置一个全局版本:

shell
asdf global nodejs latest

$HOME/.tool-versions 文件内容将会如下所示:

nodejs 16.5.0

某些操作系统已经有一些由系统而非 asdf 安装和管理的工具了,python 就是一个常见的例子。你需要告诉 asdf 将管理权还给系统。版本参考部分 将会引导你。

本地

本地版本被定义在 $PWD/.tool-versions 文件中(当前工作目录)。通常,这将会是一个项目的 Git 存储库。当在你想要的目录执行:

shell
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 来查看它们。命令主要分为三类:

`,80)]))}const g=i(l,[["render",h]]);export{c as __pageData,g as default}; diff --git a/assets/zh-hans_guide_getting-started.md.DY6HBraC.lean.js b/assets/zh-hans_guide_getting-started.md.DY6HBraC.lean.js new file mode 100644 index 00000000..a22cefe9 --- /dev/null +++ b/assets/zh-hans_guide_getting-started.md.DY6HBraC.lean.js @@ -0,0 +1,13 @@ +import{_ as i,c as a,a2 as e,o as t}from"./chunks/framework.BQmytedh.js";const c=JSON.parse('{"title":"快速入门","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/guide/getting-started.md","filePath":"zh-hans/guide/getting-started.md","lastUpdated":1734536933000}'),l={name:"zh-hans/guide/getting-started.md"};function h(n,s,p,d,o,k){return t(),a("div",null,s[0]||(s[0]=[e(`

快速入门

asdf 安装过程包括:

  1. 安装依赖
  2. 下载 asdf 核心
  3. 安装 asdf
  4. 为每一个你想要管理的工具/运行环境安装插件
  5. 安装工具/运行环境的一个版本
  6. 通过 .tool-versions 配置文件设置全局和项目版本

1. 安装依赖

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).

OSPackage ManagerCommand
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

Note

sudo may be required depending on your system configuration.

2. 下载 asdf

Official Download

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.15.0

Community Supported Download Methods

We highly recommend using the official git method.

MethodCommand
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper

3. 安装 asdf

根据 Shell 脚本、操作系统和安装方法的组合不同,相应的配置也会不同。展开以下与你的系统最匹配的选项:

Bash & Git

~/.bashrc 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.sh"

补全功能必须在 .bashrc 文件中加入以下内容来配置完成:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

如果你正在使用 macOS Catalina 或者更新的版本, 默认的 shell 已经被修改为 ZSH。除非修改回 Bash, 否则请遵循 ZSH 的说明。

~/.bash_profile 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.sh"

补全功能必须在 .bash_profile 文件中使用以下内容手动配置完成:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

使用以下命令将 asdf.sh 加入到 ~/.bashrc 文件中:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bashrc

补全功能将需要 按照 Homebrew 的说明完成配置 或者执行以下命令:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bashrc
Bash & Homebrew (macOS)

如果你正在使用 macOS Catalina 或者更新的版本, 默认的 shell 已经被修改为 ZSH。除非修改回 Bash, 否则请遵循 ZSH 的说明。

使用以下命令将 asdf.sh 加入到 ~/.bash_profile 文件中:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.bash_profile

补全功能将需要 按照 Homebrew 的说明完成配置 或者执行以下命令:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\\"" >> ~/.bash_profile
Bash & Pacman

~/.bashrc 文件中加入以下内容:

shell
. /opt/asdf-vm/asdf.sh

为了让补全功能正常工作需要安装 bash-completion

Fish & Git

~/.config/fish/config.fish 文件中加入以下内容:

shell
source ~/.asdf/asdf.fish

补全功能必须按照以下命令手动配置完成:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

使用以下命令将 asdf.fish 加入到 ~/.config/fish/config.fish 文件中:

shell
echo -e "\\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

Fish shell 的补全功能可以交给 Homebrew 处理. 很友好!

Fish & Pacman

~/.config/fish/config.fish 文件中加入以下内容:

shell
source /opt/asdf-vm/asdf.fish

补全功能将会在安装过程中由 AUR 包管理器自动配置完成。

Elvish & Git

使用以下命令将 asdf.elv 加入到 ~/.config/elvish/rc.elv 文件中:

shell
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

补全功能将会自动配置。

Elvish & Homebrew

使用以下命令将 asdf.elv 加入到 ~/.config/elvish/rc.elv 文件中:

shell
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

补全功能将会自动配置。

Elvish & Pacman

使用以下命令将 asdf.elv 加入到 ~/.config/elvish/rc.elv 文件中:

shell
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

补全功能将会自动配置。

ZSH & Git

~/.zshrc 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.sh"

或者 使用 ZSH 框架插件,比如 asdf for oh-my-zsh 将会使脚本生效并安装补全功能。

补全功能会被 ZSH 框架 asdf 插件或者通过在 .zshrc 文件中加入以下内容自动配置:

shell
# append completions to fpath
+fpath=(\${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • 如果你正在使用自定义的 compinit 配置,请确保 compinitasdf.sh 生效位置的下方
  • 如果你正在使用自定义的 compinit 配置和 ZSH 框架,请确保 compinit 在框架生效位置的下方

警告

如果你正在使用 ZSH 框架,有关的 asdf 插件或许需要更新才能通过 fpath 正确地使用最新的 ZSH 补全功能。Oh-My-ZSH asdf 插件还在更新中,请查看 ohmyzsh/ohmyzsh#8837 了解更多。

ZSH & Homebrew

使用以下命令将 asdf.sh 加入到 ~/.zshrc 文件中:

shell
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 了解更多。

ZSH & Pacman

~/.zshrc 文件中加入以下内容:

shell
. /opt/asdf-vm/asdf.sh

补全功能会被放在一个对 ZSH 很友好的位置,但是 ZSH 必须使用自动补全完成配置

PowerShell Core & Git

~/.config/powershell/profile.ps1 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

使用以下命令将 asdf.ps1 加入到 ~/.config/powershell/profile.ps1 文件中:

shell
echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.ps1\\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

~/.config/powershell/profile.ps1 文件中加入以下内容:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

使用以下命令将 asdf.nu 加入到 ~/.config/nushell/config.nu 文件中:

shell
"\\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

补全功能将会自动配置。

Nushell & Homebrew

使用以下命令将 asdf.nu 加入到 ~/.config/nushell/config.nu 文件中:

shell
"\\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

补全功能将会自动配置。

Nushell & Pacman

使用以下命令将 asdf.nu 加入到 ~/.config/nushell/config.nu 文件中:

shell
"\\n$env.ASDF_DIR = '/opt/asdf-vm/'\\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

补全功能将会自动配置。

POSIX Shell & Git

~/.profile 文件中加入以下内容:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

使用以下命令将 asdf.sh 加入到 ~/.profile 文件中:

shell
echo -e "\\nexport ASDF_DIR=\\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
+echo -e "\\n. \\"$(brew --prefix asdf)/libexec/asdf.sh\\"" >> ~/.profile
POSIX Shell & Pacman

~/.profile 文件中加入以下内容:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

asdf 脚本需要在设置好的 $PATH 之后和已经生效的框架(比如 oh-my-zsh 等等)之后的位置生效。

通常打开一个新的终端标签页来重启你的 shell 让 PATH 更改即时生效。

核心安装完成!

这样就完成了 asdf 核心的安装 🎉

asdf 仅在你安装插件工具和管理它们的版本时才开始真正发挥作用。请继续阅读下面的指南来了解这些是如何做到的。

4. 安装插件

出于演示目的,我们将通过 asdf-nodejs 插件来安装和设置 Node.js

插件依赖

每个插件都有依赖,所以我们需要确认应该列举了这些依赖的插件源码。对于 asdf-nodejs 来说,它们是:

操作系统安装依赖
Linux (Debian)apt-get install dirmngr gpg curl gawk
macOSbrew install gpg gawk

我们应该提前安装这些依赖,因为有些插件有 post-install 钩子。

安装插件

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. 安装指定版本

现在我们已经有了 Node.js 插件,所以我们可以开始安装某个版本了。

我们通过 asdf list all nodejs 可以看到所有可用的版本或者通过 asdf list all nodejs 14 查看版本子集。

我们将只安装最新可用的 latest 版本:

shell
asdf install nodejs latest

注意

asdf 强制使用准确的版本。latest 是一个通过 asdf 来解析到执行时刻的实际版本号的辅助工具。

6. 设置默认版本

asdf 在从当前工作目录一直到 $HOME 目录的所有 .tool-versions 文件中进行工具的版本查找。查找在执行 asdf 管理的工具时实时发生。

警告

如果没有为工具找到指定的版本,则会出现错误asdf current 将显示当前目录中的工具和版本解析结果,或者不存在,以便你可以观察哪些工具将无法执行。

全局

全局默认配置在 $HOME/.tool-versions 文件中进行管理。使用以下命令可以设置一个全局版本:

shell
asdf global nodejs latest

$HOME/.tool-versions 文件内容将会如下所示:

nodejs 16.5.0

某些操作系统已经有一些由系统而非 asdf 安装和管理的工具了,python 就是一个常见的例子。你需要告诉 asdf 将管理权还给系统。版本参考部分 将会引导你。

本地

本地版本被定义在 $PWD/.tool-versions 文件中(当前工作目录)。通常,这将会是一个项目的 Git 存储库。当在你想要的目录执行:

shell
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 来查看它们。命令主要分为三类:

`,80)]))}const g=i(l,[["render",h]]);export{c as __pageData,g as default}; diff --git a/assets/zh-hans_guide_introduction.md.BDqDXkXl.js b/assets/zh-hans_guide_introduction.md.BDqDXkXl.js new file mode 100644 index 00000000..769aabba --- /dev/null +++ b/assets/zh-hans_guide_introduction.md.BDqDXkXl.js @@ -0,0 +1 @@ +import{_ as a,c as r,a2 as o,o as t}from"./chunks/framework.BQmytedh.js";const f=JSON.parse('{"title":"项目简介","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/guide/introduction.md","filePath":"zh-hans/guide/introduction.md","lastUpdated":1643288544000}'),d={name:"zh-hans/guide/introduction.md"};function n(i,e,s,c,l,h){return t(),r("div",null,e[0]||(e[0]=[o('

项目简介

asdf 是一个工具版本管理器。所有的工具版本定义都包含在一个文件(.tool-versions)中,你可以将配置文件放在项目的 Git 存储库中以便于和团队其他成员共享,从而确保每个人都使用完全相同的工具版本。

传统工作方式需要多个命令行版本管理器,而且每个管理器都有其不同的 API、配置文件和实现方式(比如,$PATH 操作、垫片、环境变量等等)。asdf 提供单个交互方式和配置文件来简化开发工作流程,并可通过简单的插件接口扩展到所有工具和运行环境。

它是如何工作的

一旦 asdf 核心在 Shell 配置中设置好之后,你可以安装插件来管理特定的工具。当通过插件安装工具时,安装的可执行程序会为每个可执行程序创建 垫片。当你尝试运行其中一个可执行程序时,将运行垫片,从而允许 asdf 识别 .tool-versions 文件中设置的工具版本并执行该版本。

相关项目

nvm / n / rbenv 等

nvm, nrbenv 等工具都是用 Shell 脚本写的,这些脚本能为工具安装的可执行程序创建垫片。

asdf 非常相似,目的是在工具/运行环境版本管理领域竞争。asdf 的区别之处在于它的插件系统,它消除了每个工具/运行环境对管理工具的需求、每个管理工具的不同命令以及存储库中不同的*-版本文件。

direnv

使用可以根据当前目录加载和卸载环境变量的新功能增强现有 shell。

asdf 不管理环境变量,但是有一个插件 asdf-direnv 可以用来集成 direnv 的特性到 asdf 中。

请查看 direnv 文档 了解更多。

Homebrew

macOS(或者 Linux)上缺失包的管理器

Homebrew 管理你的软件包及其上游依赖。asdf 不管理上游依赖,它不是包管理器。这个责任取决于用户,尽管我们试图保持依赖关系列表很小。

请查看 Homebrew 文档 了解更多。

NixOS

Nix 是一种采用独特方法进行软件包管理和系统配置的工具

NixOS 旨在通过管理每个工具的整个依赖关系树中软件包的确切版本来构建真正可重复的环境,有些是 asdf 无法做到的。NixOS 使用自己的编程语言、许多命令行工具和超过 60,000 个包的包集合来实现这一点。

同样,asdf 不管理上游依赖,并且它不是一个包管理器。

请查看 NixOS 文档 了解更多。

为什么使用 asdf?

asdf 确保团队可以使用完全相同的工具版本,通过插件系统支持很多工具,以及作为 Shell 配置中包含的单个 Shell 脚本的 简单性和熟悉性

注意

asdf 并不打算成为一个系统包管理器。它是一个工具版本管理器。仅仅因为你可以为任何工具创建插件并使用 asdf 管理其版本,并不意味着这是这个特定工具的最佳实践方案。

',25)]))}const b=a(d,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/zh-hans_guide_introduction.md.BDqDXkXl.lean.js b/assets/zh-hans_guide_introduction.md.BDqDXkXl.lean.js new file mode 100644 index 00000000..769aabba --- /dev/null +++ b/assets/zh-hans_guide_introduction.md.BDqDXkXl.lean.js @@ -0,0 +1 @@ +import{_ as a,c as r,a2 as o,o as t}from"./chunks/framework.BQmytedh.js";const f=JSON.parse('{"title":"项目简介","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/guide/introduction.md","filePath":"zh-hans/guide/introduction.md","lastUpdated":1643288544000}'),d={name:"zh-hans/guide/introduction.md"};function n(i,e,s,c,l,h){return t(),r("div",null,e[0]||(e[0]=[o('

项目简介

asdf 是一个工具版本管理器。所有的工具版本定义都包含在一个文件(.tool-versions)中,你可以将配置文件放在项目的 Git 存储库中以便于和团队其他成员共享,从而确保每个人都使用完全相同的工具版本。

传统工作方式需要多个命令行版本管理器,而且每个管理器都有其不同的 API、配置文件和实现方式(比如,$PATH 操作、垫片、环境变量等等)。asdf 提供单个交互方式和配置文件来简化开发工作流程,并可通过简单的插件接口扩展到所有工具和运行环境。

它是如何工作的

一旦 asdf 核心在 Shell 配置中设置好之后,你可以安装插件来管理特定的工具。当通过插件安装工具时,安装的可执行程序会为每个可执行程序创建 垫片。当你尝试运行其中一个可执行程序时,将运行垫片,从而允许 asdf 识别 .tool-versions 文件中设置的工具版本并执行该版本。

相关项目

nvm / n / rbenv 等

nvm, nrbenv 等工具都是用 Shell 脚本写的,这些脚本能为工具安装的可执行程序创建垫片。

asdf 非常相似,目的是在工具/运行环境版本管理领域竞争。asdf 的区别之处在于它的插件系统,它消除了每个工具/运行环境对管理工具的需求、每个管理工具的不同命令以及存储库中不同的*-版本文件。

direnv

使用可以根据当前目录加载和卸载环境变量的新功能增强现有 shell。

asdf 不管理环境变量,但是有一个插件 asdf-direnv 可以用来集成 direnv 的特性到 asdf 中。

请查看 direnv 文档 了解更多。

Homebrew

macOS(或者 Linux)上缺失包的管理器

Homebrew 管理你的软件包及其上游依赖。asdf 不管理上游依赖,它不是包管理器。这个责任取决于用户,尽管我们试图保持依赖关系列表很小。

请查看 Homebrew 文档 了解更多。

NixOS

Nix 是一种采用独特方法进行软件包管理和系统配置的工具

NixOS 旨在通过管理每个工具的整个依赖关系树中软件包的确切版本来构建真正可重复的环境,有些是 asdf 无法做到的。NixOS 使用自己的编程语言、许多命令行工具和超过 60,000 个包的包集合来实现这一点。

同样,asdf 不管理上游依赖,并且它不是一个包管理器。

请查看 NixOS 文档 了解更多。

为什么使用 asdf?

asdf 确保团队可以使用完全相同的工具版本,通过插件系统支持很多工具,以及作为 Shell 配置中包含的单个 Shell 脚本的 简单性和熟悉性

注意

asdf 并不打算成为一个系统包管理器。它是一个工具版本管理器。仅仅因为你可以为任何工具创建插件并使用 asdf 管理其版本,并不意味着这是这个特定工具的最佳实践方案。

',25)]))}const b=a(d,[["render",n]]);export{f as __pageData,b as default}; diff --git a/assets/zh-hans_index.md.BkAOT6OQ.js b/assets/zh-hans_index.md.BkAOT6OQ.js new file mode 100644 index 00000000..447d4d2e --- /dev/null +++ b/assets/zh-hans_index.md.BkAOT6OQ.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as i}from"./chunks/framework.BQmytedh.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"asdf","text":"多运行时版本管理器","tagline":"使用一个工具管理所有运行时版本!","actions":[{"theme":"brand","text":"快速上手","link":"/zh-hans/guide/getting-started"},{"theme":"alt","text":"什么是asdf?","link":"/zh-hans/guide/introduction"},{"theme":"alt","text":"在 Github 上查看","link":"https://github.com/asdf-vm/asdf"}]},"features":[{"title":"一个工具","details":"使用单个命令行工具和命令界面管理你的每个项目运行环境。","icon":"🎉"},{"title":"插件","details":"现有运行环境和工具的大型生态系统。简单 API 用于根据需要添加对新工具的支持!","icon":"🔌"},{"title":"向后兼容","details":"支持从现有配置文件 .nvmrc、.node-version、.ruby-version 平滑迁移!","icon":"⏮"},{"title":"一个配置文件","details":"一个可共享的 .tool-versions 配置文件管理所有工具、运行环境及其版本。","icon":"📄"},{"title":"Shells","details":"支持 Bash、ZSH、Fish 和 Elvish,并提供补全功能。","icon":"🐚"},{"title":"GitHub Actions","details":"提供 Github Action 在 CI/CD 工作流中安装和使用 .tool-versions。","icon":"🤖"}]},"headers":[],"relativePath":"zh-hans/index.md","filePath":"zh-hans/index.md","lastUpdated":1700090238000}'),n={name:"zh-hans/index.md"};function a(s,o,d,l,r,c){return i(),e("div")}const u=t(n,[["render",a]]);export{m as __pageData,u as default}; diff --git a/assets/zh-hans_index.md.BkAOT6OQ.lean.js b/assets/zh-hans_index.md.BkAOT6OQ.lean.js new file mode 100644 index 00000000..447d4d2e --- /dev/null +++ b/assets/zh-hans_index.md.BkAOT6OQ.lean.js @@ -0,0 +1 @@ +import{_ as t,c as e,o as i}from"./chunks/framework.BQmytedh.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","hero":{"name":"asdf","text":"多运行时版本管理器","tagline":"使用一个工具管理所有运行时版本!","actions":[{"theme":"brand","text":"快速上手","link":"/zh-hans/guide/getting-started"},{"theme":"alt","text":"什么是asdf?","link":"/zh-hans/guide/introduction"},{"theme":"alt","text":"在 Github 上查看","link":"https://github.com/asdf-vm/asdf"}]},"features":[{"title":"一个工具","details":"使用单个命令行工具和命令界面管理你的每个项目运行环境。","icon":"🎉"},{"title":"插件","details":"现有运行环境和工具的大型生态系统。简单 API 用于根据需要添加对新工具的支持!","icon":"🔌"},{"title":"向后兼容","details":"支持从现有配置文件 .nvmrc、.node-version、.ruby-version 平滑迁移!","icon":"⏮"},{"title":"一个配置文件","details":"一个可共享的 .tool-versions 配置文件管理所有工具、运行环境及其版本。","icon":"📄"},{"title":"Shells","details":"支持 Bash、ZSH、Fish 和 Elvish,并提供补全功能。","icon":"🐚"},{"title":"GitHub Actions","details":"提供 Github Action 在 CI/CD 工作流中安装和使用 .tool-versions。","icon":"🤖"}]},"headers":[],"relativePath":"zh-hans/index.md","filePath":"zh-hans/index.md","lastUpdated":1700090238000}'),n={name:"zh-hans/index.md"};function a(s,o,d,l,r,c){return i(),e("div")}const u=t(n,[["render",a]]);export{m as __pageData,u as default}; diff --git a/assets/zh-hans_manage_commands.md.DyG9aM0W.js b/assets/zh-hans_manage_commands.md.DyG9aM0W.js new file mode 100644 index 00000000..69ec2607 --- /dev/null +++ b/assets/zh-hans_manage_commands.md.DyG9aM0W.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as e,o as p}from"./chunks/framework.BQmytedh.js";const f=JSON.parse('{"title":"所有命令","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/manage/commands.md","filePath":"zh-hans/manage/commands.md","lastUpdated":1687069487000}'),l={name:"zh-hans/manage/commands.md"};function t(i,s,o,c,r,d){return p(),n("div",null,s[0]||(s[0]=[e(`

所有命令

asdf 中所有可用命令的列表。这个列表就是 asdf help 命令的打印内容。

txt
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
`,3)]))}const h=a(l,[["render",t]]);export{f as __pageData,h as default}; diff --git a/assets/zh-hans_manage_commands.md.DyG9aM0W.lean.js b/assets/zh-hans_manage_commands.md.DyG9aM0W.lean.js new file mode 100644 index 00000000..69ec2607 --- /dev/null +++ b/assets/zh-hans_manage_commands.md.DyG9aM0W.lean.js @@ -0,0 +1,66 @@ +import{_ as a,c as n,a2 as e,o as p}from"./chunks/framework.BQmytedh.js";const f=JSON.parse('{"title":"所有命令","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/manage/commands.md","filePath":"zh-hans/manage/commands.md","lastUpdated":1687069487000}'),l={name:"zh-hans/manage/commands.md"};function t(i,s,o,c,r,d){return p(),n("div",null,s[0]||(s[0]=[e(`

所有命令

asdf 中所有可用命令的列表。这个列表就是 asdf help 命令的打印内容。

txt
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
`,3)]))}const h=a(l,[["render",t]]);export{f as __pageData,h as default}; diff --git a/assets/zh-hans_manage_configuration.md.BXNUGmSk.js b/assets/zh-hans_manage_configuration.md.BXNUGmSk.js new file mode 100644 index 00000000..b2eb58d3 --- /dev/null +++ b/assets/zh-hans_manage_configuration.md.BXNUGmSk.js @@ -0,0 +1,9 @@ +import{_ as d,c as n,a2 as a,j as e,a as t,G as o,B as i,o as r}from"./chunks/framework.BQmytedh.js";const A=JSON.parse('{"title":"配置","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/manage/configuration.md","filePath":"zh-hans/manage/configuration.md","lastUpdated":1687069487000}'),p={name:"zh-hans/manage/configuration.md"},u={tabindex:"0"},c={style:{"text-align":"left"}},f={tabindex:"0"},g={style:{"text-align":"left"}},y={tabindex:"0"},b={style:{"text-align":"left"}},v={tabindex:"0"},x={style:{"text-align":"left"}};function m(h,l,k,P,q,w){const s=i("Badge");return r(),n("div",null,[l[28]||(l[28]=a(`

配置

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 将会使用这个文件所指定的配置。下面的文件展示了所需的格式,其中包含用于演示的默认值:

txt
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 文件。

`,20)),e("table",u,[l[4]||(l[4]=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",c,[l[0]||(l[0]=e("code",null,"no",-1)),l[1]||(l[1]=t()),o(s,{type:"tip",text:"默认",vertical:"middle"})]),l[2]||(l[2]=e("td",{style:{"text-align":"left"}},[t("从 "),e("code",null,".tool-versions"),t(" 文件读取版本")],-1))]),l[3]||(l[3]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},[t("如果可行的话,从传统版本文件读取版本("),e("code",null,".ruby-versions"),t(")")])],-1))])]),l[29]||(l[29]=e("h3",{id:"use-release-candidates",tabindex:"-1"},[e("code",null,"use_release_candidates"),t(),e("a",{class:"header-anchor",href:"#use-release-candidates","aria-label":'Permalink to "`use_release_candidates`"'},"​")],-1)),l[30]||(l[30]=e("p",null,[t("配置 "),e("code",null,"asdf update"),t(" 命令以升级到最新的候选版本,而不是最新的语义版本。")],-1)),e("table",f,[l[9]||(l[9]=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",g,[l[5]||(l[5]=e("code",null,"no",-1)),l[6]||(l[6]=t()),o(s,{type:"tip",text:"默认",vertical:"middle"})]),l[7]||(l[7]=e("td",{style:{"text-align":"left"}},"语义版本被使用",-1))]),l[8]||(l[8]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"候选版本被使用")],-1))])]),l[31]||(l[31]=e("h3",{id:"always-keep-download",tabindex:"-1"},[e("code",null,"always_keep_download"),t(),e("a",{class:"header-anchor",href:"#always-keep-download","aria-label":'Permalink to "`always_keep_download`"'},"​")],-1)),l[32]||(l[32]=e("p",null,[t("配置 "),e("code",null,"asdf install"),t(" 命令以保留或删除下载的源代码或二进制文件。")],-1)),e("table",y,[l[14]||(l[14]=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",b,[l[10]||(l[10]=e("code",null,"no",-1)),l[11]||(l[11]=t()),o(s,{type:"tip",text:"默认",vertical:"middle"})]),l[12]||(l[12]=e("td",{style:{"text-align":"left"}},"在成功安装后删除源代码或二进制文件",-1))]),l[13]||(l[13]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"在成功安装后保留源代码或二进制文件")],-1))])]),l[33]||(l[33]=e("h3",{id:"plugin-repository-last-check-duration",tabindex:"-1"},[e("code",null,"plugin_repository_last_check_duration"),t(),e("a",{class:"header-anchor",href:"#plugin-repository-last-check-duration","aria-label":'Permalink to "`plugin_repository_last_check_duration`"'},"​")],-1)),l[34]||(l[34]=e("p",null,[t("配置自上次 asdf 插件存储库同步到下一次存储库同步的持续时间。命令 "),e("code",null,"asdf plugin add "),t(" 或者 "),e("code",null,"asdf plugin list all"),t(" 将会触发持续时间的检查,如果持续时间已过,则进行同步。")],-1)),e("table",v,[l[27]||(l[27]=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",x,[l[15]||(l[15]=t("从 ")),l[16]||(l[16]=e("code",null,"1",-1)),l[17]||(l[17]=t(" 到 ")),l[18]||(l[18]=e("code",null,"999999999",-1)),l[19]||(l[19]=t(" 的数字 ")),l[20]||(l[20]=e("br",null,null,-1)),l[21]||(l[21]=t()),o(s,{type:"tip",text:"默认",vertical:"middle"}),l[22]||(l[22]=t(" 为 ")),l[23]||(l[23]=e("code",null,"60",-1))]),l[24]||(l[24]=e("td",{style:{"text-align":"left"}},"如果已过自上次同步的持续时间,触发器事件发生时同步",-1))]),l[25]||(l[25]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"0")]),e("td",{style:{"text-align":"left"}},"每个触发器事件发生时同步")],-1)),l[26]||(l[26]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"never")]),e("td",{style:{"text-align":"left"}},"从不同步")],-1))])]),l[35]||(l[35]=a('

环境变量

  • 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 等包管理器使用它来确保个性化安装的正确的更新方法。
',5))])}const C=d(p,[["render",m]]);export{A as __pageData,C as default}; diff --git a/assets/zh-hans_manage_configuration.md.BXNUGmSk.lean.js b/assets/zh-hans_manage_configuration.md.BXNUGmSk.lean.js new file mode 100644 index 00000000..b2eb58d3 --- /dev/null +++ b/assets/zh-hans_manage_configuration.md.BXNUGmSk.lean.js @@ -0,0 +1,9 @@ +import{_ as d,c as n,a2 as a,j as e,a as t,G as o,B as i,o as r}from"./chunks/framework.BQmytedh.js";const A=JSON.parse('{"title":"配置","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/manage/configuration.md","filePath":"zh-hans/manage/configuration.md","lastUpdated":1687069487000}'),p={name:"zh-hans/manage/configuration.md"},u={tabindex:"0"},c={style:{"text-align":"left"}},f={tabindex:"0"},g={style:{"text-align":"left"}},y={tabindex:"0"},b={style:{"text-align":"left"}},v={tabindex:"0"},x={style:{"text-align":"left"}};function m(h,l,k,P,q,w){const s=i("Badge");return r(),n("div",null,[l[28]||(l[28]=a(`

配置

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 将会使用这个文件所指定的配置。下面的文件展示了所需的格式,其中包含用于演示的默认值:

txt
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 文件。

`,20)),e("table",u,[l[4]||(l[4]=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",c,[l[0]||(l[0]=e("code",null,"no",-1)),l[1]||(l[1]=t()),o(s,{type:"tip",text:"默认",vertical:"middle"})]),l[2]||(l[2]=e("td",{style:{"text-align":"left"}},[t("从 "),e("code",null,".tool-versions"),t(" 文件读取版本")],-1))]),l[3]||(l[3]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},[t("如果可行的话,从传统版本文件读取版本("),e("code",null,".ruby-versions"),t(")")])],-1))])]),l[29]||(l[29]=e("h3",{id:"use-release-candidates",tabindex:"-1"},[e("code",null,"use_release_candidates"),t(),e("a",{class:"header-anchor",href:"#use-release-candidates","aria-label":'Permalink to "`use_release_candidates`"'},"​")],-1)),l[30]||(l[30]=e("p",null,[t("配置 "),e("code",null,"asdf update"),t(" 命令以升级到最新的候选版本,而不是最新的语义版本。")],-1)),e("table",f,[l[9]||(l[9]=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",g,[l[5]||(l[5]=e("code",null,"no",-1)),l[6]||(l[6]=t()),o(s,{type:"tip",text:"默认",vertical:"middle"})]),l[7]||(l[7]=e("td",{style:{"text-align":"left"}},"语义版本被使用",-1))]),l[8]||(l[8]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"候选版本被使用")],-1))])]),l[31]||(l[31]=e("h3",{id:"always-keep-download",tabindex:"-1"},[e("code",null,"always_keep_download"),t(),e("a",{class:"header-anchor",href:"#always-keep-download","aria-label":'Permalink to "`always_keep_download`"'},"​")],-1)),l[32]||(l[32]=e("p",null,[t("配置 "),e("code",null,"asdf install"),t(" 命令以保留或删除下载的源代码或二进制文件。")],-1)),e("table",y,[l[14]||(l[14]=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",b,[l[10]||(l[10]=e("code",null,"no",-1)),l[11]||(l[11]=t()),o(s,{type:"tip",text:"默认",vertical:"middle"})]),l[12]||(l[12]=e("td",{style:{"text-align":"left"}},"在成功安装后删除源代码或二进制文件",-1))]),l[13]||(l[13]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"yes")]),e("td",{style:{"text-align":"left"}},"在成功安装后保留源代码或二进制文件")],-1))])]),l[33]||(l[33]=e("h3",{id:"plugin-repository-last-check-duration",tabindex:"-1"},[e("code",null,"plugin_repository_last_check_duration"),t(),e("a",{class:"header-anchor",href:"#plugin-repository-last-check-duration","aria-label":'Permalink to "`plugin_repository_last_check_duration`"'},"​")],-1)),l[34]||(l[34]=e("p",null,[t("配置自上次 asdf 插件存储库同步到下一次存储库同步的持续时间。命令 "),e("code",null,"asdf plugin add "),t(" 或者 "),e("code",null,"asdf plugin list all"),t(" 将会触发持续时间的检查,如果持续时间已过,则进行同步。")],-1)),e("table",v,[l[27]||(l[27]=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",x,[l[15]||(l[15]=t("从 ")),l[16]||(l[16]=e("code",null,"1",-1)),l[17]||(l[17]=t(" 到 ")),l[18]||(l[18]=e("code",null,"999999999",-1)),l[19]||(l[19]=t(" 的数字 ")),l[20]||(l[20]=e("br",null,null,-1)),l[21]||(l[21]=t()),o(s,{type:"tip",text:"默认",vertical:"middle"}),l[22]||(l[22]=t(" 为 ")),l[23]||(l[23]=e("code",null,"60",-1))]),l[24]||(l[24]=e("td",{style:{"text-align":"left"}},"如果已过自上次同步的持续时间,触发器事件发生时同步",-1))]),l[25]||(l[25]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"0")]),e("td",{style:{"text-align":"left"}},"每个触发器事件发生时同步")],-1)),l[26]||(l[26]=e("tr",null,[e("td",{style:{"text-align":"left"}},[e("code",null,"never")]),e("td",{style:{"text-align":"left"}},"从不同步")],-1))])]),l[35]||(l[35]=a('

环境变量

  • 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 等包管理器使用它来确保个性化安装的正确的更新方法。
',5))])}const C=d(p,[["render",m]]);export{A as __pageData,C as default}; diff --git a/assets/zh-hans_manage_core.md.Cn8uDogS.js b/assets/zh-hans_manage_core.md.Cn8uDogS.js new file mode 100644 index 00000000..c3a6ebf1 --- /dev/null +++ b/assets/zh-hans_manage_core.md.Cn8uDogS.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as l,o as t}from"./chunks/framework.BQmytedh.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 命令列表很小,但可以促进很多工作流。

安装和配置

请查看 快速上手 了解更多详情。

Exec

shell
asdf exec <command> [args...]

执行当前版本的命令垫片。

Env

shell
asdf env <command> [util]

Info

shell
asdf info

用于打印操作系统、Shell 和 asdf 调试信息的辅助命令。在报告 bug 时需要共享这些信息。

Reshim

shell
asdf reshim <name> <version>

这将为某个包的当前版本重新创建垫片。默认情况下,垫片是在某个工具安装的过程中由插件创建。一些工具像 npm 命令行 允许全局安装可执行程序,比如使用 npm install -g yarn 命令安装 Yarn。因为这个可执行程序不是通过插件生命周期安装的,所以还没有对应的垫片存在。asdf reshim nodejs <version> 命令将会强制重新计算任何新可执行程序的垫片,类似 nodejsversions 版本下的 yarn

Shim-versions

shell
asdf shim-versions <command>

列举为命令提供垫片的插件和版本。

例如,Node.js 附带了两个可执行程序,nodenpm。当使用 asdf-nodejs插件安装了这些工具的很多版本时,执行shim-versions\` 命令会返回:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

更新

asdf 有一个依赖于 Git (我们推荐的安装方法)的内置命令用于更新。如果你使用了其他方法安装,则应按照该方法的步骤操作:

方法最新稳定版本master 分支上的最新提交
asdf (Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
Pacman下载一个新的 PKGBUILD 并且重新编译
或者使用你习惯的 AUR helper

卸载

根据以下步骤卸载 asdf

Bash & Git
  1. ~/.bashrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. ~/.bash_profile 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. ~/.bashrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

补全功能可能已经如 Homebrew 的指南 那样配置了,因此请按照他们的指南找出要删除的内容。

  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

如果你正在使用 macOS Catalina 以及更新版本,默认的 shell 已经变成了 ZSH。如果你在 ~/.bash_profile 文件中找不到任何配置,则可能位于 ~/.zshrc 中。在这种情况下,请按照 ZSH 指南进行操作。

  1. ~/.bash_profile 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

补全功能可能已经如 Homebrew 的指南 那样配置了,因此请按照他们的指南找出要删除的内容。

  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. ~/.bashrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. /opt/asdf-vm/asdf.sh
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. ~/.config/fish/config.fish 配置文件中移除生效 asdf.fish 的行:
shell
source ~/.asdf/asdf.fish

以及使用以下命令移除补全功能:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. ~/.config/fish/config.fish 配置文件中移除生效 asdf.fish 的行:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. ~/.config/fish/config.fish 配置文件中移除生效 asdf.fish 的行:
shell
source /opt/asdf-vm/asdf.fish
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. ~/.config/elvish/rc.elv 配置文件中移除使用 asdf 模块的行:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

以及使用以下命令卸载 asdf 模块:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 移除 $HOME/.asdf 目录:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. ~/.config/elvish/rc.elv 配置文件中移除使用 asdf 模块的行:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

以及使用以下命令卸载 asdf 模块:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. ~/.config/elvish/rc.elv 配置文件中移除使用 asdf 模块的行:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

以及使用以下命令卸载 asdf 模块:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. ~/.zshrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

或者 ZSH 框架插件(如果用了的话)

  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. ~/.zshrc 配置文件中移除生效 asdf.sh 的行:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. 用包管理器卸载:
shell
brew uninstall asdf --force && brew autoremove
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. ~/.zshrc 配置文件中移除生效 asdf.sh 的行:
shell
. /opt/asdf-vm/asdf.sh
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
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.Cn8uDogS.lean.js b/assets/zh-hans_manage_core.md.Cn8uDogS.lean.js new file mode 100644 index 00000000..c3a6ebf1 --- /dev/null +++ b/assets/zh-hans_manage_core.md.Cn8uDogS.lean.js @@ -0,0 +1,18 @@ +import{_ as i,c as a,a2 as l,o as t}from"./chunks/framework.BQmytedh.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 命令列表很小,但可以促进很多工作流。

安装和配置

请查看 快速上手 了解更多详情。

Exec

shell
asdf exec <command> [args...]

执行当前版本的命令垫片。

Env

shell
asdf env <command> [util]

Info

shell
asdf info

用于打印操作系统、Shell 和 asdf 调试信息的辅助命令。在报告 bug 时需要共享这些信息。

Reshim

shell
asdf reshim <name> <version>

这将为某个包的当前版本重新创建垫片。默认情况下,垫片是在某个工具安装的过程中由插件创建。一些工具像 npm 命令行 允许全局安装可执行程序,比如使用 npm install -g yarn 命令安装 Yarn。因为这个可执行程序不是通过插件生命周期安装的,所以还没有对应的垫片存在。asdf reshim nodejs <version> 命令将会强制重新计算任何新可执行程序的垫片,类似 nodejsversions 版本下的 yarn

Shim-versions

shell
asdf shim-versions <command>

列举为命令提供垫片的插件和版本。

例如,Node.js 附带了两个可执行程序,nodenpm。当使用 asdf-nodejs插件安装了这些工具的很多版本时,执行shim-versions\` 命令会返回:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

更新

asdf 有一个依赖于 Git (我们推荐的安装方法)的内置命令用于更新。如果你使用了其他方法安装,则应按照该方法的步骤操作:

方法最新稳定版本master 分支上的最新提交
asdf (Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
Pacman下载一个新的 PKGBUILD 并且重新编译
或者使用你习惯的 AUR helper

卸载

根据以下步骤卸载 asdf

Bash & Git
  1. ~/.bashrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. ~/.bash_profile 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. ~/.bashrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

补全功能可能已经如 Homebrew 的指南 那样配置了,因此请按照他们的指南找出要删除的内容。

  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

如果你正在使用 macOS Catalina 以及更新版本,默认的 shell 已经变成了 ZSH。如果你在 ~/.bash_profile 文件中找不到任何配置,则可能位于 ~/.zshrc 中。在这种情况下,请按照 ZSH 指南进行操作。

  1. ~/.bash_profile 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

补全功能可能已经如 Homebrew 的指南 那样配置了,因此请按照他们的指南找出要删除的内容。

  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. ~/.bashrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. /opt/asdf-vm/asdf.sh
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. ~/.config/fish/config.fish 配置文件中移除生效 asdf.fish 的行:
shell
source ~/.asdf/asdf.fish

以及使用以下命令移除补全功能:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. ~/.config/fish/config.fish 配置文件中移除生效 asdf.fish 的行:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. ~/.config/fish/config.fish 配置文件中移除生效 asdf.fish 的行:
shell
source /opt/asdf-vm/asdf.fish
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. ~/.config/elvish/rc.elv 配置文件中移除使用 asdf 模块的行:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

以及使用以下命令卸载 asdf 模块:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 移除 $HOME/.asdf 目录:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. ~/.config/elvish/rc.elv 配置文件中移除使用 asdf 模块的行:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

以及使用以下命令卸载 asdf 模块:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. ~/.config/elvish/rc.elv 配置文件中移除使用 asdf 模块的行:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

以及使用以下命令卸载 asdf 模块:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. ~/.zshrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(\${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

或者 ZSH 框架插件(如果用了的话)

  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. ~/.zshrc 配置文件中移除生效 asdf.sh 的行:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. 用包管理器卸载:
shell
brew uninstall asdf --force && brew autoremove
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. ~/.zshrc 配置文件中移除生效 asdf.sh 的行:
shell
. /opt/asdf-vm/asdf.sh
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录
shell
rm -rf "\${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
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.DTOXb_Nj.js b/assets/zh-hans_manage_plugins.md.DTOXb_Nj.js new file mode 100644 index 00000000..7fe12d4a --- /dev/null +++ b/assets/zh-hans_manage_plugins.md.DTOXb_Nj.js @@ -0,0 +1,11 @@ +import{_ as a,c as i,a2 as l,o as e}from"./chunks/framework.BQmytedh.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 地址添加插件:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

或者通过插件存储库中的缩写添加插件:

shell
asdf plugin add <name>
+# asdf plugin add erlang

建议

推荐独立于缩写存储库的、更长的 git-url 方法。

列举已安装

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

列举缩写存储库中的所有插件

shell
asdf plugin list all

请参考 插件缩写索引 了解插件的完整缩写列表。

更新

shell
asdf plugin update --all

如果你想要更新特定的包,如下所示。

shell
asdf plugin update <name>
+# asdf plugin update erlang

这种更新方式将会获取插件存储库的 源代码默认分支最新提交。版本化的插件和更新正在开发中 (#916)。

移除

bash
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 配置文档 了解更多。
`,26)]))}const c=a(t,[["render",n]]);export{o as __pageData,c as default}; diff --git a/assets/zh-hans_manage_plugins.md.DTOXb_Nj.lean.js b/assets/zh-hans_manage_plugins.md.DTOXb_Nj.lean.js new file mode 100644 index 00000000..7fe12d4a --- /dev/null +++ b/assets/zh-hans_manage_plugins.md.DTOXb_Nj.lean.js @@ -0,0 +1,11 @@ +import{_ as a,c as i,a2 as l,o as e}from"./chunks/framework.BQmytedh.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 地址添加插件:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

或者通过插件存储库中的缩写添加插件:

shell
asdf plugin add <name>
+# asdf plugin add erlang

建议

推荐独立于缩写存储库的、更长的 git-url 方法。

列举已安装

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

列举缩写存储库中的所有插件

shell
asdf plugin list all

请参考 插件缩写索引 了解插件的完整缩写列表。

更新

shell
asdf plugin update --all

如果你想要更新特定的包,如下所示。

shell
asdf plugin update <name>
+# asdf plugin update erlang

这种更新方式将会获取插件存储库的 源代码默认分支最新提交。版本化的插件和更新正在开发中 (#916)。

移除

bash
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 配置文档 了解更多。
`,26)]))}const c=a(t,[["render",n]]);export{o as __pageData,c as default}; diff --git a/assets/zh-hans_manage_versions.md.DkeX4EwJ.js b/assets/zh-hans_manage_versions.md.DkeX4EwJ.js new file mode 100644 index 00000000..e84b1acd --- /dev/null +++ b/assets/zh-hans_manage_versions.md.DkeX4EwJ.js @@ -0,0 +1,30 @@ +import{_ as i,c as a,a2 as l,o as h}from"./chunks/framework.BQmytedh.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(`

版本

安装版本

shell
asdf install <name> <version>
+# asdf install erlang 17.3

如果一个插件支持从源代码下载和编译,你可以指定 ref:foo,其中 foo 是特定的分支、标签或者提交。卸载该版本时,你也需要使用相同的名称和引用。

安装最新稳定版本

shell
asdf install <name> latest
+# asdf install erlang latest

安装给定字符串开头的最新稳定版本。

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

列举已安装版本

shell
asdf list <name>
+# asdf list erlang

筛选出以给定字符串开头的版本。

shell
asdf list <name> <version>
+# asdf list erlang 17

列举所有可用版本

shell
asdf list all <name>
+# asdf list all erlang

筛选出以给定字符串开头的版本。

shell
asdf list all <name> <version>
+# asdf list all erlang 17

显示最新稳定版本

shell
asdf latest <name>
+# asdf latest erlang

显示以给定字符串开头的最新稳定版本。

shell
asdf latest <name> <version>
+# asdf latest erlang 17

设置当前版本

shell
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 文件支持的版本格式相同。

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

回退到系统版本

要使用工具 <name> 的系统版本而非 asdf 管理版本,你可以将工具的版本设置为 system

使用 globallocal 或者 shell 设置系统,如上面的 设置当前版本 部分所述。

shell
asdf local <name> system
+# asdf local python system

显示当前版本

shell
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)

卸载版本

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

垫片(Shims)

当 asdf 安装一个包时,它会在 $ASDF_DATA_DIR/shims 目录(默认为 ~/.asdf/shims)中为该包中的每个可执行程序创建垫片。这个位于 $PATH 中(通过 asdf.shasdf.fish 等等实现)的目录是已安装程序在环境中可用的方式。

垫片本身是非常简单的包装器,它 exec (执行)一个辅助程序 asdf exec,向其传递插件的名称和垫片正在包装的已安装包中的可执行程序的路径。

asdf exec 辅助程序确定要使用的软件包版本(比如在 .tool-versions 文件中指定,通过 asdf local ... 或者 asdf global ... 命令选择)、软件包安装目录中的可执行程序的最终路径(这可以在插件中通过 exec-path 回调来操作)以及要在其中执行的环境(也由插件 - exec-env 脚本提供),最后完成执行。

注意

因为此系统使用 exec 调用,所以软件包中的任何脚本如果要由 shell 生效而不是执行的脚本都需要直接访问,而不是通过垫片包装器进行访问。两个 asdf 命令:whichwhere 可以通过返回已安装软件包的路径来帮助解决这个问题。

shell
# 返回当前版本中主要可执行程序的路径
+source $(asdf which \${PLUGIN})/../script.sh
+
+# 返回软件包安装目录的路径
+source $(asdf where \${PLUGIN} $(asdf current \${PLUGIN}))/bin/script.sh

绕过 asdf 垫片

如果由于某种原因,你希望绕过 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.DkeX4EwJ.lean.js b/assets/zh-hans_manage_versions.md.DkeX4EwJ.lean.js new file mode 100644 index 00000000..e84b1acd --- /dev/null +++ b/assets/zh-hans_manage_versions.md.DkeX4EwJ.lean.js @@ -0,0 +1,30 @@ +import{_ as i,c as a,a2 as l,o as h}from"./chunks/framework.BQmytedh.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(`

版本

安装版本

shell
asdf install <name> <version>
+# asdf install erlang 17.3

如果一个插件支持从源代码下载和编译,你可以指定 ref:foo,其中 foo 是特定的分支、标签或者提交。卸载该版本时,你也需要使用相同的名称和引用。

安装最新稳定版本

shell
asdf install <name> latest
+# asdf install erlang latest

安装给定字符串开头的最新稳定版本。

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

列举已安装版本

shell
asdf list <name>
+# asdf list erlang

筛选出以给定字符串开头的版本。

shell
asdf list <name> <version>
+# asdf list erlang 17

列举所有可用版本

shell
asdf list all <name>
+# asdf list all erlang

筛选出以给定字符串开头的版本。

shell
asdf list all <name> <version>
+# asdf list all erlang 17

显示最新稳定版本

shell
asdf latest <name>
+# asdf latest erlang

显示以给定字符串开头的最新稳定版本。

shell
asdf latest <name> <version>
+# asdf latest erlang 17

设置当前版本

shell
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 文件支持的版本格式相同。

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

回退到系统版本

要使用工具 <name> 的系统版本而非 asdf 管理版本,你可以将工具的版本设置为 system

使用 globallocal 或者 shell 设置系统,如上面的 设置当前版本 部分所述。

shell
asdf local <name> system
+# asdf local python system

显示当前版本

shell
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)

卸载版本

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

垫片(Shims)

当 asdf 安装一个包时,它会在 $ASDF_DATA_DIR/shims 目录(默认为 ~/.asdf/shims)中为该包中的每个可执行程序创建垫片。这个位于 $PATH 中(通过 asdf.shasdf.fish 等等实现)的目录是已安装程序在环境中可用的方式。

垫片本身是非常简单的包装器,它 exec (执行)一个辅助程序 asdf exec,向其传递插件的名称和垫片正在包装的已安装包中的可执行程序的路径。

asdf exec 辅助程序确定要使用的软件包版本(比如在 .tool-versions 文件中指定,通过 asdf local ... 或者 asdf global ... 命令选择)、软件包安装目录中的可执行程序的最终路径(这可以在插件中通过 exec-path 回调来操作)以及要在其中执行的环境(也由插件 - exec-env 脚本提供),最后完成执行。

注意

因为此系统使用 exec 调用,所以软件包中的任何脚本如果要由 shell 生效而不是执行的脚本都需要直接访问,而不是通过垫片包装器进行访问。两个 asdf 命令:whichwhere 可以通过返回已安装软件包的路径来帮助解决这个问题。

shell
# 返回当前版本中主要可执行程序的路径
+source $(asdf which \${PLUGIN})/../script.sh
+
+# 返回软件包安装目录的路径
+source $(asdf where \${PLUGIN} $(asdf current \${PLUGIN}))/bin/script.sh

绕过 asdf 垫片

如果由于某种原因,你希望绕过 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.dTVUkig9.js b/assets/zh-hans_more_community-projects.md.dTVUkig9.js new file mode 100644 index 00000000..a0472e4d --- /dev/null +++ b/assets/zh-hans_more_community-projects.md.dTVUkig9.js @@ -0,0 +1 @@ +import{_ as t,c as o,a2 as r,o as a}from"./chunks/framework.BQmytedh.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('

Community Projects

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.

',4)]))}const f=t(s,[["render",n]]);export{u as __pageData,f as default}; diff --git a/assets/zh-hans_more_community-projects.md.dTVUkig9.lean.js b/assets/zh-hans_more_community-projects.md.dTVUkig9.lean.js new file mode 100644 index 00000000..a0472e4d --- /dev/null +++ b/assets/zh-hans_more_community-projects.md.dTVUkig9.lean.js @@ -0,0 +1 @@ +import{_ as t,c as o,a2 as r,o as a}from"./chunks/framework.BQmytedh.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('

Community Projects

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.

',4)]))}const f=t(s,[["render",n]]);export{u as __pageData,f as default}; diff --git a/assets/zh-hans_more_faq.md.DmYFtjwD.js b/assets/zh-hans_more_faq.md.DmYFtjwD.js new file mode 100644 index 00000000..65772d62 --- /dev/null +++ b/assets/zh-hans_more_faq.md.DmYFtjwD.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as t}from"./chunks/framework.BQmytedh.js";const p=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/more/faq.md","filePath":"zh-hans/more/faq.md","lastUpdated":1671778129000}'),s={name:"zh-hans/more/faq.md"};function d(n,e,i,h,c,l){return t(),o("div",null,e[0]||(e[0]=[r('

FAQ

以下是 asdf 相关的一些常见问题。

支持 WSL1 吗?

WSL1 (Windows Subsystem for Linux 1) 不受官方支持。asdf 的某些方面可能无法正常工作。我们不打算添加对 WSL1 的官方支持。

支持 WSL2 吗?

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 命令文档 了解更多。

Shell 没有检测到新安装的垫片?

如果 asdf reshim 没有解决你的问题,那么很有可能是在 asdf.sh 或者 asdf.fish 的生效不在你的 Shell 配置文件(.bash_profile.zshrcconfig.fish 等等)的下方。这需要你在设置你的 $PATH 之后和生效你的框架(oh-my-zsh 等等)(如果有的话)之后再生效。

',13)]))}const m=a(s,[["render",d]]);export{p as __pageData,m as default}; diff --git a/assets/zh-hans_more_faq.md.DmYFtjwD.lean.js b/assets/zh-hans_more_faq.md.DmYFtjwD.lean.js new file mode 100644 index 00000000..65772d62 --- /dev/null +++ b/assets/zh-hans_more_faq.md.DmYFtjwD.lean.js @@ -0,0 +1 @@ +import{_ as a,c as o,a2 as r,o as t}from"./chunks/framework.BQmytedh.js";const p=JSON.parse('{"title":"FAQ","description":"","frontmatter":{},"headers":[],"relativePath":"zh-hans/more/faq.md","filePath":"zh-hans/more/faq.md","lastUpdated":1671778129000}'),s={name:"zh-hans/more/faq.md"};function d(n,e,i,h,c,l){return t(),o("div",null,e[0]||(e[0]=[r('

FAQ

以下是 asdf 相关的一些常见问题。

支持 WSL1 吗?

WSL1 (Windows Subsystem for Linux 1) 不受官方支持。asdf 的某些方面可能无法正常工作。我们不打算添加对 WSL1 的官方支持。

支持 WSL2 吗?

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 命令文档 了解更多。

Shell 没有检测到新安装的垫片?

如果 asdf reshim 没有解决你的问题,那么很有可能是在 asdf.sh 或者 asdf.fish 的生效不在你的 Shell 配置文件(.bash_profile.zshrcconfig.fish 等等)的下方。这需要你在设置你的 $PATH 之后和生效你的框架(oh-my-zsh 等等)(如果有的话)之后再生效。

',13)]))}const m=a(s,[["render",d]]);export{p as __pageData,m as default}; diff --git a/assets/zh-hans_more_thanks.md.wO7wGCsP.js b/assets/zh-hans_more_thanks.md.wO7wGCsP.js new file mode 100644 index 00000000..3b2f860e --- /dev/null +++ b/assets/zh-hans_more_thanks.md.wO7wGCsP.js @@ -0,0 +1 @@ +import{_ as e,c as r,a2 as t,o as h}from"./chunks/framework.BQmytedh.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_more_thanks.md.wO7wGCsP.lean.js b/assets/zh-hans_more_thanks.md.wO7wGCsP.lean.js new file mode 100644 index 00000000..3b2f860e --- /dev/null +++ b/assets/zh-hans_more_thanks.md.wO7wGCsP.lean.js @@ -0,0 +1 @@ +import{_ as e,c as r,a2 as t,o as h}from"./chunks/framework.BQmytedh.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.Bb5e3jX_.js b/assets/zh-hans_plugins_create.md.Bb5e3jX_.js new file mode 100644 index 00000000..e90b01ca --- /dev/null +++ b/assets/zh-hans_plugins_create.md.Bb5e3jX_.js @@ -0,0 +1,35 @@ +import{_ as i,c as a,a2 as e,o as l}from"./chunks/framework.BQmytedh.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-allinstall 或者 uninstall 命令时被执行。你可以设定或取消设定环境变量,并执行设置工具环境所需的任何操作。

必要的脚本

  • bin/list-all - 列举所有可安装的版本
  • bin/download - 下载指定版本的源代码或二进制文件
  • bin/install - 安装指定版本

环境变量

所有脚本除了 bin/list-all 之外对以下环境变量有权限进行操作:

  • ASDF_INSTALL_TYPE - version 或者 ref
  • ASDF_INSTALL_VERSION - 如果 ASDF_INSTALL_TYPEversion,那么这将是版本号。否则它将传递为 git 的 ref。可能指向存储库的一个标签/提交/分支。
  • ASDF_INSTALL_PATH - 已经 安装到的目录(或 bin/install 脚本执行情况下 应该 安装到的目录)

这些附加的环境变量将可用于 bin/install 脚本:

  • ASDF_CONCURRENCY - 编译源代码时使用的内核数。对于配置 make -j 非常有用。
  • ASDF_DOWNLOAD_PATH - bin/download 脚本下载源代码或二进制文件的路径。

这些附加的环境变量将可用于 bin/download 脚本:

  • ASDF_DOWNLOAD_PATH - 源代码或二进制文件应该下载到的路径。

bin/list-all

必须打印一个带有空格分隔的版本列表的字符串,示例输出如下所示:

shell
1.0.1 1.0.2 1.3.0 1.4

请注意,最新版本应列在最后,以便它看起来更接近用户的提示。这很有帮助,因为 list-all 命令会在自己的行打印每个版本。如果有很多版本,那么早期版本可能会不在屏幕上。

如果从网站上的发布页面拉取版本,建议尽可能不对版本进行排序。通常,版本已经按照正确的顺序排列,或者以相反的顺序排列,在这种情况下,像 tac 这样的东西就足够了。如果必须手动对版本进行排序,则不能依赖 sort -V,因为 OSX 操作系统不支持。一种可以替代的排序功能是 更好的选择

bin/download

此脚本必须下载源代码或者二进制文件到 ASDF_DOWNLOAD_PATH 环境变量包含的路径。如果下载的源代码或者二进制文件是压缩的,则只有未压缩的源代码或二进制文件会放置在 ASDF_DOWNLOAD_PATH 目录中。

下载成功后脚本必须以 0 状态退出。如果下载失败,脚本必须以任何非零退出状态退出。

如果可能,脚本应该仅将文件放在 ASDF_DOWNLOAD_PATH 中。如果下载失败,则不应将任何文件放在目录中。

如果此脚本不存在,asdf 将假设存在 bin/install 脚本,将下载并安装该版本。asdf 仅在没有此脚本的情况下才能支持传统插件。所有插件都必须包含此脚本,最终将删除对传统插件的支持。

bin/install

本脚本应在 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 脚本已经下载源代码。

可选脚本

bin/help 脚本

这不是一个回调脚本,而是一组回调脚本,每个脚本将打印不同的文档到 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_VERSIONASDF_INSTALL_TYPE 的值。它们是可选的,并不总是被设置。

帮助回调脚本不得输出核心 asdf-vm 文档中已涵盖的任何信息。不得出现一般的 asdf 使用信息。

bin/latest-stable

如果实现了此回调,asdf 将使用它来确定工具的最新稳定版本,而不是尝试自行判断。asdf latest 通过查看由 list-all 回调打印的最新版本,在从输出中排除了几种类型的版本(如发布候选版本)之后推断出最新版本。当你的插件的 list-all 回调打印同一工具的不同变体并且最新版本不是你希望默认使用的变体的最新稳定版本时,这种默认行为是不可取的。例如,对于 Ruby,最新的稳定版本应该是 Ruby(MRI)的常规实现,但最后 list-all 回调打印的是 truffleruby 版本。

此回调使用单个 “过滤器” 字符串调用,因为它是唯一的参数。这应该用于过滤所有最新稳定版本。例如对于 Ruby,用户可以选择传入 jruby 以选择 jruby 的最新稳定版本。

bin/list-bin-paths

列举指定工具版本的可执行程序。必须打印一个带有空格分隔的包含可执行文件的目录路径列表的字符串。路径必须相对于传递的安装路径。示例输出如下所示:

shell
bin tools veggies

这将指示 asdf 为 <install-path>/bin<install-path>/tools<install-path>/veggies 中的文件创建垫片。

如果未指定此脚本,asdf 将在安装中查找 bin 目录并为这些脚本创建垫片。

bin/exec-env

设置环境变量以运行包中的二进制文件。

bin/exec-path

获取工具的指定版本的可执行程序路径。必须打印具有相对可执行程序路径的字符串。这允许插件有条件地覆盖垫片指定的可执行程序路径,否则返回垫片指定的默认路径。

shell
用法:
+  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

bin/uninstall

卸载某个工具的指定版本。

bin/list-legacy-filenames

为此插件注册其他设置器文件。必须打印一个带有空格分隔的文件名列表的字符串。

shell
.ruby-version .rvmrc

注意:这仅适用于在 ~/.asdfrc 配置文件中启用了 legacy_version_file 选项的用户。

bin/parse-legacy-file

这可用于进一步解析 asdf 找到的传统文件。如果 parse-legacy-file 未实现,asdf 将会简单读取文件来确定版本。脚本将传递文件路径作为其第一个参数。

bin/post-plugin-add

这可用于在插件添加到 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}

bin/post-plugin-update

这可用于在 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}

bin/pre-plugin-remove

这可用于在从 asdf 中删除插件之前运行任何预删除操作。

该脚本可以访问安装插件的路径(\${ASDF_PLUGIN_PATH})。

其他请参考相关钩子:

  • pre_asdf_plugin_remove
  • pre_asdf_plugin_remove_\${plugin_name}
  • post_asdf_plugin_remove
  • post_asdf_plugin_remove_\${plugin_name}

asdf 命令行的扩展命令

插件可以通过提供 lib/commands/command*.bash 脚本或者可执行程序来定义新的 asdf 命令,这些脚本或可执行程序将使用插件名称作为 asdf 命令的子命令进行调用。

例如,假设一个 foo 插件有以下文件:

shell
foo/
+  lib/commands/
+    command.bash
+    command-bat.bash
+    command-bat-man.bash
+    command-help.bash

用户现在可以执行:

shell
$ 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 命令用于测试插件。你可以像下面这样使用它:

shell
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 插件,我们可以运行:

shell
asdf plugin test nodejs https://github.com/asdf-vm/asdf-nodejs.git node --version

我们强烈建议你在 CI 环境中测试你的插件,并确保它可以在 Linux 和 OSX 上运行。

GitHub Action 示例

asdf-vm/actions 存储库为托管在 github 的项目提供了使用 Github Action 来测试插件的可能。

yaml
steps:
+  - name: asdf_plugin_test
+    uses: asdf-vm/actions/plugin-test@v1
+    with:
+      command: "my_tool --version"
+    env:
+      GITHUB_API_TOKEN: \${{ secrets.GITHUB_TOKEN }} # 自动提供

TravisCI 配置示例

这是一个 .travis.yml 示例文件,请根据你的需要进行自定义:

yaml
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'

GitHub API 频率限制

如果你的插件的 list-all 依赖于访问 GitHub API,请确保在访问时提供授权令牌,否则你的测试可能会因频率限制而失败。

为此,创建一个仅具有 public_repo 权限的 新个人令牌

然后,在 travis.ci 构建设置中添加一个名为 GITHUB_API_TOKEN安全 环境变量。并且 绝对不要 在你的代码中公布你的 token。

最后,添加如下内容到 bin/list-all

shell
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.Bb5e3jX_.lean.js b/assets/zh-hans_plugins_create.md.Bb5e3jX_.lean.js new file mode 100644 index 00000000..e90b01ca --- /dev/null +++ b/assets/zh-hans_plugins_create.md.Bb5e3jX_.lean.js @@ -0,0 +1,35 @@ +import{_ as i,c as a,a2 as e,o as l}from"./chunks/framework.BQmytedh.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-allinstall 或者 uninstall 命令时被执行。你可以设定或取消设定环境变量,并执行设置工具环境所需的任何操作。

必要的脚本

  • bin/list-all - 列举所有可安装的版本
  • bin/download - 下载指定版本的源代码或二进制文件
  • bin/install - 安装指定版本

环境变量

所有脚本除了 bin/list-all 之外对以下环境变量有权限进行操作:

  • ASDF_INSTALL_TYPE - version 或者 ref
  • ASDF_INSTALL_VERSION - 如果 ASDF_INSTALL_TYPEversion,那么这将是版本号。否则它将传递为 git 的 ref。可能指向存储库的一个标签/提交/分支。
  • ASDF_INSTALL_PATH - 已经 安装到的目录(或 bin/install 脚本执行情况下 应该 安装到的目录)

这些附加的环境变量将可用于 bin/install 脚本:

  • ASDF_CONCURRENCY - 编译源代码时使用的内核数。对于配置 make -j 非常有用。
  • ASDF_DOWNLOAD_PATH - bin/download 脚本下载源代码或二进制文件的路径。

这些附加的环境变量将可用于 bin/download 脚本:

  • ASDF_DOWNLOAD_PATH - 源代码或二进制文件应该下载到的路径。

bin/list-all

必须打印一个带有空格分隔的版本列表的字符串,示例输出如下所示:

shell
1.0.1 1.0.2 1.3.0 1.4

请注意,最新版本应列在最后,以便它看起来更接近用户的提示。这很有帮助,因为 list-all 命令会在自己的行打印每个版本。如果有很多版本,那么早期版本可能会不在屏幕上。

如果从网站上的发布页面拉取版本,建议尽可能不对版本进行排序。通常,版本已经按照正确的顺序排列,或者以相反的顺序排列,在这种情况下,像 tac 这样的东西就足够了。如果必须手动对版本进行排序,则不能依赖 sort -V,因为 OSX 操作系统不支持。一种可以替代的排序功能是 更好的选择

bin/download

此脚本必须下载源代码或者二进制文件到 ASDF_DOWNLOAD_PATH 环境变量包含的路径。如果下载的源代码或者二进制文件是压缩的,则只有未压缩的源代码或二进制文件会放置在 ASDF_DOWNLOAD_PATH 目录中。

下载成功后脚本必须以 0 状态退出。如果下载失败,脚本必须以任何非零退出状态退出。

如果可能,脚本应该仅将文件放在 ASDF_DOWNLOAD_PATH 中。如果下载失败,则不应将任何文件放在目录中。

如果此脚本不存在,asdf 将假设存在 bin/install 脚本,将下载并安装该版本。asdf 仅在没有此脚本的情况下才能支持传统插件。所有插件都必须包含此脚本,最终将删除对传统插件的支持。

bin/install

本脚本应在 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 脚本已经下载源代码。

可选脚本

bin/help 脚本

这不是一个回调脚本,而是一组回调脚本,每个脚本将打印不同的文档到 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_VERSIONASDF_INSTALL_TYPE 的值。它们是可选的,并不总是被设置。

帮助回调脚本不得输出核心 asdf-vm 文档中已涵盖的任何信息。不得出现一般的 asdf 使用信息。

bin/latest-stable

如果实现了此回调,asdf 将使用它来确定工具的最新稳定版本,而不是尝试自行判断。asdf latest 通过查看由 list-all 回调打印的最新版本,在从输出中排除了几种类型的版本(如发布候选版本)之后推断出最新版本。当你的插件的 list-all 回调打印同一工具的不同变体并且最新版本不是你希望默认使用的变体的最新稳定版本时,这种默认行为是不可取的。例如,对于 Ruby,最新的稳定版本应该是 Ruby(MRI)的常规实现,但最后 list-all 回调打印的是 truffleruby 版本。

此回调使用单个 “过滤器” 字符串调用,因为它是唯一的参数。这应该用于过滤所有最新稳定版本。例如对于 Ruby,用户可以选择传入 jruby 以选择 jruby 的最新稳定版本。

bin/list-bin-paths

列举指定工具版本的可执行程序。必须打印一个带有空格分隔的包含可执行文件的目录路径列表的字符串。路径必须相对于传递的安装路径。示例输出如下所示:

shell
bin tools veggies

这将指示 asdf 为 <install-path>/bin<install-path>/tools<install-path>/veggies 中的文件创建垫片。

如果未指定此脚本,asdf 将在安装中查找 bin 目录并为这些脚本创建垫片。

bin/exec-env

设置环境变量以运行包中的二进制文件。

bin/exec-path

获取工具的指定版本的可执行程序路径。必须打印具有相对可执行程序路径的字符串。这允许插件有条件地覆盖垫片指定的可执行程序路径,否则返回垫片指定的默认路径。

shell
用法:
+  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

bin/uninstall

卸载某个工具的指定版本。

bin/list-legacy-filenames

为此插件注册其他设置器文件。必须打印一个带有空格分隔的文件名列表的字符串。

shell
.ruby-version .rvmrc

注意:这仅适用于在 ~/.asdfrc 配置文件中启用了 legacy_version_file 选项的用户。

bin/parse-legacy-file

这可用于进一步解析 asdf 找到的传统文件。如果 parse-legacy-file 未实现,asdf 将会简单读取文件来确定版本。脚本将传递文件路径作为其第一个参数。

bin/post-plugin-add

这可用于在插件添加到 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}

bin/post-plugin-update

这可用于在 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}

bin/pre-plugin-remove

这可用于在从 asdf 中删除插件之前运行任何预删除操作。

该脚本可以访问安装插件的路径(\${ASDF_PLUGIN_PATH})。

其他请参考相关钩子:

  • pre_asdf_plugin_remove
  • pre_asdf_plugin_remove_\${plugin_name}
  • post_asdf_plugin_remove
  • post_asdf_plugin_remove_\${plugin_name}

asdf 命令行的扩展命令

插件可以通过提供 lib/commands/command*.bash 脚本或者可执行程序来定义新的 asdf 命令,这些脚本或可执行程序将使用插件名称作为 asdf 命令的子命令进行调用。

例如,假设一个 foo 插件有以下文件:

shell
foo/
+  lib/commands/
+    command.bash
+    command-bat.bash
+    command-bat-man.bash
+    command-help.bash

用户现在可以执行:

shell
$ 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 命令用于测试插件。你可以像下面这样使用它:

shell
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 插件,我们可以运行:

shell
asdf plugin test nodejs https://github.com/asdf-vm/asdf-nodejs.git node --version

我们强烈建议你在 CI 环境中测试你的插件,并确保它可以在 Linux 和 OSX 上运行。

GitHub Action 示例

asdf-vm/actions 存储库为托管在 github 的项目提供了使用 Github Action 来测试插件的可能。

yaml
steps:
+  - name: asdf_plugin_test
+    uses: asdf-vm/actions/plugin-test@v1
+    with:
+      command: "my_tool --version"
+    env:
+      GITHUB_API_TOKEN: \${{ secrets.GITHUB_TOKEN }} # 自动提供

TravisCI 配置示例

这是一个 .travis.yml 示例文件,请根据你的需要进行自定义:

yaml
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'

GitHub API 频率限制

如果你的插件的 list-all 依赖于访问 GitHub API,请确保在访问时提供授权令牌,否则你的测试可能会因频率限制而失败。

为此,创建一个仅具有 public_repo 权限的 新个人令牌

然后,在 travis.ci 构建设置中添加一个名为 GITHUB_API_TOKEN安全 环境变量。并且 绝对不要 在你的代码中公布你的 token。

最后,添加如下内容到 bin/list-all

shell
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..d7e2ba00 --- /dev/null +++ b/contribute/core.html @@ -0,0 +1,63 @@ + + + + + + asdf + + + + + + + + + + + + + + +
Skip to content

asdf

asdf core contribution guide.

Initial Setup

Fork asdf on GitHub and/or Git clone the default branch:

shell
# 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:

shell
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:

shell
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:

  • bats-core: Bash Automated Testing System, for unit testing Bash or POSIX compliant scripts.
  • shellcheck: Static analysis tool for shell scripts.
  • shfmt: A shell parser, formatter, and interpreter with bash support; includes shfmt

Development

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:

shell
# 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

Gitignore

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.

gitignore
/installs
+/downloads
+/shims
+repository
+.vagrant
+keyrings
+/tmp
+
+dist/

.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:

sh
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:

sh
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:

json
{
+  "gitlens.advanced.blame.customArguments": [
+    "--ignore-revs-file",
+    ".git-blame-ignore-revs"
+  ]
+}

Bats Testing

Execute tests locally with:

shell
./scripts/test.bash

Before writing tests please read:

Bats Tips

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:

shell
# 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.

Pull Requests, Releases & Conventional Commits

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 change
  • fix: 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.

Docker Images

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.

+ + + + \ No newline at end of file diff --git a/contribute/documentation.html b/contribute/documentation.html new file mode 100644 index 00000000..d2f6948a --- /dev/null +++ b/contribute/documentation.html @@ -0,0 +1,66 @@ + + + + + + Docs & Site | asdf + + + + + + + + + + + + + + +
Skip to content

Docs & Site

Documentation & site contribution guide.

Initial Setup

Fork asdf on GitHub and/or Git clone the default branch:

shell
# 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:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

Install the tool version(s) with:

shell
asdf install
  • Node.js: JavaScript runtime built on Chrome's V8 JavaScript engine.

Install Node.js dependencies from docs/package.json:

shell
npm install

Development

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:

@code json{3-5}

To start the local development server:

shell
npm run dev

Format the code before committing:

shell
npm run format

Pull Requests, Releases & Conventional Commits

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>.

Vitepress

Configuration of the site is contained within a few TypeScript files with JS Objects used to represent the config. They are:

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.

I18n

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:

js
// 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:

shell
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.

+ + + + \ No newline at end of file diff --git a/contribute/first-party-plugins.html b/contribute/first-party-plugins.html new file mode 100644 index 00000000..a1a7188a --- /dev/null +++ b/contribute/first-party-plugins.html @@ -0,0 +1,25 @@ + + + + + + First-Party Plugins | asdf + + + + + + + + + + + + + + +
Skip to content

First-Party Plugins

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:

+ + + + \ No newline at end of file diff --git a/contribute/github-actions.html b/contribute/github-actions.html new file mode 100644 index 00000000..30cc8cd2 --- /dev/null +++ b/contribute/github-actions.html @@ -0,0 +1,25 @@ + + + + + + GitHub Actions | asdf + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/getting-started.html b/guide/getting-started.html new file mode 100644 index 00000000..083f6955 --- /dev/null +++ b/guide/getting-started.html @@ -0,0 +1,37 @@ + + + + + + Getting Started | asdf + + + + + + + + + + + + + + +
Skip to content

Getting Started

asdf installation involves:

  1. Installing dependencies
  2. Downloading asdf core
  3. Installing asdf
  4. Installing a plugin for each tool/runtime you wish to manage
  5. Installing a version of the tool/runtime
  6. Setting global and project versions via .tool-versions config files

1. Install Dependencies

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).

OSPackage ManagerCommand
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

Note

sudo may be required depending on your system configuration.

2. Download asdf

Official Download

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.15.0

Community Supported Download Methods

We highly recommend using the official git method.

MethodCommand
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper

3. Install asdf

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.

Bash & Git

Add the following to ~/.bashrc:

shell
. "$HOME/.asdf/asdf.sh"

Completions must be configured by adding the following to your .bashrc:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

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:

shell
. "$HOME/.asdf/asdf.sh"

Completions must be configured manually with the following entry in your .bash_profile:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

Add asdf.sh to your ~/.bashrc with:

shell
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:

shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bashrc
Bash & Homebrew (macOS)

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:

shell
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:

shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bash_profile
Bash & Pacman

Add the following to ~/.bashrc:

shell
. /opt/asdf-vm/asdf.sh

bash-completion needs to be installed for the completions to work.

Fish & Git

Add the following to ~/.config/fish/config.fish:

shell
source ~/.asdf/asdf.fish

Completions must be configured manually with the following command:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

Add asdf.fish to your ~/.config/fish/config.fish with:

shell
echo -e "\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

Completions are handled by Homebrew for the Fish shell. Friendly!

Fish & Pacman

Add the following to ~/.config/fish/config.fish:

shell
source /opt/asdf-vm/asdf.fish

Completions are automatically configured on installation by the AUR package.

Elvish & Git

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
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.

Elvish & Homebrew

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
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.

Elvish & Pacman

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
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.

ZSH & Git

Add the following to ~/.zshrc:

shell
. "$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:

shell
# append completions to fpath
+fpath=(${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • if you are using a custom compinit setup, ensure compinit is below your sourcing of asdf.sh
  • if you are using a custom compinit setup with a ZSH Framework, ensure compinit is below your sourcing of the framework

Warning

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.

ZSH & Homebrew

Add asdf.sh to your ~/.zshrc with:

shell
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.

ZSH & Pacman

Add the following to ~/.zshrc:

shell
. /opt/asdf-vm/asdf.sh

Completions are placed in a ZSH friendly location, but ZSH must be configured to use the autocompletions.

PowerShell Core & Git

Add the following to ~/.config/powershell/profile.ps1:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

Add asdf.sh to your ~/.config/powershell/profile.ps1 with:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.ps1\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

Add the following to ~/.config/powershell/profile.ps1:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

Add asdf.nu to your ~/.config/nushell/config.nu with:

shell
"\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

Nushell & Homebrew

Add asdf.nu to your ~/.config/nushell/config.nu with:

shell
"\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

Nushell & Pacman

Add asdf.nu to your ~/.config/nushell/config.nu with:

shell
"\n$env.ASDF_DIR = '/opt/asdf-vm/'\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

Completions are automatically configured.

POSIX Shell & Git

Add the following to ~/.profile:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

Add asdf.sh to your ~/.profile with:

shell
echo -e "\nexport ASDF_DIR=\"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
+echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
POSIX Shell & Pacman

Add the following to ~/.profile:

shell
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 forcibly 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.

Core Installation Complete!

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.

4. Install a Plugin

For demonstration purposes we will install & set Node.js via the asdf-nodejs plugin.

Plugin Dependencies

Each plugin has dependencies so we need to check the plugin repo where they should be listed. For asdf-nodejs they are:

OSDependency Installation
Debianapt-get install dirmngr gpg curl gawk
CentOS/ Rocky Linux/ AlmaLinuxyum install gnupg2 curl gawk
macOSbrew install gpg gawk

We should install dependencies first as some Plugins have post-install hooks.

Install the Plugin

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. Install a Version

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:

shell
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.

6. Set a Version

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

Global defaults are managed in $HOME/.tool-versions. Set a global version with:

shell
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

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:

shell
asdf local nodejs latest

$PWD/.tool-versions will then look like:

nodejs 16.5.0

Using Existing Tool Version Files

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.

Guide Complete!

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:

+ + + + \ No newline at end of file diff --git a/guide/introduction.html b/guide/introduction.html new file mode 100644 index 00000000..b468777d --- /dev/null +++ b/guide/introduction.html @@ -0,0 +1,25 @@ + + + + + + Introduction | asdf + + + + + + + + + + + + + + +
Skip to content

Introduction

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.

How It Works

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.

nvm / n / rbenv etc

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.

direnv

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.

Homebrew

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.

NixOS

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.

Why use asdf?

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.

+ + + + \ No newline at end of file diff --git a/guide/upgrading-from-v0-15-to-v0-16.html b/guide/upgrading-from-v0-15-to-v0-16.html new file mode 100644 index 00000000..f24e1bf8 --- /dev/null +++ b/guide/upgrading-from-v0-15-to-v0-16.html @@ -0,0 +1,37 @@ + + + + + + Upgrading From Version 0.15.x to 0.16.0 | asdf + + + + + + + + + + + + + + +
Skip to content

Upgrading From Version 0.15.x to 0.16.0

asdf versions 0.15.0 and older were written in Bash and distributed as a set of Bash scripts with the asdf function loaded into your shell. asdf version 0.15.0 is a complete rewrite of asdf in Go. Since it is a complete rewrite there are a number of breaking changes and it is now distributed as a binary rather than a set of scripts.

Breaking Changes

download is now a required callback for plugins

Previously download was optional, now it is required. If a plugin lacks this callback any installs of any version of that plugin will fail.

Hyphenated commands have been removed

asdf version 0.15.0 and earlier supported by hyphenated and non-hyphenated versions of certain commands. With version 0.15.0 only the non-hyphenated versions are supported. The affected commands:

  • asdf list-all -> asdf list all
  • asdf plugin-add -> asdf plugin add
  • asdf plugin-list -> asdf plugin list
  • asdf plugin-list-all -> asdf plugin list all
  • asdf plugin-update -> asdf plugin update
  • asdf plugin-remove -> asdf plugin remove
  • asdf plugin-test -> asdf plugin test
  • asdf shim-versions -> asdf shimversions

asdf global and asdf local commands have been removed

asdf global and asdf local have been removed. The "global" and "local" terminology was wrong and also misleading. asdf doesn't actually support "global" versions that apply everywhere. Any version that was specified with asdf global could easily be overridden by a .tool-versions file in your current directory specifying a different version. This was confusing to users. The plan is to introduce an asdf set command in the near future that better conveys how asdf works and provides similar functionality to asdf global and asdf local.

asdf update command has been removed

Updates can no longer be performed this way. Use your OS package manager or download the latest binary manually. Additionally, the asdf update command present in versions 0.15.0 and older cannot upgrade to version 0.15.0 because the install process has changed. You cannot upgrade to the latest Go implementation using asdf update.

asdf shell command has been removed

This command actually set an environment variable in the user's current shell session. It was able to do this because asdf was actually a shell function, not an executable. The new rewrite removes all shell code from asdf, and it is now a binary rather than a shell function, so setting environment variables directly in the shell is no longer possible.

asdf current has changed

Instead of three columns in the output, with the last being either the location the version is set or a suggested command that could be run to set or install a version. The third column has been split into two columns. The third column now only indicates the source of the version if it is set (typically either version file or environment variable) and the fourth is a boolean indicating whether the specified version is actually installed. If it is not installed, a suggested install command is shown.

Plugin extension commands must now be prefixed with cmd

Previously plugin extension commands could be run like this:

asdf nodejs nodebuild --version

Now they must be prefixed with cmd to avoid causing confusion with built-in commands:

asdf cmd nodejs nodebuild --version

Extension commands have been redesigned

There are a number of breaking changes for plugin extension commands:

  • They must be runnable by exec syscall. If your extension commands are shell scripts in order to be run with exec they must start with a proper shebang line.
  • They can now be binaries or scripts in any language. It no longer makes sense to require a .bash extension as it is misleading.
  • They must have executable permission set.
  • They are no longer sourced by asdf as Bash scripts when they lack executable permission.

Additionally, only the first argument after plugin name is used to determine the extension command to run. This means effectively there is the default command extension command that asdf defaults to when no command matching the first argument after plugin name is found. For example:

foo/
+  lib/commands/
+    command
+    command-bar
+    command-bat-man

Previously these scripts would work like this:

$ asdf cmd foo         # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command`
+$ asdf cmd foo bar     # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bar`
+$ asdf cmd foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bat-man`

Now:

$ asdf cmd foo         # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command`
+$ asdf cmd foo bar     # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command-bar`
+$ asdf cmd foo bat man # same as running `$ASDF_DATA_DIR/plugins/foo/lib/commands/command bat man`

Executables Shims Resolve to Must Runnable by syscall.Exec

The most obvious example of this breaking change are scripts that lack a proper shebang line. asdf 0.15.0 and older were implemented in Bash, so as long it was an executable that could be executed with Bash it would run. This mean that scripts lacking a shebang could still be run by asdf exec. With asdf 0.15.x implemented in Go we now invoke executables via Go's syscall.Exec function, which cannot handle scripts lacking a shebang.

In practice this isn't much of a problem. Most shell scripts DO contain a shebang line. If a tool managed by asdf provides scripts that don't have a shebang line one will need to be added to them.

Custom shim templates are no longer supported

This was a rarely used feature. The only plugin maintained by the core team that used it was the Elixir plugin, and it no longer needs it. This feature was originally added so that shim that get evaluated by a program rather than executed contain code that is suitable for evaluation by a particular program (in the case of Elixir this was the iex shell). Upon further investigation it seems this feature only exists because the PATH for executables was sometimes improperly set to include the shims rather than the other executables for the selected version(s).

Installation

Installation of version 0.15.0 is much simpler than previous versions of asdf. It's just three steps:

  • Download the appropriate asdf binary for your operating system/architecture combo and place it in a directory on your $PATH
  • Set ASDF_DATA_DIR to the directory you'd like asdf to install plugins, versions, and shims.
  • Add $ASDF_DATA_DIR/shims to the front of your `$PATH.

If your operating system's package manager already offers asdf 0.15.0 that is probably the best method for installing it. Upgrading asdf is now only possible via OS package managers and manual installation. There is no self-upgrade feature.

Upgrading Without Losing Data

You can upgrade to the latest version of asdf without losing your existing install data. It's the same sequence of steps as above.

1. Download the appropriate asdf binary for your operating system & architecture

Download the binary and place it in a directory on your path. I chose to place the asdf binary in $HOME/bin and then added $HOME/bin to the front of my $PATH:

# In .zshrc, .bashrc, etc...
+export PATH="$HOME/bin:$PATH"`

2. Set ASDF_DATA_DIR

Run asdf info and copy the line containing the ASDF_DATA_DIR variable:

...
+ASDF_DATA_DIR="/home/myuser/.asdf"
+...

In your shell RC file (.zshrc if Zsh, .bashrc if Bash, etc...) add a line to the end setting ASDF_DATA_DIR to that same value:

bash
export ASDF_DATA_DIR="/home/myuser/.asdf"

3. Add $ASDF_DATA_DIR/shims to the front of your `$PATH

In your shell RC file (same file as step #2) add $ASDF_DATA_DIR/shims to the front of your path:

bash
export ASDF_DATA_DIR="/home/myuser/.asdf"
+export PATH="$ASDF_DATA_DIR/shims:$PATH"

Testing

If you aren't sure if the upgrade to 0.15.0 will break things for you can you can test by installing 0.15.0 in addition to your existing version as described above in "Upgrading Without Losing Data". If it turns out that the upgrade to 0.15.0 breaks things for you simply remove the lines you added to your shell RC file.

+ + + + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json new file mode 100644 index 00000000..31cfda30 --- /dev/null +++ b/hashmap.json @@ -0,0 +1 @@ +{"contribute_core.md":"Dwn6SPRK","contribute_documentation.md":"BrHjmG2Y","contribute_first-party-plugins.md":"An0qw423","contribute_github-actions.md":"CIAqdwgh","guide_getting-started.md":"BDkIivLD","guide_introduction.md":"BED2HKpc","guide_upgrading-from-v0-15-to-v0-16.md":"BSJSfnUt","index.md":"Bl7STBtd","ja-jp_contribute_core.md":"CJW3eeff","ja-jp_contribute_documentation.md":"DpQ3bmph","ja-jp_contribute_first-party-plugins.md":"CLMHeW36","ja-jp_contribute_github-actions.md":"CXg4FquL","ja-jp_guide_getting-started.md":"BJ2dWMQM","ja-jp_guide_introduction.md":"CYXABCzJ","ja-jp_index.md":"Te-fFvI2","ja-jp_manage_commands.md":"CM3wA-L-","ja-jp_manage_configuration.md":"CysILq4S","ja-jp_manage_core.md":"DkSs_n4l","ja-jp_manage_plugins.md":"Dveizso5","ja-jp_manage_versions.md":"B4flZrjK","ja-jp_more_community-projects.md":"Cq5uhq32","ja-jp_more_faq.md":"AspkCmpH","ja-jp_more_thanks.md":"dd0Jv9gE","ja-jp_plugins_create.md":"DRELQIdl","ko-kr_contribute_core.md":"D-irvj4K","ko-kr_contribute_documentation.md":"BgRjCUzf","ko-kr_contribute_first-party-plugins.md":"Fbk-rjdV","ko-kr_contribute_github-actions.md":"IILdesb4","ko-kr_guide_getting-started.md":"2aSfsHSt","ko-kr_guide_introduction.md":"AsrAlGvY","ko-kr_index.md":"Dmm5J-rX","ko-kr_manage_commands.md":"BnsPzg1t","ko-kr_manage_configuration.md":"DziiMa6H","ko-kr_manage_core.md":"YwhJzC1z","ko-kr_manage_plugins.md":"BStZ_uo9","ko-kr_manage_versions.md":"CMPcUJSc","ko-kr_more_community-projects.md":"BGgZzLbH","ko-kr_more_faq.md":"De3gzoXB","ko-kr_more_thanks.md":"DLiIYnLr","ko-kr_plugins_create.md":"CGqR6Egc","manage_commands.md":"-uGyRGzy","manage_configuration.md":"Sdrc4tf7","manage_core.md":"D6WBxbgc","manage_plugins.md":"BLO16oTi","manage_versions.md":"C6EGWNcY","more_community-projects.md":"yoPbi1N_","more_faq.md":"sc8Q06z2","more_thanks.md":"Bx4bXB2q","plugins_create.md":"DOuyNDOe","pt-br_contribute_core.md":"BYmf6nEE","pt-br_contribute_documentation.md":"DIVmFQtc","pt-br_contribute_first-party-plugins.md":"BJkV62VO","pt-br_contribute_github-actions.md":"08xeI_Lh","pt-br_guide_getting-started.md":"B2F3eseE","pt-br_guide_introduction.md":"DuS2bVcZ","pt-br_index.md":"ByjSzZoa","pt-br_manage_commands.md":"Dr6_3Llb","pt-br_manage_configuration.md":"r47RkzYy","pt-br_manage_core.md":"Zj8lFw0P","pt-br_manage_plugins.md":"2hxhV7Yu","pt-br_manage_versions.md":"CSTMJus-","pt-br_more_community-projects.md":"CHEVJOJv","pt-br_more_faq.md":"BTGkaPN-","pt-br_more_thanks.md":"Bvo3xrmB","pt-br_plugins_create.md":"C5Tg4ylk","zh-hans_contribute_core.md":"BeVZjd7j","zh-hans_contribute_documentation.md":"DNvwQkgi","zh-hans_contribute_first-party-plugins.md":"CkiCExlE","zh-hans_contribute_github-actions.md":"DoUyLvGI","zh-hans_guide_getting-started.md":"DY6HBraC","zh-hans_guide_introduction.md":"BDqDXkXl","zh-hans_index.md":"BkAOT6OQ","zh-hans_manage_commands.md":"DyG9aM0W","zh-hans_manage_configuration.md":"BXNUGmSk","zh-hans_manage_core.md":"Cn8uDogS","zh-hans_manage_plugins.md":"DTOXb_Nj","zh-hans_manage_versions.md":"DkeX4EwJ","zh-hans_more_community-projects.md":"dTVUkig9","zh-hans_more_faq.md":"DmYFtjwD","zh-hans_more_thanks.md":"wO7wGCsP","zh-hans_plugins_create.md":"Bb5e3jX_"} diff --git a/index.html b/index.html new file mode 100644 index 00000000..87b110b6 --- /dev/null +++ b/index.html @@ -0,0 +1,25 @@ + + + + + + asdf + + + + + + + + + + + + + + +
Skip to content

asdf

The Multiple Runtime Version Manager

Manage all your runtime versions with one tool!

+ + + + \ No newline at end of file diff --git a/ja-jp/contribute/core.html b/ja-jp/contribute/core.html new file mode 100644 index 00000000..c0a4476a --- /dev/null +++ b/ja-jp/contribute/core.html @@ -0,0 +1,55 @@ + + + + + + asdf + + + + + + + + + + + + + + +
Skip to content

asdf

これは、asdfコアのコントリビューションガイドです。

初期セットアップ

GitHubでasdfをフォークするか、デフォルトのブランチをGitクローンしてください:

shell
# 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自身でこれらのツールを管理したい場合は、下記のようにプラグインを追加してください:

shell
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の開発に必要なバージョンを、下記のようにインストールします:

shell
asdf install

開発ツールに影響を与える特定の機能を壊す可能性もあるため、ローカルマシンで開発する際は、asdfを使用しないほうが 良いかもしれません 。下記に、使用しているツールを列挙します:

  • bats-core: BashまたはPOSIX準拠のスクリプトを単体テストするための、Bash自動テストシステムです。
  • shellcheck: シェルスクリプトの静的解析ツールです。
  • shfmt: Bashをサポートするシェルパーサ、フォーマッタ、インタプリタです。

開発

インストール済みのasdfに変更を加えずに、あなたが開発した変更内容を試したいときは、$ASDF_DIR変数に、クローンしたリポジトリのパスを設定し、そのディレクトリのbinshimsディレクトリを一時的にパスの先頭へ追加します。

リモートにコミットまたはプッシュする前に、コードをローカルでフォーマット、Lint、およびテストすることを推奨します。その際は、次のスクリプト/コマンドを使用してください:

shell
# 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のドキュメントもご覧ください。

Gitignore

下記は、asdf-vm/asdfリポジトリの.gitignoreファイルです。プロジェクト固有のファイルは無視をしています。使用しているOS、ツール、およびワークフロー固有のファイルは、グローバルな.gitignore構成で無視する必要があります。詳しくはこちらをご覧ください。

@Gitignoreコード

.git-blame-ignore-revs

asdfでは、.git-blame-ignore-revsを使用して、Blameを実行する際のノイズを減らしています。詳しくは、git blameのドキュメントをご覧ください。

git blameを実行するときは、下記のように、このファイルと共に使います:

sh
git blame --ignore-revs-file .git-blame-ignore-revs ./test/install_command.bats

毎回手動でファイルを指定しなくても、gitのオプションで、blameを呼び出すたびにこのファイルを使うように設定することもできます:

sh
git config blame.ignoreRevsFile .git-blame-ignore-revs

このファイルを使用するように、IDEを設定することもできます。例えば、VSCode(およびGitLens)を使う場合は、.vscode/settings.jsonに下記のように記述します:

json
{
+  "gitlens.advanced.blame.customArguments": [
+    "--ignore-revs-file",
+    ".git-blame-ignore-revs"
+  ]
+}

Batsテスト

ローカルでテストを実行するには、下記のようにテストを呼び出します:

shell
./scripts/test.bash

テストを作成する前に、下記項目を一通り参照してください:

Batsのヒント

Batsでのデバッグは、難しいことがあります。-tフラグを指定してTAP出力を有効にすると、テスト実行中に特殊なファイルディスクリプタ>&3を使用して出力を表示できるため、デバッグが簡単になります。例えば次のとおりです:

shell
# 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で説明されています。

プルリクエスト、リリース、Conventional Commits

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>の種類は次のとおりです: featfixdocsstylerefactorperftestbuildcichorerevert

  • !: 破壊的変更を示します
  • fix: セマンティックバージョンのpatchを新しく作成します
  • feat: セマンティックバージョンのminorを新しく作成します
  • <type>!: セマンティックバージョンのmajorを新しく作成します

プルリクエストのタイトルは、このフォーマットに従う必要があります。

ヒント

プルリクエストのタイトルには、Conventional Commit messageのフォーマットを使用してください。

Dockerイメージ

asdf-alpineおよびasdf-ubuntuプロジェクトは、一部のasdfツールのDocker化されたイメージを提供する取り組みを継続的に行っています。これらのDockerイメージは、開発用サーバのベースとしたり、本番用アプリケーションの実行用途として使用することができます。

+ + + + \ No newline at end of file diff --git a/ja-jp/contribute/documentation.html b/ja-jp/contribute/documentation.html new file mode 100644 index 00000000..42a68eb9 --- /dev/null +++ b/ja-jp/contribute/documentation.html @@ -0,0 +1,66 @@ + + + + + + ドキュメント & サイト | asdf + + + + + + + + + + + + + + +
Skip to content

ドキュメント & サイト

これは、ドキュメントおよびサイトのコントリビューションガイドです。

初期セットアップ

GitHubでasdfをフォークするか、デフォルトのブランチをGitクローンしてください:

shell
# 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で管理されています。下記のようにプラグインを追加してください:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

開発に必要なバージョンを、下記のようにインストールします:

shell
asdf install
  • Node.js: ChromeのV8 JavaScriptエンジンをベースに構築されたJavaScriptランタイムです。

docs/package.jsonをもとに、Node.jsの依存関係をインストールしてください:

shell
npm install

開発

VitePress (v2)は、asdfドキュメントサイトを構築するために使用している静的サイトジェネレータ(SSG)です。類似ツールであるDocsify.jsやVuePressに代わってVitePressが採用されたのは、ユーザがJavaScriptを使用できない、または有効にしていない場合に、HTMLのみのフォールバックをサポートしたいからでした。これは、DocsifyとVitePressがVuePressに急速に取って代わっていた場合には不可能でした。これ以外の機能セットはほとんど同じで、最小限の構成でMarkdownファイルを書くことに重点を置いています。

package.jsonには、開発に必要なスクリプトが含まれています:

@package.jsonのコード

ローカルの開発サーバを起動するには、次のように実行します:

shell
npm run dev

コミットする前にコードをフォーマットするには、次のように実行します:

shell
npm run format

プルリクエスト、リリース、Conventional Commits

asdfは、プルリクエストタイトルのConventional Commitsに依存する自動リリースパイプラインを使用しています。詳しくは、コアのコントリビューションガイドのドキュメントに記述されています。

ドキュメントの変更に関するプルリクエストを作成する場合、プルリクエストのタイトルは、Conventional Commit typeをdocsとして、docs: <description>というフォーマットで作成するようにしてください。

Vitepress

サイトの構成設定は、構成を示すために使用されるJSオブジェクト含んだ、いくつかのTypeScriptファイルに記述されています。以下のとおりです:

  • docs/.vitepress/config.js: サイトのルート構成ファイルです。仕様については、VitePressのドキュメントをご覧ください。

ルート構成ファイルを簡素化するために、 Navバーサイドバー の構成を示す大きなJSオブジェクトについては、別ファイルに切り出されており、かつ、ロケールごとに分類されています。次の両方のファイルを参照してください:

  • docs/.vitepress/navbars.js
  • docs/.vitepress/sidebars.js

これらの構成設定に関する公式ドキュメントは、Default Theme Referenceをご覧ください。

I18n

VitePressは、国際化対応に関して最高のサポートを備えています。 ルート構成ファイルであるdocs/.vitepress/config.jsでは、サポートされているロケールとそのURL、ドロップメニューのタイトル、Navバー/サイドバーの構成への参照を定義しています。

Navバー/サイドバーの構成設定は前述の構成ファイルにキャプチャされ、ロケールごとに分類され、個別にエクスポートされます。

各ロケールのMarkdownコンテンツは、ルート構成ファイル内のlocales内のキーと同じ名前のディレクトリ配下に配置する必要があります。ルート構成が下記の場合:

js
// 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ファイルのセットを配置する必要があります:

shell
docs
+├─ README.md
+├─ foo.md
+├─ nested
+  └─ README.md
+└─ pt-BR
+   ├─ README.md
+   ├─ foo.md
+   └─ nested
+      └─ README.md

公式のVitePress i18nドキュメントには、より詳細な説明が記述されています。

+ + + + \ No newline at end of file diff --git a/ja-jp/contribute/first-party-plugins.html b/ja-jp/contribute/first-party-plugins.html new file mode 100644 index 00000000..a40bf11f --- /dev/null +++ b/ja-jp/contribute/first-party-plugins.html @@ -0,0 +1,25 @@ + + + + + + 公式プラグイン | asdf + + + + + + + + + + + + + + +
Skip to content

公式プラグイン

asdfコアチームでは、日々のワークライフに関連するプラグインをいくつか作成しています。これらのプラグインのメンテナンスおよび改善にご協力いただける方を、いつでも歓迎しています。詳しくは、下記リンクから、それぞれのリポジトリを参照してください:

コミュニティプラグインについては、下記をご覧ください:

+ + + + \ No newline at end of file diff --git a/ja-jp/contribute/github-actions.html b/ja-jp/contribute/github-actions.html new file mode 100644 index 00000000..dedbeeb5 --- /dev/null +++ b/ja-jp/contribute/github-actions.html @@ -0,0 +1,25 @@ + + + + + + GitHub Actions | asdf + + + + + + + + + + + + + + +
Skip to content

GitHub Actions

ご興味を持っていただきありがとうございます。既存のイシュー、議論、コントリビューションガイドについては、asdf actions リポジトリをご覧ください。

+ + + + \ No newline at end of file diff --git a/ja-jp/guide/getting-started.html b/ja-jp/guide/getting-started.html new file mode 100644 index 00000000..71571f7f --- /dev/null +++ b/ja-jp/guide/getting-started.html @@ -0,0 +1,37 @@ + + + + + + はじめよう | asdf + + + + + + + + + + + + + + +
Skip to content

はじめよう

asdfのインストールには次の手順が必要です:

  1. 依存関係のインストール
  2. asdfコアのダウンロード
  3. asdfのインストール
  4. 管理したいツール/ランタイムごとにプラグインをインストール
  5. ツール/ランタイムの特定バージョンをインストール
  6. .tool-versionsファイルで、グローバルまたはプロジェクトのバージョンをセット

1. 依存関係のインストール

asdfの動作にはgitおよびcurlが必要です。以下の表は、 あなたが使用している パッケージマネージャで実行するコマンドの 一部例 です(いくつかのツールは、後の手順で自動的にインストールされます)。

OSパッケージマネージャコマンド
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

備考

お使いのシステムの構成によっては、接頭にsudoが必要となる場合もあります。

2. asdfのダウンロード

公式ダウンロード

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0

コミュニティがサポートするダウンロード方法

理由がない限り、gitコマンドを使用した公式ダウンロードの手順を使用することを強く推奨します。

方法コマンド
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si または好みのAURヘルパーを使用

3. asdfのインストール

あなたが使用しているシェル、OS、およびインストール方法によって、ここでの設定方法が変わります。最も適したものを選択してください。

masOSユーザの方は、この節の最後にあるpath_helperに関する警告を必ず参照してください。

Bash & Git

~/.bashrcに下記の行を追記します:

shell
. "$HOME/.asdf/asdf.sh"

コマンド補完が必要な場合は、.bashrcに下記の行を追記します:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

macOS Catalina以降を使用している場合、デフォルトのシェルはZSHです。Bashに変更していない限り、ZSHの手順を参照してください。

~/.bash_profileに下記の行を追記します:

shell
. "$HOME/.asdf/asdf.sh"

コマンド補完が必要な場合は、.bash_profileに下記の行を追記します:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

下記コマンドで、~/.bashrcasdf.shを追加します:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.bashrc

コマンド補完が必要な場合は、Homebrewのガイドに従って設定を完了させるか、下記コマンドを実行します:

shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bashrc
Bash & Homebrew (macOS)

macOS Catalina以降を使用している場合、デフォルトのシェルはZSHです。Bashに変更していない限り、ZSHの手順を参照してください。

下記コマンドで、~/.bash_profileasdf.shを追加します:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.bash_profile

コマンド補完が必要な場合は、Homebrewのガイドに従って設定を完了させるか、下記コマンドを実行します:

shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bash_profile
Bash & Pacman

~/.bashrcに下記の行を追記します:

shell
. /opt/asdf-vm/asdf.sh

コマンド補完が必要な場合は、bash-completionをインストールします。

Fish & Git

~/.config/fish/config.fishに下記の行を追記します:

shell
source ~/.asdf/asdf.fish

コマンド補完が必要な場合は、下記コマンドを実行します:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

下記コマンドで、~/.config/fish/config.fishasdf.shを追加します:

shell
echo -e "\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

コマンド補完は、Fish shellのHomebrewが担います。親切ですね!

Fish & Pacman

~/.config/fish/config.fishに下記の行を追記します:

shell
source /opt/asdf-vm/asdf.fish

コマンド補完は、AURパッケージのインストール時に自動的に設定されます。

Elvish & Git

下記コマンドで、~/.config/elvish/rc.elvasdf.elvを追加します:

shell
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

コマンド補完は自動的に設定されます。

Elvish & Homebrew

下記コマンドで、~/.config/elvish/rc.elvasdf.elvを追加します:

shell
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

コマンド補完は自動的に設定されます。

Elvish & Pacman

下記コマンドで、~/.config/elvish/rc.elvasdf.elvを追加します:

shell
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

コマンド補完は自動的に設定されます。

ZSH & Git

~/.zshrcに下記の行を追記します:

shell
. "$HOME/.asdf/asdf.sh"

またはasdf for oh-my-zshのようなZSHフレームワークプラグインを使用して、このスクリプトをsourceし、コマンド補完をセットアップします。

コマンド補完は、ZSHフレームワークのasdfプラグインで設定するか、~/.zshrcに下記の行を追記することで設定できます:

shell
# append completions to fpath
+fpath=(${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • compinitのセットアップをカスタマイズしている場合は、asdf.shソース以下にcompinitがくるようにしてください。
  • ZSHフレームワークでcompinitのセットアップをカスタマイズしている場合は、フレームワークソース以下にcompinitがくるようにしてください。

警告

ZSHフレームワークを使用している場合、新しいZSHコマンド補完を使用するには、fpath経由で、関連するasdfプラグインの更新が必要となることがあります。Oh-My-ZSH asdfプラグインは、ohmyzsh/ohmyzsh#8837でご覧いただくと分かるとおり、まだ更新されていません。

ZSH & Homebrew

下記コマンドで、~/.zshrcasdf.shを追加します:

shell
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でご覧いただくと分かるとおり、まだ更新されていません。

ZSH & Pacman

~/.zshrcに下記の行を追記します:

shell
. /opt/asdf-vm/asdf.sh

コマンド補完は、ZSHに適した場所に配置されますが、オートコンプリートを使用するようにZSHを設定する必要があります

PowerShell Core & Git

~/.config/powershell/profile.ps1に下記の行を追記します:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

下記コマンドで、~/.config/powershell/profile.ps1asdf.shを追加します:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.ps1\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

~/.config/powershell/profile.ps1に下記の行を追記します:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

下記コマンドで、~/.config/nushell/config.nuasdf.nuを追加します:

shell
"\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

コマンド補完は自動的に設定されます。

Nushell & Homebrew

下記コマンドで、~/.config/nushell/config.nuasdf.nuを追加します:

shell
"\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

コマンド補完は自動的に設定されます。

Nushell & Pacman

下記コマンドで、~/.config/nushell/config.nuasdf.nuを追加します:

shell
"\n$env.ASDF_DIR = '/opt/asdf-vm/'\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

コマンド補完は自動的に設定されます。

POSIX Shell & Git

~/.profileに下記の行を追記します:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

下記コマンドで、~/.profileasdf.shを追加します:

shell
echo -e "\nexport ASDF_DIR=\"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
+echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
POSIX Shell & Pacman

~/.profileに下記の行を追記します:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

asdfのスクリプトは、$PATHを設定したあと、かつ、使用中のフレームワーク(oh-my-zsh など)を呼び出したあとに記述する必要があります。

警告

macOSでは、BashまたはZSHシェルを起動すると、自動的にpath_helperというユーティリティが呼び出されます。path_helperPATH(およびMANPATH)内の項目の順番を並び替えることができるため、特定の順序を必要とするツールの動作に、一貫性が無くなってしまいます。これを回避するため、macOSでasdfを利用するときは、強制的にPATHエントリの先頭に追加する(優先度を一番高くする)ようにしてください。これは、ASDF_FORCE_PREPEND環境変数で制御できます。

PATHの変更を反映するために、シェルを再起動してください。たいていの場合、ターミナルのタブを新たに開けばOKです。

コアのインストールが完了!

これで、asdfのコアのインストールは完了です🎉

しかし、asdfが役に立つようになるのは、プラグインをインストールしてからツールをインストールし、バージョンを管理するようになってからです。引き続き、ガイドを進めていきましょう。

4. プラグインのインストール

ここではデモとして、asdf-nodejsプラグインを使用してNode.jsをインストール・設定してみましょう。

プラグインの依存関係

各プラグインには依存関係があるため、プラグインのリポジトリを確認しておきましょう。asdf-nodejsの場合、必要なものは次のとおりです:

OS依存関係インストールコマンド
Debianapt-get install dirmngr gpg curl gawk
CentOS/ Rocky Linux/ AlmaLinuxyum install gnupg2 curl gawk
macOSbrew install gpg gawk

一部のプラグインではインストール後の事後処理でこれらの依存関係が必要となるため、あらかじめインストールしておきましょう。

プラグインのインストール

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. 特定のバージョンのインストール

Node.js用のプラグインをインストールしたので、このツールの特定のバージョンをインストールしましょう。

インストール可能なバージョンはasdf list all nodejsコマンドで確認できますし、特定のメジャーバージョンのサブセットはasdf list all nodejs 14コマンドで確認できます。

最新版をインストールするには、次のコマンドを実行します:

shell
asdf install nodejs latest

備考

asdfでは正確なバージョン番号を指定してください。latestは、現時点での最新バージョンを指定できるasdfのヘルパーです。

6. バージョンをセット

asdfは、カレントディレクトリから上位の$HOMEディレクトリまでに存在するすべての.tool-versionsファイルをもとに、ツールのバージョンを照会します。照会は、asdfで管理するツールを実行した際に、ジャストインタイムで行われます。

警告

ツールで指定されたバージョンが見つからない場合、エラーが発生します。asdf currentコマンドを実行すると、カレントディレクトリにおいてツールのバージョンを解決可能か確認できるため、どのツールが実行に失敗するか検証することができます。

グローバル

グローバルのデフォルト設定は、$HOME/.tool-versionsで管理されます。グローバルのバージョンをセットするには、次のコマンドを実行します:

shell
asdf global nodejs latest

すると、$HOME/.tool-versions内には次のように書き込まれます:

nodejs 16.5.0

一部のOSでは、pythonのように、asdfではなくシステムが管理するツールが既にインストールされていることがあります。それを使用する場合、asdfに対して、バージョン管理をシステムに委任するように指示する必要があります。詳しくは、バージョンのリファレンスをご覧ください。

ローカル

ローカルのバージョン設定は、$PWD/.tool-versionsファイル(カレントディレクトリ内)で定義されます。たいていの場合は、プロジェクトのGitリポジトリ内となるでしょう。対象となるディレクトリで、下記コマンドを実行します:

shell
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つのカテゴリに分けられます:

+ + + + \ No newline at end of file diff --git a/ja-jp/guide/introduction.html b/ja-jp/guide/introduction.html new file mode 100644 index 00000000..369089af --- /dev/null +++ b/ja-jp/guide/introduction.html @@ -0,0 +1,25 @@ + + + + + + イントロダクション | asdf + + + + + + + + + + + + + + +
Skip to content

イントロダクション

asdfは、ツールのためのバージョンマネージャです。すべてのツールのバージョンは単一のファイル(.tool-versions)内で定義されるため、プロジェクトのGitリポジトリにチェックインして共有することで、チーム全員に同じーバージョンのツールを使ってもらえるようになります。

従来は、複数のCLIのバージョンマネージャを用意する必要があり、それぞれが異なるAPI、構成ファイル、および実装($PATHの操作、Shim、環境変数など)となっていました。asdfは、開発ワークフローを簡素化するための単一インターフェースと構成ファイルを提供しており、シンプルなプラグインインターフェースを使って、すべてのツール・ランタイムに拡張することができます。

どうやって動いているの

シェル上でasdfコアがセットアップすると、特定のツールを管理するためのプラグインをインストールすることができるようになります。プラグインによってツールがインストールされると、インストールされる実行ファイルごとにShimが作成されます。これらの実行ファイルを実行しようとすると、代わりにShimが実行され、.tool-versionsで定義されているバージョンをasdfが認識して、当該バージョンが実行されます。

関連プロジェクト

nvm / n / rbenv etc

nvmn、およびrbenvのようなツールはすべて、ツールによってインストールされる実行ファイルのShimを作成するシェルスクリプトです。

asdfはこれらのツールと非常に似ていて、ツール/ランタイムのバージョン管理という分野では競合しています。asdfはプラグインシステムを採用し、他のツールと差別化することで、ツール/ランタイムごとのマネージャ、マネージャごとの異なるコマンド、そしてリポジトリ内の様々な*-versionファイルといったものを排除しています。

direnv

シェルに、ディレクトリごとに環境変数をロード/アンロードできる機能を付け加えます。

asdfは環境変数を管理することはしませんが、direnvの動作をasdfに統合するasdf-direnvプラグインが存在します。

詳しくはdirenvのドキュメントをご覧ください。

Homebrew

macOS(またはLinux)のためのパッケージマネージャー

Homebrewは、パッケージとその上位の依存関係を管理します。asdfは上位の依存関係を管理することはしませんし、パッケージマネージャでもありません。それらの管理はユーザが負担することとなりますが、asdfはなるべく依存関係のリストを小さく保つように努めています。

詳しくはHomebrewのドキュメントをご覧ください。

NixOS

Nixは、パッケージ管理とシステム構成に独自のアプローチを取り入れたツールです。

NixOSは、各ツールの依存関係ツリー全体でパッケージのバージョンを正確に管理することで、真に再現可能な環境を構築することを目指しています。asdfでそのようなことはできません。NixOSは、独自のプログラミング言語、たくさんのCLIツール、そして60,000を超えるパッケージコレクションによって、それらの機能を支えています。

繰り返しになりますが、asdfは上位の依存関係を管理することはしませんし、パッケージマネージャでもありません。

詳しくはNixOSのドキュメントをご覧ください。

なぜasdfを使うの?

asdfは、プラグインシステムによって多くのツールをサポートしており、シェル構成にたった1行のシェルスクリプトを記述するだけで使えるというシンプルさ・親しみやすさによって、チームが確実に同じバージョンのツールを使用することを保証できます。

Note

asdfはシステムのパッケージマネージャになることを目指してはいません。あくまで、ツールのバージョンマネージャです。プラグインを作成することで、どのようなツールでもasdfで管理できるようになりますが、それがそのツールにとって最善の方法であるとは限りませんのでご注意ください。

+ + + + \ No newline at end of file diff --git a/ja-jp/index.html b/ja-jp/index.html new file mode 100644 index 00000000..34bd235e --- /dev/null +++ b/ja-jp/index.html @@ -0,0 +1,25 @@ + + + + + + asdf + + + + + + + + + + + + + + +
Skip to content

asdf

マルチランタイム
バージョンマネージャ

1つのツールですべてのランタイムのバージョンを管理しましょう!

+ + + + \ No newline at end of file diff --git a/ja-jp/manage/commands.html b/ja-jp/manage/commands.html new file mode 100644 index 00000000..fb37e62f --- /dev/null +++ b/ja-jp/manage/commands.html @@ -0,0 +1,90 @@ + + + + + + すべてのコマンド | asdf + + + + + + + + + + + + + + +
Skip to content

すべてのコマンド

asdfで利用可能なすべてのコマンドの一覧です。この一覧は、asdf helpコマンドで表示されるテキストです。

txt
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
+ + + + \ No newline at end of file diff --git a/ja-jp/manage/configuration.html b/ja-jp/manage/configuration.html new file mode 100644 index 00000000..f5b7ceaf --- /dev/null +++ b/ja-jp/manage/configuration.html @@ -0,0 +1,33 @@ + + + + + + 構成設定 | asdf + + + + + + + + + + + + + + +
Skip to content

構成設定

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環境変数で設定できます。

下記は、構成に必要な項目とそのデフォルト値を示しています:

txt
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ファイルを読み込みます。

オプション説明
no デフォルトバージョンの読み込みには.tool-versionsを使用します
yes利用可能なレガシーバージョンファイル(.ruby-versionなど)がある場合、プラグインのフォールバックで使用します

use_release_candidates

asdf updateコマンドでasdfを更新する際に、最新リリースではなく、リリース候補版へ更新するか制御します。

オプション説明
no デフォルト最新リリースを使用します
yesリリース候補版を使用します

always_keep_download

asdf installコマンドでダウンロードしたソースコードやバイナリを、保持しておくか削除するかを制御します。

オプション説明
no デフォルトインストールが成功したら、ソースコードやバイナリを削除します
yesインストール後も、ソースコードやバイナリを保持します

plugin_repository_last_check_duration

asdfプラグインリポジトリの同期間隔(分)を制御します。何らかのトリガーイベントが発生した際に、最後に同期した時刻からの経過時間をチェックします。設定された間隔以上の時間が経過していた倍は、新たに同期が開始されます。

オプション説明
1から999999999までの整数値
デフォルト60
最後に同期した時刻から指定時間(分)以上経過していた場合、トリガーイベントで同期します
0トリガーイベントのたびに同期します
never同期しません

同期は、以下のコマンドが実行されたときに発生します:

  • 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プラグインのショートネームリポジトリの同期を無効化します。ショートネームリポジトリが無効となっている場合、同期イベントはすぐに終了します。

オプション説明
no デフォルト同期イベントが発生した際に、asdfプラグインリポジトリをクローンまたは更新します
yesプラグインショートネームリポジトリを無効化します

同期は、以下のコマンドが実行されたときに発生します:

  • 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

コンパイル時に使用するデフォルトのコア数です。

OptionsDescription
整数値ソースコードのコンパイル時に使用するコア数です
autonprocsysctl hw.ncpu/proc/cpuinfo、または1、の優先順でコア数を計算します

備考: ASDF_CONCURRENCY環境変数が設定されている場合はそちらが優先されます。

プラグインフック

下記のタイミングで、カスタムコードを実行することができます:

  • プラグインのインストール、Shim再生成、更新および削除をする際の前後
  • プラグインコマンドの実行前後

例えば、fooというプラグインがインストールされていて、barという実行可能ファイルが提供されている場合、以下のようなフックを使うことで、一番最初にカスタムコードを実行することができます:

text
pre_foo_bar = echo Executing with args: $@

以下のパターンがサポートされています:

  • pre_<plugin_name>_<command>
  • pre_asdf_download_<plugin_name>
  • {pre,post}_asdf_{install,reshim,uninstall}_<plugin_name>
    • $1: フルバージョン
  • {pre,post}_asdf_plugin_{add,update,remove,reshim}
    • $1: プラグイン名
  • {pre,post}_asdf_plugin_{add,update,remove}_<plugin_name>

どのようなコマンドの前後にどのようなコマンドフックを実行すべきかについての詳細は、プラグインの作成をご覧ください。

環境変数

環境変数の設定値は、お使いのシステムやシェルによって異なります。デフォルトロケーションは、インストールした場所や方法(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の値よりも優先されます。

  • 未設定の場合: asdf構成ファイルのconcurrencyの値が使用されます。
  • 使用方法: export ASDF_CONCURRENCY=32

ASDF_FORCE_PREPEND

asdfのShimやパスのディレクトリをPATHの先頭(最高優先度)に追加するかどうかを設定します。

  • 未設定の場合: macOSでのデフォルト値はyes、その他のシステムでのデフォルト値はnoです。
  • yesの場合: asdfディレクトリを強制的にPATHの先頭に配置します。
  • yes以外の文字列を設定した場合: asdfディレクトリを強制的にPATHの先頭に配置することは しません
  • Usage: ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"

完全な構成の例

下記のように、asdfをシンプルにセットアップしたとします:

  • Bashシェル
  • インストール先は$HOME/.asdf
  • Git経由でインストール
  • 環境変数は何も設定していない
  • .asdfrcファイルは何もカスタマイズしていない

すると、結果として以下のような構成となります:

構成値がセットされる過程
config file location$HOME/.asdfrcASDF_CONFIG_FILEは空なので、$HOME/.asdfrcが使用されます。
default tool versions filename.tool-versionsASDF_DEFAULT_TOOL_VERSIONS_FILENAMEは空なので、.tool-versionsが使用されます。
asdf dir$HOME/.asdfASDF_DIRは空なので、bin/asdfの親ディレクトリが使用されます。
asdf data dir$HOME/.asdfASDF_DATA_DIRは空であり、$HOMEが存在するので、$HOME/.asdfが使用されます。
concurrencyautoASDF_CONCURRENCYは空なので、デフォルト構成concurrencyの値に依存します。
legacy_version_fileno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
use_release_candidatesno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
always_keep_downloadno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
plugin_repository_last_check_duration60.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。
disable_plugin_short_name_repositoryno.asdfrcをカスタマイズしていないので、デフォルト構成を使用します。

内部構成

この節では、パッケージマネージャやインテグレータ向けのasdfの内部構成について記述しているため、ユーザが気にする必要はありません。

  • $ASDF_DIR/asdf_updates_disabled: このファイルが存在する場合、asdf updateコマンドによる更新は無効になります(ファイル内容は関係ありません)。これは、PacmanやHomebrewのようなパッケージマネージャによって使用され、特定のインストールに対して正しい更新方法を適用するようにします。
+ + + + \ No newline at end of file diff --git a/ja-jp/manage/core.html b/ja-jp/manage/core.html new file mode 100644 index 00000000..0a32833c --- /dev/null +++ b/ja-jp/manage/core.html @@ -0,0 +1,42 @@ + + + + + + コア | asdf + + + + + + + + + + + + + + +
Skip to content

コア

コアとなるasdfのコマンドはかなり少量ですが、多くのワークフローを円滑に進めることができます。

インストール & セットアップ

はじめようのガイドで説明されています。

実行

shell
asdf exec <command> [args...]

現在のバージョンのShimでコマンドを実行します。

環境変数

shell
asdf env <command> [util]

情報

shell
asdf info

OS、シェル、およびasdfのデバッグ情報を表示するヘルパーコマンドです。バグレポート作成時に共有してください。

Shimの再作成

shell
asdf reshim <name> <version>

特定のパッケージ・バージョンのShimを再作成します。デフォルトでは、Shimはプラグインによってツールのインストール中に作成されます。npm CLIなどのツールは、実行ファイルをグローバルインストールができます(例:npm install -g yarnコマンドでYarnをインストール)が、これらの実行ファイルはプラグインのライフサイクルを通してインストールされないため、Shimはまだ存在しません。そのような時に、例えばasdf reshim nodejs <version>を実行すると、nodejs<version>に対して、yarnのような新しい実行ファイルのShimを強制的に再作成させることができます。

Shimのバージョン

shell
asdf shim-versions <command>

<command>のShimを提供するプラグインおよびバージョンを一覧で表示します。

例えば、Node.jsにはnodenpmという2つの実行ファイルが提供されています。asdf-nodejsプラグインで、複数のバージョンのツールがインストールされている場合、shim-versionsは下記のような一覧を返します:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

更新

asdfには、Git依存のアップデートコマンドが用意されています(推奨されるインストール方法を使用した場合)。別の方法でインストールした場合、その方法の手順に従ってください:

方法最新の安定リリースmasterブランチの最新コミット
asdf (Git経由)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
Pacman新しいPKGBUILDをダウンロードしてリビルド、
または好みのAURヘルパーを使用

アンインストール

asdfをアンインストールするには以下の手順に従ってください:

Bash & Git
  1. ~/.bashrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. ~/.bash_profileで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. ~/.bashrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

コマンド補完については、Homebrewで説明されている方法で設定されている可能性があるため、そちらのガイドに従って削除する行を見つけてください。

  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

macOS Catalina以降では、デフォルトのシェルがZSHに変更されました。もし、~/.bash_profileに設定が見つからない場合は、~/.zshrcにある可能性があります。その場合は、ZSHの手順をご覧ください。

  1. ~/.bash_profileで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

コマンド補完については、Homebrewで説明されている方法で設定されている可能性があるため、そちらのガイドに従って削除する行を見つけてください。

  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. ~/.bashrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. /opt/asdf-vm/asdf.sh
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. ~/.config/fish/config.fishで、asdf.fishをsourceしている行を削除します:
shell
source ~/.asdf/asdf.fish

そして、次のコマンドで、コマンド補完を削除します:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. ~/.config/fish/config.fishで、asdf.fishをsourceしている行を削除します:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. ~/.config/fish/config.fishで、asdf.fishをsourceしている行を削除します:
shell
source /opt/asdf-vm/asdf.fish
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. ~/.config/elvish/rc.elvで、asdfモジュールを使用している行を削除します:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

そして、次のコマンドで、asdfモジュールを削除します:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. $HOME/.asdfディレクトリを削除します:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. ~/.config/elvish/rc.elvで、asdfモジュールを使用している行を削除します:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

そして、次のコマンドで、asdfモジュールを削除します:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. ~/.config/elvish/rc.elvで、asdfモジュールを使用している行を削除します:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

そして、次のコマンドで、asdfモジュールを削除します:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. ~/.zshrcで、asdf.shおよびコマンド補完をsourceしている行を削除します:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

または、ZSHフレームワークプラグインを使用します。

  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. ~/.zshrcで、asdf.shをsourceしている行を削除します:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. パッケージマネージャでアンインストールします:
shell
brew uninstall asdf --force && brew autoremove
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. ~/.zshrcで、asdf.shをsourceしている行を削除します:
shell
. /opt/asdf-vm/asdf.sh
  1. パッケージマネージャでアンインストールします:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdfディレクトリを削除します:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. asdfのすべての構成ファイルを削除するために次のコマンドを実行します:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"

たったこれだけです! 🎉

+ + + + \ No newline at end of file diff --git a/ja-jp/manage/plugins.html b/ja-jp/manage/plugins.html new file mode 100644 index 00000000..63f353b0 --- /dev/null +++ b/ja-jp/manage/plugins.html @@ -0,0 +1,35 @@ + + + + + + プラグイン | asdf + + + + + + + + + + + + + + +
Skip to content

プラグイン

プラグインは、asdfがNode.jsやRuby、Elixirなどの様々なツールを取り扱えるようにするためのものです。

様々なツールをサポートするために使用されるプラグインAPIについては、プラグインの作成をご覧ください。

追加

下記コマンドでは、GitのURLからプラグインを追加します:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

または下記のコマンドで、プラグインリポジトリのショートネームを指定して追加します:

shell
asdf plugin add <name>
+# asdf plugin add erlang

推奨

リポジトリのショートネームに依存しないために、git-urlを使用することを推奨します。

インストール済みプラグイン一覧

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

全プラグインのショートネーム一覧

shell
asdf plugin list all

全プラグインのショートネーム一覧については、プラグインショートネームの一覧もご覧ください。

更新

shell
asdf plugin update --all

特定のプラグインパッケージを更新したい場合は、下記のように指定してください。

shell
asdf plugin update <name>
+# asdf plugin update erlang

この更新コマンドは、プラグインリポジトリの originデフォルトブランチ における 最新コミット を取得します。バージョニングされたプラグインの更新機能については、現在開発中です(#916)。

削除

bash
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の構成設定のリファレンスをご覧ください。
+ + + + \ No newline at end of file diff --git a/ja-jp/manage/versions.html b/ja-jp/manage/versions.html new file mode 100644 index 00000000..0cfac72e --- /dev/null +++ b/ja-jp/manage/versions.html @@ -0,0 +1,54 @@ + + + + + + バージョン | asdf + + + + + + + + + + + + + + +
Skip to content

バージョン

バージョンのインストール

shell
asdf install <name> <version>
+# asdf install erlang 17.3

プラグインが、ソースコードからのダウンロード・コンパイルをサポートしている場合、ref:fooの形式(fooは特定のブランチ、タグ、またはコミット)でバージョンを指定できます。アンインストールするときも、同じ名前とバージョンを指定する必要があります。

最新安定バージョンのインストール

shell
asdf install <name> latest
+# asdf install erlang latest

下記のように、特定のプレフィックスでの最新安定バージョンをインストールすることもできます。

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

インストール済みバージョン一覧

shell
asdf list <name>
+# asdf list erlang

下記のように、特定のプレフィックスでのバージョンでフィルタすることもできます。

shell
asdf list <name> <version>
+# asdf list erlang 17

インストール可能な全バージョン一覧

shell
asdf list all <name>
+# asdf list all erlang

下記のように、特定のプレフィックスでのバージョンでフィルタすることもできます。

shell
asdf list all <name> <version>
+# asdf list all erlang 17

最新安定バージョンの表示

shell
asdf latest <name>
+# asdf latest erlang

下記のように、特定のプレフィックスでの最新安定バージョンで表示することもできます。

shell
asdf latest <name> <version>
+# asdf latest erlang 17

カレントバージョンのセット

shell
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ファイルでサポートされているものと同じです。

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

システムバージョンへの委任

asdfで管理されているバージョンではなく、<name>で指定されたツールのシステムバージョンを使用するには、バージョンとしてsystemを指定します。

カレントバージョンのセットと同様の方法で、globallocal、またはshellのいずれかにsystemをセットしてください。

shell
asdf local <name> system
+# asdf local python system

カレントバージョンの表示

shell
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

バージョンのアンインストール

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

Shims

asdfがパッケージをインストールすると、そのパッケージに含まれるすべての実行プログラムのShimが$ASDF_DATA_DIR/shimsディレクトリ(デフォルトは~/.asdf/shims)に作成されます。このディレクトリが(asdf.shasdf.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コマンドは、下記のように、インストールされたパッケージへのパスを返すため、この状況を解決するのに役立ちます:

shell
# 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のShimをバイパスしたい場合や、プロジェクトのディレクトリに移動した際に自動的に環境変数を設定したい場合は、asdf-direnvプラグインが役に立ちます。詳細はREADMEをご確認ください。

+ + + + \ No newline at end of file diff --git a/ja-jp/more/community-projects.html b/ja-jp/more/community-projects.html new file mode 100644 index 00000000..4aebc6b5 --- /dev/null +++ b/ja-jp/more/community-projects.html @@ -0,0 +1,25 @@ + + + + + + コミュニティプロジェクト | asdf + + + + + + + + + + + + + + +
Skip to content

コミュニティプロジェクト

asdfに関連するコミュニティプロジェクトをいくつか紹介します:

  • asdf-community: asdfプラグインの長期的なメンテナンスを目的とした コミュニティ主導の共同プロジェクトです。
  • asdf dev container: GitHub Codespacesでasdfによるツール管理をサポートする、 GitHub Dev Container です。

備考

asdfコアチームは、これらのプロジェクトやコードを所有していません。 asdfコアでは、ここに掲載されているものに関連する品質やセキュリティについては責任を負いません。

+ + + + \ No newline at end of file diff --git a/ja-jp/more/faq.html b/ja-jp/more/faq.html new file mode 100644 index 00000000..763edaeb --- /dev/null +++ b/ja-jp/more/faq.html @@ -0,0 +1,25 @@ + + + + + + FAQ | asdf + + + + + + + + + + + + + + +
Skip to content

FAQ

ここでは、asdfに関するよくある質問を紹介します。

WSL1をサポートしていますか?

WSL1 (Windows Subsystem for Linux 1)は公式にはサポートしていません。asdfは正常に動作しない可能性があります。WSL1を公式にサポートする予定はありません。

WSL2をサポートしていますか?

WSL2 (Windows Subsystem for Linux 2)では、あなたが選択したWSLディストリビューションに基づいて、セットアップと依存関係の解決を済ませれば、動作するはずです。

重要なのは、WSL2が正常に動作するのは、カレントワークディレクトリがWindowsドライブではなくUnixドライブである場合に 限られる ということです。

GitHub Actionsでホストランナーのサポートが可能になれば、WSL2でテストスイートを実行する予定ですが、現時点ではそうではないようです。

新しくインストールした実行ファイルが実行できないのですが?

npm install -g yarnを実行したにも関わらず、yarnが実行できません。どうなっているの?

asdfShimを使って実行ファイルを管理しています。プラグインによってインストールされるものは、自動的にShimが作成されますが、asdfが管理しているツールによって実行ファイルがインストールされた場合は、Shimを作成しなければならないということをasdfに通知する必要があります。上記の例では、YarnのShimを作成しなければいけません。詳しくは、asdf reshimコマンドのドキュメントをご覧ください。

シェルが、新しくインストールされたShimを検知してくれないのですが?

asdf reshimコマンドを実行しても問題が解決しない場合、asdf.shasdf.fishのsourceが、シェルの構成ファイル(.bash_profile.zshrcconfig.fishなど)の一番下にないことが原因である可能性があります。$PATHを設定した、そしてフレームワーク(oh-my-zshなど)を使用しているのれあればそれをsourceしたに、sourceする必要があります。

+ + + + \ No newline at end of file diff --git a/ja-jp/more/thanks.html b/ja-jp/more/thanks.html new file mode 100644 index 00000000..b17fd5fa --- /dev/null +++ b/ja-jp/more/thanks.html @@ -0,0 +1,25 @@ + + + + + + 謝辞 | asdf + + + + + + + + + + + + + + +
Skip to content

謝辞

このページを借りて、asdfのオーサーおよびコントリビューターの皆様に感謝を申し上げます!

クレジット

私 (@HashNuke)、高熱、風邪、咳。

コピーライト 2014年から今まで (MIT License)

メンテナー

コントリビューター

GitHubのコントリビューターリスト🙏をご覧ください。

+ + + + \ No newline at end of file diff --git a/ja-jp/plugins/create.html b/ja-jp/plugins/create.html new file mode 100644 index 00000000..935dc626 --- /dev/null +++ b/ja-jp/plugins/create.html @@ -0,0 +1,83 @@ + + + + + + プラグインの作成 | asdf + + + + + + + + + + + + + + +
Skip to content

プラグインの作成

プラグインとは、 言語/ツールのバージョン管理をサポートするための実行スクリプトを含めたGitリポジトリのことです。 これらのスクリプトは、asdf list-all <name>asdf install <name> <version>などの機能をサポートするコマンドを使って、 asdfによって実行されます。

クイックスタート

オリジナルのプラグインを作成するには、次の2つの方法があります:

  1. asdf-vm/asdf-plugin-templateリポジトリを使用し、 デフォルトのスクリプトが実装されたプラグインリポジトリ(名前はasdf-<tool_name>)を 生成 します。 生成できたら、 そのリポジトリをクローンしてsetup.bashのスクリプトを実行し、 テンプレートを対話的に更新していきます。
  2. asdf-<tool_name>という名前のリポジトリを自分で立ち上げ、 以降に記載されている必要なスクリプトを実装します。

プラグインスクリプトの鉄則

  • スクリプト内で他のasdfコマンドを呼び出してはいけません
  • シェルのツール/コマンドへの依存関係を小さく保つようにしてください。
  • 移植性のないツールやコマンドフラグの使用は避けてください。 例えば、sort -Vなどです。 asdfコアの禁止コマンド一覧もご覧ください。

スクリプトの概要

以下は、asdfから呼び出せるスクリプトの全リストです。

スクリプト説明
bin/list-all 必須インストール可能なすべてのバージョンをリストします。
bin/download 必須ツールの特定バージョンのソースコードまたはバイナリをダウンロードします。
bin/install 必須ツールの特定バージョンをインストールします。
bin/latest-stable 推奨指定されたツールの最新安定バージョンをリストします。
bin/help.overviewプラグインおよびツールに関する概要説明を出力します。
bin/help.depsオペレーティングシステムに合わせた依存関係のリストを出力します。
bin/help.configプラグインおよびツールの構成設定一覧を出力します。
bin/help.linksプラグインとツールに関連するリンクリストを出力します。
bin/list-bin-pathsShimを作成するバイナリが存在するディレクトリへの相対パスの一覧を出力します。
bin/exec-envツールのバイナリのShimを実行する前に環境を準備します。
bin/exec-pathツールの特定バージョンの実行ファイルパスを出力します。
bin/uninstallツールの特定バージョンをアンインストールします。
bin/list-legacy-filenames.ruby-versionのような、レガシー構成ファイルのリストを出力します。
bin/parse-legacy-fileレガシーバージョンファイルのカスタムパーサーです。
bin/post-plugin-addプラグインが追加された後に実行されるフックです。
bin/post-plugin-updateプラグインが更新された後に実行されるフックです。
bin/pre-plugin-removeプラグインが削除される前に実行されるフックです。

どのコマンドがどのスクリプトを呼び出すかについては、 各スクリプトの詳細なドキュメントを参照してください。

環境変数の概要

以下は、すべてのスクリプトで使用される環境変数の全リストです。

環境変数説明
ASDF_INSTALL_TYPEversionまたはrefです。
ASDF_INSTALL_VERSIONASDF_INSTALL_TYPEに応じてフルバージョンナンバーまたはGit Refの値が入ります。
ASDF_INSTALL_PATHツールがインストール されている 場所、またはインストール されるべき 場所へのパスです。
ASDF_CONCURRENCYソースコードのコンパイル時に使用するコア数です。make -jのようなフラグを設定する際に便利です。
ASDF_DOWNLOAD_PATHbin/downloadによってソースコードまたはバイナリがダウンロードされる場所へのパスです。
ASDF_PLUGIN_PATHプラグインがインストールされている場所へのパスです。
ASDF_PLUGIN_SOURCE_URLプラグインソースのURLです。
ASDF_PLUGIN_PREV_REFプラグインの以前のgit-refです。
ASDF_PLUGIN_POST_REF更新後のプラグインのgit-refです。
ASDF_CMD_FILEソースとなるファイルのフルパスに解決されます。

備考

すべてのスクリプトですべての環境変数が使用できるわけではありません。 以下の各スクリプトのドキュメントで、そのスクリプトで利用可能な環境変数を確認してください。

必須スクリプト

bin/list-all 必須

説明

インストール可能なすべてのバージョンをリストします。

出力フォーマット

スペース区切りのバージョンリストの文字列を出力する必要があります。例えば次のとおりです:

txt
1.0.1 1.0.2 1.3.0 1.4

最新バージョンが末尾にくる必要があります。

asdfコアは各バージョンを1行ずつ表示するため、 いくつかのバージョンは画面外にはみ出る場合があります。

並べ替え

ウェブサイト上のリリースページからバージョンを取得する場合、 提供されている順序は正しいリリース順となっていることが多いため、 そのままの順序を使用することを推奨します。 逆順にしたければ、tscをパイプで通すだけで十分です。

どうしても並べ替えが避けられない場合、sort -Vは移植性が無いため、次のいずれかの方法を使用することを推奨します:

スクリプトで使用できる環境変数

このスクリプトに環境変数は提供されません。

このスクリプトを呼び出すコマンド

  • asdf list all <name> [version]
  • asdf list all nodejs: このスクリプトで返されるすべてのバージョンを、 1行ずつリストします。
  • asdf list all nodejs 18: このスクリプトで返されるすべてのバージョンから、 18で始まるバージョンのみフィルタし、1行ずつリストします。

asdfからの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/list-all"

bin/download 必須

説明

ツールの特定バージョンのソースコードまたはバイナリを、指定された場所にダウンロードします。

実装内容

  • スクリプトは、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からの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}"/bin/download

bin/install 必須

説明

ツールの特定バージョンを指定された場所にインストールします。

実装内容

  • スクリプトは、指定されたバージョンをASDF_INSTALL_PATHのパスのディレクトリにインストールする必要があります。
  • Shimはデフォルトで、$ASDF_INSTALL_PATH/bin内にあるファイルに対して作成されます。 この動作は、オプションのbin/list-bin-pathsスクリプトでカスタマイズできます。
  • 成功した場合、終了コードは0としてください。
  • 失敗した場合、終了コードは非ゼロとしてください。
  • TOCTOU (Time-of-Check-to-Time-of-Use)の問題を避けるために、ツールのビルドとインストールが成功したとみなされた場合にのみ、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からの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}"/bin/install

オプションスクリプト

bin/latest-stable 推奨

説明

ツールの最新安定バージョンを判定します。このスクリプトが存在しない場合、asdfコアはbin/list-allの出力をtailした結果をもとに判定しますが、ツールによってはこれが望ましくないことがあります。

実装内容

  • スクリプトは、ツールの最新安定バージョンを標準出力する必要があります。
  • 非安定版やリリース候補版は除外されるべきです。
  • フィルタクエリは、スクリプトの第1引数で提供されます。このクエリは、バージョン番号やツールプロバイダによる出力をフィルタするために使用されるべきです。
    • 例えば、rubyプラグインでのasdf list all rubyの出力は、jrubyrbxtrufflerubyなどの多くのプロバイダのRubyバージョンをリストアップします。ユーザが提供したフィルタは、セマンティックバージョンやプロバイダをフィルタするために、プラグインで使用できます。
      > asdf latest ruby
      +3.2.2
      +> asdf latest ruby 2
      +2.7.8
      +> asdf latest ruby truffleruby
      +truffleruby+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つの引数を受け取ります。

bash
"${plugin_path}"/bin/latest-stable "$query"

bin/help.overview

説明

プラグインおよび管理されているツールに関する概要説明を出力します。

実装内容

  • このスクリプトは、プラグインのヘルプを表示するために必要です。
  • ヘッダはasdfコア側で表示するため、スクリプト内では表示しないでください。
  • 自由な形式のテキストで出力して構いませんが、短い1段落程度の説明が理想です。
  • コアとなるasdf-vmドキュメントですでに説明されている情報は出力しないでください。
  • オペレーティングシステムと、インストールされているツールのバージョンに合わせて出力を調整する必要があります(必要に応じて、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からの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.overview

bin/help.deps

説明

オペレーティングシステムに合わせた依存関係のリストを出力します。依存関係を1行ごとに出力します。

bash
git
+curl
+sed

実装内容

  • このスクリプトの出力を考慮するために、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からの呼び出しシグネチャ

bash
"${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からの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.config

説明

プラグインとツールに関連するリンクリストを出力します。リンクを1行ごとに出力します。

bash
Git Repository:	https://github.com/vlang/v
+Documentation:	https://vlang.io

実装内容

  • このスクリプトの出力を考慮するために、bin/help.overviewを用意する必要があります。
  • リンクを1行ごとに出力してください。
  • 形式は以下のいずれかである必要があります:
    • <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からの呼び出しシグネチャ

bash
"${plugin_path}"/bin/help.links

bin/list-bin-paths

説明

ツールの特定バージョンにおける、実行ファイルが含まれるディレクトリの一覧を出力します。

実装内容

  • このスクリプトが存在しない場合、asdfは"${ASDF_INSTALL_PATH}"/binディレクトリ内にあるバイナリを探し、そのバイナリ向けのShimを作成します。
  • 実行ファイルが含まれるディレクトリのパスをスペース区切りで出力してください。
  • パスはASDF_INSTALL_PATHからの相対パスである必要があります。例えば、次のような出力となります:
bash
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からの呼び出しシグネチャ

bash
"${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からの呼び出しシグネチャ

bash
"${plugin_path}/bin/exec-env"

bin/exec-path

ツールの特定バージョンの実行ファイルパスを取得します。 実行ファイルへの相対パスを文字列で出力する必要があります。 これにより、プラグインはShimで指定された実行ファイルパスを条件付きで上書きして返すか、 そうでなければ、Shimで指定されたデフォルトのパスを返すことができます。

説明

ツールの特定バージョンの実行ファイルパスを取得します。

実装内容

  • 実行ファイルへの相対パスを文字列で出力する必要があります。
  • Shimで指定された実行ファイルパスを条件付きで上書きして返すか、そうでなければ、Shimで指定されたデフォルトのパスを返してください。
shell
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

スクリプトで使用できる環境変数

  • 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からの呼び出しシグネチャ

bash
"${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からの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/uninstall"

bin/list-legacy-filenames

説明

ツールのバージョンを決定するために使用されるレガシー構成ファイルのリストを出力します。

実装内容

  • スペース区切りのファイル名リストを出力してください。
    bash
    .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からの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/list-legacy-filenames"

bin/parse-legacy-file

説明

asdfによって発見されたレガシーファイルをパースして、ツールのバージョンを決定します。JavaScriptのpackage.jsonや、Go言語のgo.modのようなファイルから、バージョン番号を抽出するのに役立ちます。

実装内容

  • このスクリプトが存在しない場合、asdfは単純にレガシーファイルをcatしてバージョンを決定します。
  • 決定論的で、常に正確で同じバージョンを返す必要があります:
    • 同じレガシーファイルを解析したら、同じバージョンを返すようにしてください。
    • マシンに何がインストールされているか、また、レガシーバージョンが有効で完全かどうかは関係ありません。一部のレガシーファイルのフォーマットは適切でないときもあります。
  • 下記のように、バージョン番号を1行で出力してください:
    bash
    1.2.3

スクリプトで使用できる環境変数

このスクリプトが呼び出される前に、環境変数が設定されることはありません。

このスクリプトを呼び出すコマンド

ツールのバージョンを読み込むすべてのコマンドから呼び出されます。

asdfからの呼び出しシグネチャ

このスクリプトは、レガシーファイルの内容を読み込むために、レガシーファイルのパスという1つの引数を受け取ります。

bash
"${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からの呼び出しシグネチャ

引数はありません。

bash
"${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からの呼び出しシグネチャ

引数はありません。

bash
"${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からの呼び出しシグネチャ

引数はありません。

bash
"${plugin_path}/bin/pre-plugin-remove"

asdf CLIの拡張コマンド 高度

プラグイン名をサブコマンドとして使用し、 asdfコマンドラインインターフェースを通して呼び出すことのできるlib/commands/command*.bashスクリプトまたは実行ファイルを用意することで、 新しいasdfコマンドを定義することができます。

例えば、fooというプラグインがあるとすると:

shell
foo/
+  lib/commands/
+    command.bash
+    command-bat.bash
+    command-bat-man.bash
+    command-help.bash

ユーザは下記コマンドが実行できるようになります:

shell
$ 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`

プラグイン開発者はこの機能を使って、ツールに関連するユーティリティを提供したり、 asdf自体のコマンド拡張プラグインを作成したりすることができます。

実行可能ビット(executable bit)が付与されている場合、 asdfの実行に代わって、当該スクリプトが実行されます。

実行可能ビット(executable bit)が付与されていない場合、asdfは当該スクリプトをBashスクリプトとしてsourceします。

$ASDF_CMD_FILE環境変数は、ソースとなるファイルのフルパスに解決されます。

haxeは、 この機能使ったプラグインの素晴らしい例です。 このプラグインは、asdf haxe neko-dylibs-linkを提供しており、 Haxeの実行ファイルが実行ディレクトリから相対的に動的ライブラリを見つけようとしてしまう問題を修正します。

プラグインのREADMEには、asdf拡張コマンドに関することを必ず記載するようにしてください。

カスタムShimテンプレート 高度

警告

どうしても必要な場合にのみ使用してください。

asdfでは、カスタムShimテンプレートを使用することができます。 fooという実行ファイルに対して、プラグイン内にshims/fooファイルが存在すれば、 asdfは標準Shimテンプレートを使用する代わりに、そのファイルをコピーします。

この機能は賢く使う必要があります。

asdfコアチームが把握している限り、 この機能は公式プラグインであるElixirプラグインでのみ使用されています。 実行ファイルは、実行ファイルであると同時に、Elixirファイルとしても読み込まれます。 そのため、標準的なBashのShimを使用できないのです。

テスト

asdfでは、プラグインをテストするためのplugin-testコマンドを用意しており、下記のように使用できます:

shell
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プラグインをテストするときは、次のように実行します:
    shell
    # 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環境でテストすることを推奨します。

GitHub Action

asdf-vm/actionsリポジトリでは、 GitHub上でホストされているプラグインをテストするためのGitHub Actionを提供しています。 `.github/workflows/test.yamlのActionsワークフローの例は以下のとおりです:

yaml
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"

TravisCI 構成設定

以下は、.travis.ymlファイルの例です。必要に応じてカスタマイズしてください:

yaml
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を使用する場合、 プラグインの場所への相対パスを渡す必要がある場合があります:

shell
asdf plugin test <tool_name> <path> '<tool_command> --version'

APIレート制限

bin/list-allbin/latest-stableのように、コマンドが外部APIへのアクセスに依存している場合、 自動テスト中にレート制限が発生することがあります。 これを軽減するため、環境変数経由で認証トークンを提供するコードパスがあることを確認してください。 以下に例を示します:

shell
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をもとに直接インストールする方法です:

shell
# asdf plugin add <name> <git_url>
+  asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

asdfの各種コマンドでgit_urlが指定されなかった場合、 asdfは正確なgit_urlを決定するために、 ショートネームインデックスリポジトリを使用します。

このリポジトリの指示に従うことで、 あなたが作成したプラグインを、 ショートネームインデックスに追加することができます。

+ + + + \ No newline at end of file diff --git a/ko-kr/contribute/core.html b/ko-kr/contribute/core.html new file mode 100644 index 00000000..5de0fb0a --- /dev/null +++ b/ko-kr/contribute/core.html @@ -0,0 +1,55 @@ + + + + + + asdf + + + + + + + + + + + + + + +
Skip to content

asdf

asdf 코어 기여 가이드.

초기 설정

Github의 asdf를 fork하거나 clone하세요:

shell
# 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가 직접 관리하기를 바라신다면, 다음 플러그인들을 설치하세요:

shell
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를 개발하기 위한 버전들을 설치하세요:

shell
asdf install

로컬 머신에서 개발 도구를 손상시킬 수 있는 기능을 개발 중일 경우 asdf를 사용하지 않는 것이 좋을 수 있습니다. 개발 도구들의 원본 목록입니다:

  • bats-core: Bash 또는 POSIX 준수 스크립트를 단위 테스트하기 위한 Bash 자동화 테스트 시스템.
  • shellcheck: 셸 스크립트 정적 분석 도구.
  • shfmt: Bash를 지원하는 셸 parser, formatter, interpreter; shfmt 포함

개발

만약 설치된 asdf에 영향 없이 변화들을 테스트해보시고 싶으시다면, $ASDF_DIR 변수를 리포지토리를 clone한 경로에 지정하시고, 그 다음 임시로 binshims 디렉토리들을 경로 앞에 추가하세요.

원격 리포지토리에 커밋 혹은 push하기 전에, 당신의 코드를 format, lint, 그리고 locally test하세요. 다음 스크립트/명령어들을 사용하세요:

shell
# 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

테스트 추가! - 새로운 기능들과 버그 수정들의 리뷰 속도 향상을 위해 테스트들은 필수적입니다. 풀 리퀘스트 요청을 만드시기 전에 새로운 코드 경로들을 추가해주세요. bats-core 문서 참조

Gitignore

다음은 asdf-vm/asdf 리포지토리에 .gitignore 파일입니다. 우리는 프로젝트에 관련된 특정한 파일들을 무시합니다. 운영체제, 툴, workflows에 관련된 파일들은 글로벌 .gitignore 설정에서 무시되어야합니다, 더 보기.

@/../.gitignore

.git-blame-ignore-revs

asdf.git-blame-ignore-revs 사용해 blame 실행에서 잡음을 줄입니다. 더 많은 정보 git blame 문서.

다음과 같이 git blame.git-blame-ignore-revs을 사용:

sh
git blame --ignore-revs-file .git-blame-ignore-revs ./test/install_command.bats

선택적으로, 수동적으로 파일을 제공하는 대신 모든 blame에서 해당 파일을 사용하도록 설정:

sh
git config blame.ignoreRevsFile .git-blame-ignore-revs

IDE들에서 이 파일을 사용하도록 설정할 수 있습니다. 예를 들어, VSCode를 사용하실 경우 (GitLens와 함께), 다음을 .vscode/settings.json에 추가하세요:

json
{
+  "gitlens.advanced.blame.customArguments": [
+    "--ignore-revs-file",
+    ".git-blame-ignore-revs"
+  ]
+}

Bats 테스팅

로컬 테스트 실행:

shell
./scripts/test.bash

테스트 작성 전 반드시 읽기:

  • test/에 존재하는 테스트들
  • bats-core 문서
  • scripts/test.bash에 존재하는 Bats 설정들

Bats 팁

Bats 디버깅은 때에 따라 어려울 수 있습니다. 디버깅 단순화를 위해, -t flag로 TAP output을 사용하여 테스트 실행 중 결과물 출력을 위한 특별한 파일 디스크립터 >&3를 사용할 수 있습니다. 예시:

shell
# 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 버전을 올리고 변동사항을 작성합니다. 이 정보들은 지난 배포들로부터 커밋 history를 읽음으로써 결정됩니다.

유의적 커밋 메세지는 기본 브랜치의 커밋 메세지 형식이 되는 풀 리퀘스트 제목의 형식을 정의합니다. 이것은 GitHub Action에서 강제됩니다 amannn/action-semantic-pull-request.

관습적인 커밋 다음 형식을 따릅니다:

<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.

  • !: 주요한(breaking) 변화들을 나타냅니다
  • fix: 새로운 SemVer patch을 만듭니다
  • feat: 새로운 SemVer minor을 만듭니다
  • <type>!: 새로운 SemVer major을 만듭니다

풀 리퀘스트 제목은 반드시 이 형식을 따라야 합니다.

TIP

풀 리퀘스트 제목을 관습적 커밋 메세지 형식을 사용하세요.

Docker 이미지

asdf-alpineasdf-ubuntu 프로젝트들은 asdf 툴들의 Dockerized 이미지들을 제공하기 위해 진행되고있습니다. 개발 서버의 베이스 혹은 프로덕션 앱들을 위해 docker 이미지들을 사용할 수 있습니다.

+ + + + \ No newline at end of file diff --git a/ko-kr/contribute/documentation.html b/ko-kr/contribute/documentation.html new file mode 100644 index 00000000..2114b0f4 --- /dev/null +++ b/ko-kr/contribute/documentation.html @@ -0,0 +1,66 @@ + + + + + + 문서 & 사이트 | asdf + + + + + + + + + + + + + + +
Skip to content

문서 & 사이트

문서 & 사이트 기여 가이드.

초기 세팅

Github의 asdf fork 그리고/혹은 기본 브랜치 Git clone:

shell
# clone your fork
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# or clone asdf
+git clone https://github.com/asdf-vm/asdf.git

문서 사이트 개발을 위한 도구들은 asdfdocs/.tool-versions에서 관리되고 있습니다. 플러그인들을 추가하기:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

툴 버전들을 설치하기:

shell
asdf install
  • Node.js: Chrome의 V8 JavaScript 엔진을 기반으로 구축된 JavaScript 런타임.

docs/package.json로부터 Node.js dependencies 설치하기:

shell
npm install

개발

VitePress (v2)는 우리가 asdf 문서 사이트를 빌드하기 위해 사용하는 정적 사이트 생성기(SSG)입니다. 이는 사용자가 JavaScript를 사용중이지 않을때도 HTML 폴백을 지원하고, Docsify.js와 결과적으로 VuePress를 대체하기 위해 선택되었습니다. 이는 VuePress로부터 대체된 Docsify & VitePress가 아니면 불가능했을 것입니다. 이것을 제외하면, 최소한의 설정과 함께 마크다운 작성에 집중하는 feature-set은 대부분 비슷합니다.

package.json은 개발에 필요한 스크립트들을 포함합니다:

@code json{3-5}

로컬 개발 서버 시작하기:

shell
npm run dev

커밋 전 코드 형식 맞추기:

shell
npm run format

풀 리퀘스트, 릴리스 & 관습적 커밋

asdf는 PR 제목들의 관습적인 커밋들에 의존하는 자동화된 배포 pipeline을 사용하고 있습니다. 더 자세한 문서는 코어 기여 가이드에서 찾을 수 있습니다.

문서 업데이트를 위한 PR을 만드실때는, PR docs: <description> 형식인 관습적인 커밋 타입 docs 제목을 만들어주세요.

Vitepress

사이트의 설정은 설정을 대표하는 JS 오브젝트의 TypeScript 파일들로 구성되어 있습니다. 그 파일들은 다음과 같습니다:

  • docs/.vitepress/config.js: 사이트를 위한 root 설정 파일. VitePress 문서 참조.

root 설정 단순화를 위해, navbarsidebar 를 대표하는 더 큰 JS 객체가 추출되었고 로케일로 구분되었습니다. 다음을 참조하세요:

  • docs/.vitepress/navbars.js
  • docs/.vitepress/sidebars.js

기본 테마 참고자료에서 위 설정들의 공식 문서를 보실 수 있습니다.

I18n

VitePress는 국제화를 공식적으로 지원합니다. root 설정 docs/.vitepress/config.js는 선택 dropdown에서의 지원되는 로케일들의 URL, 제목과 navbar/sidebar의 설정 레퍼런스들을 정의합니다.

navbar/sidebar 설정들은 앞서 언급한 로케일 별로 나누어지고 내보내기된 설정파일들에 의해 결정됩니다.

각 로케일을 위한 Markdown 내용은 반드시 root 설정안에 locales의 키들과 같은 이름의 폴더에 위치해야합니다. 다시 말해서:

js
// 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 파일들의 세트가 똑같이 필요합니다, 예를 들어:

shell
docs
+├─ README.md
+├─ foo.md
+├─ nested
+  └─ README.md
+└─ pt-BR
+   ├─ README.md
+   ├─ foo.md
+   └─ nested
+      └─ README.md

더 자세한 정보는 공식 VitePress i18n 문서에서 확인 가능합니다.

+ + + + \ No newline at end of file diff --git a/ko-kr/contribute/first-party-plugins.html b/ko-kr/contribute/first-party-plugins.html new file mode 100644 index 00000000..ed54d3a1 --- /dev/null +++ b/ko-kr/contribute/first-party-plugins.html @@ -0,0 +1,25 @@ + + + + + + 공식 플러그인 | asdf + + + + + + + + + + + + + + +
Skip to content

공식 플러그인

asdf 코어 팀은 일상 업무 환경에서 사용되는 플러그인들을 작성해왔습니다. 이 플러그인들을 관리하고 발전시키는 도움은 언제든 환영입니다. 아래 각 링크들에서 관련된 리포지토리들을 확인하세요:

커뮤니티 플러그인 보기:

+ + + + \ No newline at end of file diff --git a/ko-kr/contribute/github-actions.html b/ko-kr/contribute/github-actions.html new file mode 100644 index 00000000..448d58e5 --- /dev/null +++ b/ko-kr/contribute/github-actions.html @@ -0,0 +1,25 @@ + + + + + + GitHub Actions | asdf + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ko-kr/guide/getting-started.html b/ko-kr/guide/getting-started.html new file mode 100644 index 00000000..9c9773b8 --- /dev/null +++ b/ko-kr/guide/getting-started.html @@ -0,0 +1,37 @@ + + + + + + 시작하기 | asdf + + + + + + + + + + + + + + +
Skip to content

시작하기

asdf 설치는 다음과 같습니다:

  1. dependencies 설치
  2. asdf 코어 다운로드
  3. asdf 설치
  4. 관리하고 싶은 각각의 툴/런타임 플러그인 설치
  5. 툴/런타임 버전 설치
  6. .tool-versions 설정 파일들을 통해 글로벌 혹은 프로젝트 버전들 설정

1. Dependencies 설치

asdf는 git & curl이 필요합니다. 당신이 필요한 패키지 매니저를 구동하기 위한 일부 명령어들의 목록입니다. (몇몇은 나중 단계에서 자동으로 설치될 수 있습니다).

운영체제패키지 매니저명령어
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

노트

시스템 설정에 의해 sudo가 필요할 수 있습니다.

2. asdf 다운로드

공식 다운로드

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.14.0

커뮤니티 지원 다운로드 방법

공식 git 방식을 사용할 것을 적극적으로 권장드립니다.

방법명령어
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si 혹은 선호하시는 AUR helper 사용

3. asdf 설치

설정에 영향을 미치는 다양한 셸, 운영체제들 & 설치방법의 조합들이 있습니다. 아래 선택사항들 중 가장 적합한 것을 사용하세요.

macOS 사용자들은 이 섹션 마지막 부분에 path_helper에 경고를 반드시 읽어보세요.

Bash & Git

다음을 ~/.bashrc에 추가하세요:

shell
. "$HOME/.asdf/asdf.sh"

자동완성 설정은 다음을 .bashrc에 추가하세요:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

macOS Catalina 혹은 그 이상을 사용하신다면, 기본 셸이 ZSH로 변경되었습니다. Bash로 다시 변경하지 않으셨다면, ZSH의 설치방법을 따라주세요.

다음을 ~/.bash_profile에 추가하세요:

shell
. "$HOME/.asdf/asdf.sh"

자동완성 설정은 다음을 .bash_profile에 직접 추가하세요:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

~/.bashrcasdf.sh를 추가하세요:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.bashrc

자동완성은 Homebrew'의 방법에 따라 설정되어야 합니다 혹은 다음을 이용하세요:

shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bashrc
Bash & Homebrew (macOS)

macOS Catalina 혹은 그 이상을 사용하신다면, 기본 셸이 ZSH로 변경되었습니다. Bash로 다시 변경하지 않으셨다면, ZSH의 설치방법을 따라주세요.

~/.bash_profileasdf.sh 추가하기:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.bash_profile

자동완성은 Homebrew'의 방법에 따라 설정되어야 합니다 혹은 다음을 이용하세요:

shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bash_profile
Bash & Pacman

다음을 ~/.bashrc에 추가하세요:

shell
. /opt/asdf-vm/asdf.sh

자동완성을 위해 bash-completion이 설치 되어야합니다.

Fish & Git

다음을 ~/.config/fish/config.fish에 추가하세요:

shell
source ~/.asdf/asdf.fish

다음 명령어로 자동완성을 설정하세요:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

~/.config/fish/config.fishasdf.fish를 추가하세요:

shell
echo -e "\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

자동완성은 Fish 셸 Homebrew에 의해 관리됩니다. 편하죠!

Fish & Pacman

다음을 ~/.config/fish/config.fish에 추가하세요:

shell
source /opt/asdf-vm/asdf.fish

자동완성은 AUR 패키지를 통한 설치로 자동적으로 설정됩니다.

Elvish & Git

~/.config/elvish/rc.elvasdf.elv를 추가하세요:

shell
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

자동완성은 자동적으로 설정됩니다.

Elvish & Homebrew

Add asdf.elv to your ~/.config/elvish/rc.elv with:

shell
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

자동완성은 자동적으로 설정됩니다.

Elvish & Pacman

~/.config/elvish/rc.elvasdf.elv를 추가하세요:

shell
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

자동완성은 자동적으로 설정됩니다.

ZSH & Git

다음을 ~/.zshrc에 추가하세요:

shell
. "$HOME/.asdf/asdf.sh"

혹은 위 스크립트와 자동완성을 설정하는 asdf를 위한 oh-my-zsh와 같은 ZSH 프레임워크 플러그인을 사용하세요.

자동완성은 ZSH 프레임워크 asdf 플러그인 혹은 다음을 .zshrc에 추가함으로써 설정됩니다:

shell
# append completions to fpath
+fpath=(${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • 만약 custom compinit 설정을 사용중이라면, asdf.sh를 source하고 난 다음 compinit가 오도록 해주세요
  • 만약 ZSH 프레임워크를 통해 custom compinit 설정을 사용중이라면, 해당 프레임워크를 source하고 난 다음 compinit가 오도록 해주세요

경고

만약 ZSH 프레임워크를 사용중이라면, fpath를 통해 새로운 ZSH 자동완성을 사용하려면 관련된 asdf 플러그인이 업데이트 되어야합니다. Oh-My-ZSH asdf 플로그인이 아직 업데이트 되지 않았습니다, ohmyzsh/ohmyzsh#8837 참고.

ZSH & Homebrew

~/.zshrcasdf.sh를 추가하세요:

shell
echo -e "\n. $(brew --prefix asdf)/libexec/asdf.sh" >> ${ZDOTDIR:-~}/.zshrc

혹은 위 스크립트와 자동완성을 설정하는 asdf를 위한 oh-my-zsh와 같은 ZSH 프레임워크 플러그인을 사용하세요.

자동완성은 asdf ZSH 프레임워크 혹은 Homebrew'의 방법에 따라 설정되어야 합니다. 만약 ZSH 프레임워크를 사용중이라면, fpath를 통해 새로운 ZSH 자동완성을 사용하려면 관련된 asdf 플러그인이 업데이트 되어야합니다. Oh-My-ZSH asdf 플로그인이 아직 업데이트 되지 않았습니다, ohmyzsh/ohmyzsh#8837 참고.

ZSH & Pacman

다음을 ~/.zshrc에 추가하세요:

shell
. /opt/asdf-vm/asdf.sh

자동완성은 ZSH 친화적인 위치에 있지만, ZSH는 자동완성 사용을 위해 반드시 설정 되어야합니다.

PowerShell Core & Git

다음을 ~/.config/powershell/profile.ps1에 추가하세요:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

~/.config/powershell/profile.ps1asdf.sh를 추가하세요:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.ps1\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

다음을 ~/.config/powershell/profile.ps1에 추가하세요:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

~/.config/nushell/config.nuasdf.nu를 추가하세요:

shell
"\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

자동완성은 자동적으로 설정됩니다.

Nushell & Homebrew

~/.config/nushell/config.nuasdf.nu를 추가하세요:

shell
"\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

자동완성은 자동적으로 설정됩니다.

Nushell & Pacman

~/.config/nushell/config.nuasdf.nu를 추가하세요:

shell
"\n$env.ASDF_DIR = '/opt/asdf-vm/'\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

자동완성은 자동적으로 설정됩니다.

POSIX Shell & Git

다음을 ~/.profile에 추가하세요:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

~/.profileasdf.sh를 추가하세요:

shell
echo -e "\nexport ASDF_DIR=\"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
+echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
POSIX Shell & Pacman

다음을 ~/.profile에 추가하세요:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

asdf 스크립트들은 $PATH 설정한 이후에 프레임워크 (oh-my-zsh 등) source 이후에 source 되어야 합니다.

::: 경고 macOS에서, Bash 혹은 Zsh 셸 시작시에 자동적으로 path_helper 유틸리티를 실행시킵니다. path_helperPATH (와 MANPATH)에 항목들을 재배열 시켜 특정 순서를 요구하는 툴들의 일관된 동작을 방해합니다. 이를 방지하기 위해, macOS에서 asdfPATH 앞부분에 (가장 높은 우선순위) 강제로 추가합니다. 이는 ASDF_FORCE_PREPEND를 통해 변경가능합니다. :::

PATH 업데이트를 위해 셸을 재시작하세요. 새로운 터미널을 여는 경우 대부분 해결됩니다.

코어 설치 완료!

asdf 코어 설치를 완료했습니다 🎉

asdf플러그인을 설치하고, 버전들을 관리해야 유용합니다. 설치 및 관리방법을 이 가이드 아래에서 계속해서 배우세요.

4. 플러그인 설치

데모 목적으로 우리는 asdf-nodejs 플러그인을 통해 Node.js 설치 & 설정을 해보겠습니다.

플러그인 Dependencies

각 플러그인은 dependencies 갖고 있어 우리는 플러그인 리포지토리의 목록을 확인해야합니다. asdf-nodejs는 다음을 가지고 있습니다:

OSDependency 설치
Debianapt-get install dirmngr gpg curl gawk
CentOS/ Rocky Linux/ AlmaLinuxyum install gnupg2 curl gawk
macOSbrew install gpg gawk

우리는 어떤 플러그인들은 설치-후 훅들을 갖고있어 dependencies 먼저 설치해야합니다.

플러그인 설치

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. 버전 설치

이제 우리는 Node.js를 위한 플러그인을 갖고있어 툴 버전을 설치할 수 있습니다.

우리는 asdf list all nodejs를 통해 어떤 버전들이 이용가능한지 혹은 asdf list all nodejs 14를 통해 하위 버전들을 확인가능합니다.

우리는 이용가능한 latest 버전을 설치할 것입니다.

shell
asdf install nodejs latest

노트

asdf는 정확한 버전들을 강제합니다. latestasdf가 실행했을때 실제 버전을 찾는 헬퍼입니다.

6. 버전 설정

asdf는 현재 작업 디렉토리부터 $HOME 디렉토리까지 모든 .tool-versions 파일들에서 버전 검색을 수행합니다. 검색은 asdf가 관리하는 툴을 실행시킬때 맞춰서 실행됩니다.

::: 경고 툴 실행을 위한 툴 버전을 설정하지 않으면 에러가 발생합니다. asdf current는 현재 디렉토리로부터 툴 & 버전을 표시함으로써 어떤 툴들이 실행을 실패하는지 관찰할 수 있게합니다. :::

글로벌

글로벌 기본값들은 $HOME/.tool-versions에서 관리됩니다. 글로벌 버전을 다음을 이용해 설정하세요:

shell
asdf global nodejs latest

$HOME/.tool-versions은 다음과 같습니다:

nodejs 16.5.0

어떤 운영체제들은 asdf가 아닌 시스템에 의해 관리되는 툴들이 이미 설치되어 있습니다, python이 대표적인 예시입니다. 당신은 시스템에 의한 툴 관리를 위해 asdf를 설정해야합니다. 버전 참조 섹션를 참고하세요.

로컬

로컬 버전들은 (현재 작업 디렉토리) $PWD/.tool-versions 파일에 정의 되어 있습니다. 보통, 이 디렉토리는 하나의 프로젝트의 Git 리포지토리입니다. 툴 버전을 설정하고 싶은 디렉토리에서 다음을 실행시키세요:

shell
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

더 많은 설정 옵션들은 configuration 페이지를 참고하세요.

가이드 끝!

asdf 시작하기 가이드가 끝났습니다. 🎉 당신은 이제 당신의 프로젝트의 nodejs 버전들을 관리할 수 있습니다. 같은 방법으로 다른 각각의 툴들의 버전을 관리하세요!

asdf는 우리가 익숙해져야하는 더 많은 명령어들을 가지고 있고, asdf --help 혹은 asdf를 통해 확인할 수 있습니다. 명령어들의 코어의 3가지 카테고리로 나눠질 수 있습니다:

+ + + + \ No newline at end of file diff --git a/ko-kr/guide/introduction.html b/ko-kr/guide/introduction.html new file mode 100644 index 00000000..5dfa48c5 --- /dev/null +++ b/ko-kr/guide/introduction.html @@ -0,0 +1,25 @@ + + + + + + 소개 | asdf + + + + + + + + + + + + + + +
Skip to content

소개

asdf는 툴 버전 매니저입니다. 모든 툴 버전 정의들은 당신의 팀들과 공유되는 프로젝트의 Git 리포지토리에서 확인할 수 있는 하나의 (.tool-versions) 파일에 있으며, 모든 사람들이 정확히 같은 버전의 툴들을 사용하게 합니다.

기존의 작업 방식은 여러 CLI 버전 매니저들, 각각의 고유한 API, 설정 파일들 그리고 구현이 필요했었습니다 (e.g. $PATH 조정, shims, 환경 변수 등...). asdf는 개발 워크플로우 단순화를 위해 단 하나의 인터페이스와 설정파일을 제공하고 단순한 플러그인 인터페이스를 통해 모든 툴과 런타임들 확장가능합니다.

작동방식

asdf 코어가 셸 설정과 함께 설치되면, 플러그인들이 특정 툴들을 관리하기 위해 설치됩니다. 플러그인에 의해 한가지 툴이 설치되면, shims들을 가진 실행파일들이 각각의 툴들을 위해 생성됩니다. 실행파일들을 실행하려 할 때, .tool-versions에 설정된 툴의 버전을 통해 asdf가 어떤 버전을 실행시킬 지 결정하고 해당 shim이 대신 실행됩니다.

관련된 프로젝트

nvm / n / rbenv 등

nvm, n 그리고 rbenv과 같은 툴들은 설치된 실행파일을 위한 shim들을 만드는 셸 스크립트들로 작성되어 있습니다.

asdf는 매우 비슷하고 툴/런타임 버전 관리의 영역에서 경쟁하기 위해 만들어졌습니다. asdf의 차별화 요소는 플러그인 시스템이 툴/런타임 별 매니저의 필요성, 각기 다른 명령어들, 그리고 리포지토리에 각각 *-version 파일들을 제거하였다는 것입니다.

direnv

현재 디렉토리에 따라 환경 변수들을 load와 unload 할 수 있는 새로운 기능을 기존의 셸에 추가합니다.

asdf는 환경 변수들을 관리하지 않습니다만, asdf-direnv 플러그인을 통해 direnv 동작를 asdf에 통합할 수 있습니다.

direnv 문서에서 더보기.

Homebrew

macOS (혹은 Linux)에서의 패키지 매니저 부재

Homebrew는 패키지들과 upstream dependencies들을 관리합니다. asdf는 upstream dependencies들을 관리하지 않고, 패키지 매니저가 아니고, 우리가 dependency 목록들을 작게 유지하므로, 사용자가 직접 관리해야합니다.

Homebrew 문서에서 더보기.

NixOS

Nix는 패키지 관리와 시스템 설정에 창의적으로 접근하는 툴입니다.

NixOS는, asdf가 제공하지 않는, 각 툴의 전체 dependency tree를 통해 패키지들의 정확한 버전들을 관리함으로써 재현가능한 환경 구축을 목표로 합니다. NixOS는 자신만의 프로그래밍 언어, 많은 CLI 툴들, 그리고 6000개가 넘는 패키지 컬렉션을 통해 해당 기능을 제공합니다.

다시 한번 말씀드리지만, asdf는 upstream dependencies들을 관리하지 않으며 패키지 매니저가 아닙니다.

NixOS 문서에서 더보기.

왜 asdf를 사용할까요?

asdf는 팀들이 플러그인 시스템을 통해 다양한 툴들의 지원 그리고 셸 설정에 포함시킬 하나의 스크립트의 단순함친숙성 을 통해 정확히 같은 버전의 툴들을 사용하는 것을 보장합니다.

노트

asdf는 시스템 패키지 매니저가 아닙니다. 이것은 툴 버전 매니저입니다. 단지 어떠한 툴을 위한 플러그인을 생성하고 그것의 버전을 asdf로 관리할 수 있다고 해서, 그 특정한 툴을 버전 관리를 위한 최선의 방법을 의미하는 것은 아닙니다.

+ + + + \ No newline at end of file diff --git a/ko-kr/index.html b/ko-kr/index.html new file mode 100644 index 00000000..c2c555e7 --- /dev/null +++ b/ko-kr/index.html @@ -0,0 +1,25 @@ + + + + + + asdf + + + + + + + + + + + + + + +
Skip to content

asdf

다중 런타임 버전 매니저

한가지 툴로 모든 런타임 버전들을 관리하세요!

+ + + + \ No newline at end of file diff --git a/ko-kr/manage/commands.html b/ko-kr/manage/commands.html new file mode 100644 index 00000000..b032db29 --- /dev/null +++ b/ko-kr/manage/commands.html @@ -0,0 +1,90 @@ + + + + + + 모든 명령어 | asdf + + + + + + + + + + + + + + +
Skip to content

모든 명령어

다음 목록은 asdf에서 이용가능한 모든 명령어들입니다. 해당 목록은 asdf help 명령어를 통해 확인가능합니다.

txt
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
+ + + + \ No newline at end of file diff --git a/ko-kr/manage/configuration.html b/ko-kr/manage/configuration.html new file mode 100644 index 00000000..29bd339a --- /dev/null +++ b/ko-kr/manage/configuration.html @@ -0,0 +1,33 @@ + + + + + + 설정 | asdf + + + + + + + + + + + + + + +
Skip to content

설정

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 혹은 ref:39cb398vb39 - 지정된 태그/커밋/브랜치 Github로부터 다운로드하고 컴파일됩니다.
  • path:~/src/elixir - 사용하려는 툴의 맞춤 컴파일 버전을 위한 경로. 언어 개발자들 등이 사용합니다.
  • system - 이 키워드는 asdf가 asdf에 의해 관리되지 않는 시스템 버전 툴의 버전을 사용하게합니다.

TIP

다양한 버전들은 공백으로 구분하여 설정될 수 있습니다. 예를 들어, 파이썬 3.7.2를 사용하고, 파이썬 2.7.15로 그리고 마지막으로 system 파이썬으로 폴백하려면, 다음을 .tool-versions에 추가해주세요.

python 3.7.2 2.7.15 system

.tool-version 파일에 정의된 모든 툴들을 설치하려면 .tool-version 파일이 포함된 디렉토리에서 다른 인수 없이 asdf install을 실행합니다.

.tool-versions 파일에 정의된 하나의 툴을 설치하려면 .tool-version 파일이 포함된 디렉토리에서 asdf install <name>를 실행합니다. 이 툴은 .tool-versions 파일에 정의된 버전으로 설치됩니다.

해당 파일은 직접 편집하거나 asdf local 명령어(또는 asdf global 명령어)를 사용하여 업데이트해 주세요.

.asdfrc

.asdfrc 파일은 사용자의 머신별 설정을 정의합니다.

${HOME}/.asdfrc는 asdf가 사용하는 기본 위치입니다. 이는 환경 변수 ASDF_CONFIG_FILE로 설정 가능합니다.

아래 파일은 필수적인 형식과 기본값들을 보여줍니다:

txt
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

지원되는 플러그인들은 다른 버전 매니저에서 사용되는 버전 파일들을 읽을 수 있습니다, 예를 들어, 루비의 rbenv에서 .ruby-version.

옵션설명
no 기본버전을 불러오는 데는 .tool-versions를 사용합니다
yes이용 가능한 레거시 버전 파일(.ruby-version 등)이 있는 경우 플러그인의 폴백으로 사용합니다

use_release_candidates

asdf update 명령어로 asdf를 최신 유의적 버전이 아닌 최신 버전 후보판으로 업그레이드 되도록 설정합니다.

옵션설명
no 기본유의적 버전 사용
yes릴리스 후보판 사용

always_keep_download

asdf install 명령어로 다운로드하는 소스 코드 또는 바이너리를 유지 또는 제거하도록 설정합니다

옵션설명
no 기본성공적인 설치 후 소스 코드 또는 바이너리 제거
yes설치 후 소스 코드 또는 바이너리 유지

plugin_repository_last_check_duration

asdf 플러그인 리포지토리 동기화 간격(분)을 설정합니다. 트리거 이벤트는 지난 동기화 시간을 확인하게 합니다. 마지막 동기화 이후 지정된 동기화 간격보다 더 많은 시간이 경과하면, 새로운 동기화가 발생합니다.

옵션설명
1에서 999999999 사이의 정수
60 기본
마지막 동기화 이후 지속 시간(분)이 초과된 경우 트리거 이벤트 동기화
0각 트리거 이벤트에서 동기화
never동기화 하지 않음

동기화 이벤트는 다음 명령어들을 실행할 때 발생합니다:

  • 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 플러그인 short-name 리포지토리의 동기화를 비활성화합니다. short-name 리포지토리가 비활성화 되어있으면 동기화 이벤트가 조기 종료됩니다.

옵션설명
no 기본동기화 이벤트에서 asdf 플러그인 리포지토리 clone 또는 업데이트
yesshort-name 플러그인 리포지토리 비활성화

동기화 이벤트는 다음 명령어들을 실행할 때 발생합니다:

  • asdf plugin add <name>
  • asdf plugin list all

asdf plugin add <name> <git-url>는 플러그인 동기화를 트리거하지 않습니다.

노트

플러그인 short-name repository를 비활성화해도 리포지토리가 이미 동기화된 경우 제거되지 않습니다. rm --recursive --trash $ASDF_DATA_DIR/repository로 플러그인 리포지토리를 제거합니다.

플러그인 short-name 리포지토리를 비활성화해도 그 리포지토리로부터 설치된 이전의 플러그인은 제거되지 않습니다. asdf plugin remove <name>을 사용하여 플러그인을 제거할 수 있습니다. 플러그인을 제거하면 해당 툴의 모든 설치된 버전이 제거됩니다.

concurrency

컴파일 중에 사용할 기본 코어 수입니다.

옵션설명
정수소스 코드를 컴파일할 때 사용할 코어 수
autonproc, sysctl hw.ncpu, /proc/cpuinfo 또는 1을 순차적으로 사용하여 코어 수를 계산합니다

노트: ASDF_CONCURRENCY 환경 변수가 존재하는 경우 우선 순위를 갖습니다.

플러그인 훅

다음에서 사용자 맞춤 코드를 실행이 가능합니다:

  • 플러그인 설치, shim 재생성, 업데이트, 또는 제거 전 또는 후
  • 플러그인 명령어 실행 전 또는 후

예를 들어 foo라는 플러그인이 설치되어 있고 bar라는 실행파일이 제공된 경우, 다음 훅들을 사용하여 사용자 맞춤 코드를 먼저 실행할 수 있습니다:

text
pre_foo_bar = echo Executing with args: $@

지원되는 패턴은 다음과 같습니다:

  • pre_<plugin_name>_<command>
  • pre_asdf_download_<plugin_name>
  • {pre,post}_asdf_{install,reshim,uninstall}_<plugin_name>
    • $1: 풀 버전
  • {pre,post}_asdf_plugin_{add,update,remove,reshim}
    • $1: 플러그인 이름
  • {pre,post}_asdf_plugin_{add,update,remove}_<plugin_name>

어떤 명령어 훅들이 어떤 명령어 이전 또는 이후에 실행되는 지에 대한 자세한 내용은 플러그인 생성하기를 참조하세요.

환경 변수

환경 변수 설정은 시스템과 셸에 따라 다릅니다. 기본 위치는 설치 위치와 방식(Git clone, 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-version 파일들을 무시하고 싶을 때 해당 값을 설정하세요.

  • 미설정 시: .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 값보다 우선 시 됩니다.

  • 미설정 시: asdf 설정 concurrency 값이 사용됩니다.
  • 사용법: export ASDF_CONCURRENCY=32

ASDF_FORCE_PREPEND

PATH의 맨 앞(최우선순위) 부분에 asdf shim과 경로 디렉토리를 추가할 것인지 여부.

  • 미설정 시: 맥 운영체제에서, yes가 기본값; 다른 시스템에서는 no가 기본값
  • yes: PATH의 앞 부분에 asdf 디렉토리 강제 추가
  • yes 이외의 다른 문자열: PATH의 앞 부분에 asdf 디렉토리 강제로 추가하지 않음
  • 사용법: ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"

전체 설정의 예시

다음을 이용한 간단한 asdf 설치는:

  • Bash 셸
  • $HOME/.asdf 설치 위치
  • Git을 통한 설치
  • 환경 변수 설정 없음
  • 맞춤 .asdfrc 파일 없음

다음의 결과가 나오게 됩니다:

항목값이 세팅되는 과정
config file location$HOME/.asdfrcASDF_CONFIG_FILE가 비었으므로, $HOME/.asdfrc을 사용
default tool versions filename.tool-versionsASDF_DEFAULT_TOOL_VERSIONS_FILENAME가 비었으므로, .tool-versions을 사용
asdf dir$HOME/.asdfASDF_DIR가 비었으므로, bin/asdf의 한 단계 상위 디렉토리 사용
asdf data dir$HOME/.asdfASDF_DATA_DIR가 비었으므로, $HOME/.asdf$HOME으로 사용.
concurrencyautoASDF_CONCURRENCY가 비었으므로, 기본 설정concurrency 값에 의존
legacy_version_fileno맞춤 .asdfrc 없음, 기본 설정 사용
use_release_candidatesno맞춤 .asdfrc 없음, 기본 설정 사용
always_keep_downloadno맞춤 .asdfrc 없음, 기본 설정 사용
plugin_repository_last_check_duration60맞춤 .asdfrc 없음, 기본 설정 사용
disable_plugin_short_name_repositoryno맞춤 .asdfrc 없음, 기본 설정 사용

내부 설정

이 섹션은 패키지 관리자 및 통합자에게 유용한 asdf 내부 설정을 설명하므로 일반 사용자들은 이 섹션에 대해 걱정할 필요가 없습니다.

  • $ASDF_DIR/asdf_updates_disabled: 이 파일이 있으면 asdf update 명령어를 통한 업데이트가 (내용과 무관하게) 비활성화됩니다. 이는 Pacman이나 Homebrew와 같은 패키지 매니저들이 특정 설치에 올바른 업데이트 방법이 사용되었는지 확인하는 데 사용됩니다.
+ + + + \ No newline at end of file diff --git a/ko-kr/manage/core.html b/ko-kr/manage/core.html new file mode 100644 index 00000000..9175314e --- /dev/null +++ b/ko-kr/manage/core.html @@ -0,0 +1,42 @@ + + + + + + 코어 | asdf + + + + + + + + + + + + + + +
Skip to content

코어

코어 asdf 명령어는 소수지만, 많은 워크플로우를 원활하게 만들어줍니다.

설치 & 설정

시작하기의 가이드에 설명되어 있습니다.

실행

shell
asdf exec <command> [args...]

현재 버전의 shim 명령어를 실행합니다.

환경 변수

shell
asdf env <command> [util]

정보

shell
asdf info

운영체제, 셸 및 asdf 디버깅 정보를 출력하는 헬퍼 명령어입니다. 버그 리포트 작성시 공유해주세요.

Shim 재생성

shell
asdf reshim <name> <version>

패키지의 현재 버전 shim을 재생성합니다. 기본적으로, shim들은 플러그인을 통해 툴 설치 중에 생성됩니다. npm CLI 등과 같은 툴들은 실행파일을 글로벌 설치할 수 있습니다, 예를 들어, npm install -g yarn을 통한 Yarn 설치. 이러한 실행파일은 플러그인의 라이프사이클을 통해 설치되지 않았기 때문에, 해당 플러그인을 위한 shim이 아직 존재하지 않습니다. 이때, nodejs<version>에 대해서, 예를 들면 yarn과 같은, 새로운 실행파일의 shim을 asdf reshim nodejs <version>을 통해 강제적으로 재작성 할 수 있습니다.

Shim 버전

shell
asdf shim-versions <command>

shim을 제공하는 플러그인 및 버전들을 나열합니다.

예를 들면, Node.js에는 nodenpm이라고 하는 2개의 실행파일이 제공되고 있습니다. asdf-nodejs을 통해 여러 버전의 툴이 설치되어 있는 경우, shim-versions는 아래와 같은 내용을 출력할 수 있습니다:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

업데이트

asdf는 (권장 설치 방법) Git에 의존하는 빌트인 업데이트 명령어가 있습니다. 다른 방법으로 설치한 경우, 그 방법을 위한 절차를 따라주세요:

방법최신 안정 릴리스master에 최신 커밋
asdf (via Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
Pacman새로운 PKGBUILD 다운로드 & 재빌드
혹은 선호하는 AUR 헬퍼 사용

제거

asdf 제거를 위해 다음 절차를 따르세요:

Bash & Git
  1. ~/.bashrc에서, asdf.sh 및 자동완성을 source하고 있는 행들을 삭제:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. ~/.bash_profile에서, asdf.sh 및 자동완성을 source하고 있는 행들을 삭제:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. ~/.bashrc에서, asdf.sh 및 자동완성을 source하고 있는 행들을 삭제:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

명령어 자동완성에 대해서는 Homebrew에 설명되어 있는 방법으로 설정 되어 있을 가능성이 있으므로, 그 가이드에 따라 삭제할 행을 찾아주세요.

  1. 패키지 관리자를 사용하여 제거:
shell
brew uninstall asdf --force
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

macOS Catalina 혹은 그 이상을 사용하신다면, 기본 셸이 ZSH로 변경되었습니다. 만약, ~/.bash_profile에서 설정을 찾을 수 없는 경우는, ~/.zshrc에 있을 가능성이 있는데 이 경우 ZSH의 설명을 봐 주세요.

  1. ~/.bash_profile에서, asdf.sh 및 자동완성을 source하고 있는 행들을 삭제:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

명령어 자동완성에 대해서는 Homebrew에 설명되어 있는 방법으로 설정 되어 있을 가능성이 있으므로, 그 가이드에 따라 삭제할 행을 찾아주세요.

  1. 패키지 관리자를 사용하여 제거:
shell
brew uninstall asdf --force
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. ~/.bashrc에서, asdf.sh 및 자동완성을 source하고 있는 행들을 삭제:
shell
. /opt/asdf-vm/asdf.sh
  1. 패키지 관리자를 사용하여 제거:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. ~/.config/fish/config.fish에서, asdf.fish를 source하고 있는 행들을 삭제:
shell
source ~/.asdf/asdf.fish

그리고 자동완성을 다음 명령어로 제거:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. ~/.config/fish/config.fish에서, asdf.fish를 source하고 있는 행들을 삭제:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. 패키지 관리자를 사용하여 제거:
shell
brew uninstall asdf --force
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. ~/.config/fish/config.fish에서, asdf.fish를 source하고 있는 행들을 삭제:
shell
source /opt/asdf-vm/asdf.fish
  1. 패키지 관리자를 사용하여 제거:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. ~/.config/elvish/rc.elv에서, asdf 모듈을 사용하는 행들을 삭제:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

그리고 asdf 모듈을 다음 명령어로 제거:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. $HOME/.asdf 디렉토리 제거:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. ~/.config/elvish/rc.elv에서, asdf 모듈을 사용하는 행들을 삭제:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

그리고 asdf 모듈을 다음 명령어로 제거:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 패키지 관리자를 사용하여 제거:
shell
brew uninstall asdf --force
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. ~/.config/elvish/rc.elv에서, asdf 모듈을 사용하는 행들을 삭제:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

그리고 asdf 모듈을 다음 명령어로 제거:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 패키지 관리자를 사용하여 제거:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdf 디렉토리 제거:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. ~/.zshrc에서, asdf.sh 및 자동완성을 source하고 있는 행들을 삭제:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

혹은 사용된 ZSH 프레임워크 플러그인 제거.

  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. ~/.zshrc에서, asdf.sh을 source하고 있는 행들을 삭제:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. 패키지 관리자를 사용하여 제거:
shell
brew uninstall asdf --force && brew autoremove
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. ~/.zshrc에서, asdf.sh을 source하고 있는 행들을 삭제:
shell
. /opt/asdf-vm/asdf.sh
  1. 패키지 관리자를 사용하여 제거:
shell
pacman -Rs asdf-vm
  1. $HOME/.asdf 디렉토리 제거:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 모든 asdf 설정 파일들 제거를 위해 아래 명령어 실행:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"

끝! 🎉

+ + + + \ No newline at end of file diff --git a/ko-kr/manage/plugins.html b/ko-kr/manage/plugins.html new file mode 100644 index 00000000..2c7881d2 --- /dev/null +++ b/ko-kr/manage/plugins.html @@ -0,0 +1,35 @@ + + + + + + 플러그인 | asdf + + + + + + + + + + + + + + +
Skip to content

플러그인

플로그인들은 asdf가 Node.js, Ruby, Elixir 등 여러가지 툴들을 취급하는 방법입니다.

더 많은 툴들 지원을 위한 플러그인 API는 플러그인 생성하기 참고하세요.

추가하기

Git URL로 플러그인 추가하기:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

또는 플러그인 리포지토리에 short-name을 통해 추가하기:

shell
asdf plugin add <name>
+# asdf plugin add erlang

추천

short-name 리포지토리에 독립적인 긴 git-url 방식이 선호됩니다.

설치된 목록

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

모든 Short-name 리포지토리 목록

shell
asdf plugin list all

플러그인들의 전체 short-name 목록을 플러그인 Shortname 인덱스에서 확인하세요.

업데이트

shell
asdf plugin update --all

특정 패키지를 업데이트하고 싶다면, 다음 명령어를 사용하세요.

shell
asdf plugin update <name>
+# asdf plugin update erlang

이 명령어는 해당 플러그인 리포지토리의 origin 기본 브랜치가장 최근 커밋 을 fetch합니다. 버전화된 플러그인들과 업데이트들은 현재 개발 진행중 입니다 (#916).

제거

bash
asdf plugin remove <name>
+# asdf plugin remove erlang

플러그인 제거는 해당 툴과 관련된 모든 것을 제거합니다. 이것은 한 툴의 미사용중인 많은 버전들의 cleaning/pruning에 유용합니다.

asdf Short-name 리포지토리 동기화

Short-name 리포지토리는 로컬 머신에 주기적으로 동기화됩니다. 동기화 방식들로 다음 방식들이 있습니다:

  • 명령어들에 의한 동기화 이벤트:
    • asdf plugin add <name>
    • asdf plugin list all
  • 만약 disable_plugin_short_name_repository 설정 옵션이 yes로 설정되어 있다면, 동기화는 조기 종료됩니다. asdf 설정 문서에서 더보기.
  • 만약 동기화가 지난 X분 동안 진행되지 않았다면, 동기화가 진행됩니다.
    • X의 기본값은 60입니다만, .asdfrcplugin_repository_last_check_duration 옵션을 통해 설정될 수 있습니다. asdf 설정 문서에서 더보기.
+ + + + \ No newline at end of file diff --git a/ko-kr/manage/versions.html b/ko-kr/manage/versions.html new file mode 100644 index 00000000..9cb533d4 --- /dev/null +++ b/ko-kr/manage/versions.html @@ -0,0 +1,54 @@ + + + + + + 버전 | asdf + + + + + + + + + + + + + + +
Skip to content

버전

버전 설치

shell
asdf install <name> <version>
+# asdf install erlang 17.3

플러그인이 소스에서 다운로드 & 컴파일을 지원하는 경우, ref:foo를 지정할 수 있으며 여기서 foo는 특정 브랜치, 태그 또는 커밋입니다. 제거할 때도 동일한 이름과 참조를 사용해야 합니다.

최신 안정 버전 설치

shell
asdf install <name> latest
+# asdf install erlang latest

주어진 문자열로 시작하는 최신 안정 버전을 설치합니다.

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

설치된 버전 목록

shell
asdf list <name>
+# asdf list erlang

주어진 문자열로 시작하는 버전으로 필터링합니다.

shell
asdf list <name> <version>
+# asdf list erlang 17

사용 가능한 모든 버전 목록

shell
asdf list all <name>
+# asdf list all erlang

주어진 문자열로 시작하는 버전으로 필터링합니다.

shell
asdf list all <name> <version>
+# asdf list all erlang 17

최신 안정 버전 보기

shell
asdf latest <name>
+# asdf latest erlang

주어진 문자열로 시작하는 최신 안정 버전을 보여줍니다.

shell
asdf latest <name> <version>
+# asdf latest erlang 17

현재 버전 설정

shell
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에 작성합니다.

현재 셸 세션에 대해서만, shellASDF_${TOOL}_VERSION이라는 이름의 환경 변수로 버전을 설정합니다.

local은 해당 버전을 $PWD/.tool-versions에 작성합니다, 존재하지 않을 시에 새로 만듦.

세부 내용은 .tool-versions 설정 섹션에 파일을 참고하세요.

대체수단

현재 셸 세션에 대해서만 버전을 설정하려는 경우 또는 특정 툴 버전 하에 단순히 한개의 명령어만 실행하기 위해, 당신은 ASDF_${TOOL}_VERSION과 같은 환경 변수를 설정할 수 있습니다.

다음 예시에서는 버전 1.4.0의 Elixir 프로젝트에서 테스트를 수행합니다. 버전 형식은 .tool-versions 파일에서 지원되는 것과 동일하게 지원됩니다.

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

시스템 버전으로의 폴백

asdf 관리 버전이 아닌 <name> 도구의 시스템 버전을 사용하려면 도구의 버전을 system으로 설정할 수 있습니다.

위에 현재 버전 설정 섹션에 나와있는대로, systemglobal, local or shell 중에 하나로 설정하세요.

shell
asdf local <name> system
+# asdf local python system

현재 버전 보기

shell
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

버전 제거

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

Shims

asdf는 패키지를 설치할 때 해당 패키지의 모든 실행 프로그램에 대한 shim들을 $ASDF_DATA_DIR/shims 디렉토리 (기본값은 ~/.asdf/shims)에 생성합니다. 이 디렉토리는 설치된 프로그램들이 이용가능하도록 $PATH (asdf.sh, asdf.fish 등)에 존재합니다.

Shim 자체는 플러그인 이름과 shim이 감싸고 있는 설치된 패키지의 실행파일의 경로를 넘겨주는 asdf exec라는 헬퍼 프로그램을 exec시키는 매우 단순한 wrapper입니다.

asdf exec 헬퍼는 (.tool-version 파일에 지정된 대로, asdf local... 또는 asdf global...에서 선택된 대로) 사용할 패키지의 버전을 결정합니다, (플러그인의 exec-path 콜백에 의해 조정될 수 있음) 패키지 설치 디렉토리의 실행 파일에 대한 최종 경로 및 (플러그인에 의해 제공된 - exec-env 스크립트) 실행할 환경을 결정하고, 최종적으로 이를 실행합니다.

노트

이 시스템은 exec 호출을 사용하기 때문에, 실행 대신 셸에 의해 source 되야하는 패키지의 스크립트는 shim wrapper를 통하지 않고 직접 액세스되야 합니다. 두 가지 asdf 명령어: whichwhere는 설치된 패키지로의 경로를 반환할 수 있습니다:

shell
# 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 shims 우회

어떠한 이유로 asdf의 shim들을 우회하고 싶거나 프로젝트의 디렉토리로 이동했을 때 자동으로 환경 변수를 설정되게 하고 싶으시면 asdf-direnv 플러그인이 도움이 될 것입니다. 상세한 내용은 README를 확인해 주세요.

+ + + + \ No newline at end of file diff --git a/ko-kr/more/community-projects.html b/ko-kr/more/community-projects.html new file mode 100644 index 00000000..076f1eaf --- /dev/null +++ b/ko-kr/more/community-projects.html @@ -0,0 +1,25 @@ + + + + + + 커뮤니티 프로젝트 | asdf + + + + + + + + + + + + + + +
Skip to content

커뮤니티 프로젝트

asdf와 관련된 커뮤니티 프로젝트들입니다:

노트

asdf 코어 팀은 이 프로젝트들 혹은 코드를 소유하지 않습니다. asdf 코어는 위의 목록들에 품질과 보안을 책임지지 않습니다.

+ + + + \ No newline at end of file diff --git a/ko-kr/more/faq.html b/ko-kr/more/faq.html new file mode 100644 index 00000000..c83a7d15 --- /dev/null +++ b/ko-kr/more/faq.html @@ -0,0 +1,25 @@ + + + + + + 자주 묻는 질문 | asdf + + + + + + + + + + + + + + +
Skip to content

자주 묻는 질문

asdf에 관련된 공통된 질문들입니다.

WSL1을 지원하나요?

WSL1 (Windows Subsystem for Linux 1)는 공식적으로 지원되지 않습니다. 어떤 부분의 asdf의 제대로 동작하지 않을 수 있습니다. 우리는 WSL1의 공식 지원을 추가할 계획이 없습니다.

WSL2을 지원하나요?

WSL2 (Windows Subsystem for Linux 2)는 당신이 선택한 WSL distro를 위한 설치 & dependency 설명서를 따르면 작동합니다.

중요한 것은, WSL2는 오직 현재 작업 디렉토리가 Unix 드라이브 그리고 Windows 드라이브에 종속되어 있지 않을때 정상적으로 동작합니다.

우리는 호스트 runner support가 GitHub Actions에서 사용가능할 때 WSL2에서 테스트 suite를 진행할 계획입니다만, 현재는 아직 이용가능하지 않은 것 같습니다.

새롭게 설치된 실행파일이 동작하지 않나요?

방금 npm install -g yarn, 그러나 yarn을 실행시킬 수 없습니다. 어떻게 해야하나요?

asdfshims를 사용하여 실행파일들을 관리합니다. 플러그인에 의해서 설치되는 실행파일들은 자동적으로 shim이 생성되지만, asdf가 관리하고 있는 툴에 의해서 실행파일이 설치 된 경우는 shim을 생성해야 한다고 하는 것을 asdf에 알려줄 필요가 있습니다. 이러한 경우, Yarn의 shim을 생성하기 위해 asdf reshim 명령어 문서를 참고하세요.

셸이 새롭게 설치된 shims들을 감지하지 못하나요?

만약 asdf reshim가 문제를 해결하지 못한다면, 대부분의 경우 asdf.sh 혹은 asdf.fish sourcing이 당신의 셸 설정 파일 (.bash_profile, .zshrc, config.fish etc) 아래쪽에 있지 않을 가능성이 높습니다. 당신의 $PATH가 설정 된 후에 그리고 사용중인 프레임워크 (oh-my-zsh etc)가 source 된 후에 source 되어야 합니다.

+ + + + \ No newline at end of file diff --git a/ko-kr/more/thanks.html b/ko-kr/more/thanks.html new file mode 100644 index 00000000..54af0d04 --- /dev/null +++ b/ko-kr/more/thanks.html @@ -0,0 +1,25 @@ + + + + + + 감사인사 | asdf + + + + + + + + + + + + + + +
Skip to content

감사인사

asdf 저자들 & 기여자들을 위한 감사 페이지!

Credits

나 (@HashNuke), 고열, 감기, 기침.

2014년부터 종료까지의 저작권 (MIT License)

관리자

기여자

GitHub에서 기여자들의 목록를 확인하세요 🙏

+ + + + \ No newline at end of file diff --git a/ko-kr/plugins/create.html b/ko-kr/plugins/create.html new file mode 100644 index 00000000..13804876 --- /dev/null +++ b/ko-kr/plugins/create.html @@ -0,0 +1,83 @@ + + + + + + 플러그인 생성하기 | asdf + + + + + + + + + + + + + + +
Skip to content

플러그인 생성하기

플러그인은 언어 / 툴의 버전 관리를 지원하는 실행 가능한 스크립트들이 있는 Git 리포지토리입니다. 이 스크립트들은 asdf에 의해 특정 명령어들을 받아 asdf list-all <name>, asdf install <name> <version> 등의 지원을 위해 실행됩니다.

빠른 시작

자체 플러그인을 만드는 것을 시작하는 두 가지 옵션이 있습니다:

  1. asdf-vm/asdf-plugin-template 리포지토리 사용해서 기본 스크립트가 구현된 (asdf-<tool_name> 이름으로) 플러그인 리포지토리 생성하기. 리포지토리가 생성되면, 그 리포지토리를 clone하고 템플릿을 유기적으로 업데이트하여 setup.bash 스크립트를 실행합니다.
  2. asdf-<tool_name>로 이룸 붙인 리포지토리를 시작하고 아래 문서에 필수 스크립트들을 구현하세요.

플리그인 스크립트들을 위한 황금률

  • 스크립트는 다른 asdf 명령어를 호출하면 안됩니다.
  • 셸 툴/명령어의 dependency를 최소로 유지하세요.
  • non-portable 툴이나 명령어 플래그의 사용을 피하세요. 예를 들어, sort -V. asdf core를 참고하세요 금지된 명령어 목록

스크립트 개요

asdf에서 호출 가능한 스크립트의 전체 목록입니다.

스크립트설명
bin/list-all 필수모든 설치 가능한 버전들을 나열
bin/download 필수지정한 버전에 대한 소스 코드 또는 바이너리 다운로드
bin/install 필수지정된 버전을 설치
bin/latest-stable 추천지정된 도구의 최신 안정 버전 나열
bin/help.overview플러그인 및 도구에 대한 일반적인 설명을 출력
bin/help.deps운영 체제별 dependencies 목록 출력
bin/help.config플러그인 및 툴 설정 정보 출력
bin/help.links플러그인 및 툴에 대한 링크 목록 출력
bin/list-bin-pathsshim들을 생성하기 위해 바이너리 파일이 있는 디렉토리에 대한 상대 경로 나열
bin/exec-env바이너리 실행을 위한 환경 준비
bin/exec-path툴 버전의 실행파일 경로 출력
bin/uninstall툴의 특정 버전 제거
bin/list-legacy-filenames레거시 버전 파일의 이름 출력: .ruby-version
bin/parse-legacy-file레거시 버전 파일들을 위한 맞춤 parser
bin/post-plugin-add플러그인이 추가된 후 실행될 훅
bin/post-plugin-update플러그인이 업데이트 된 후 실행될 훅
bin/pre-plugin-remove플러그인이 제거되기 전 실행될 훅

어떤 명령어가 어떤 스크립트를 호출하는지 확인하려면, 각 스크립트에 대한 자세한 문서를 참조하세요.

환경 변수 개요

모든 스크립트에서 사용되는 환경 변수의 전체 목록입니다.

환경 변수설명
ASDF_INSTALL_TYPEversion 또는 ref
ASDF_INSTALL_VERSIONASDF_INSTALL_TYPE에 따른 풀 버전 번호 또는 Git Ref
ASDF_INSTALL_PATH툴이 설치 되어야하는 혹은 되어있는 경로
ASDF_CONCURRENCY소스 코드를 컴파일할 때 사용할 코어 수. make-j를 설정할 때 유용
ASDF_DOWNLOAD_PATHbin/download에 의해 소스 코드 또는 바이너리가 다운로드 된 경로
ASDF_PLUGIN_PATH플러그인이 설치된 경로
ASDF_PLUGIN_SOURCE_URL플러그인의 소스 URL
ASDF_PLUGIN_PREV_REF플러그인 리포지토리의 이전 git-ref
ASDF_PLUGIN_POST_REF플러그인 리포지토리의 업데이트 된 git-ref
ASDF_CMD_FILEsource 되는 파일의 전체 경로를 해결

노트

모든 스크립트에서 모든 환경 변수를 사용할 수 있는 것은 아닙니다. 아래 각 스크립트에 대한 문서를 확인하여 사용할 수 있는 환경 변수들을 확인하세요.

필수적 스크립트

bin/list-all 필수

설명

설치 가능한 모든 버전 나열.

출력 형식

공백으로 구분된 문자열을 반드시 출력. 예를 들어:

txt
1.0.1 1.0.2 1.3.0 1.4

최신 버전이 마지막에 와야 합니다.

asdf core는 각 버전을 각각의 행에 출력하여, 일부 버전을 화면 밖으로 밀어낼 가능성이 있습니다.

정렬

웹사이트의 릴리스 페이지에서 버전을 가져오는 경우에는 이미 올바른 순서로 되어 있는 경우가 많기 때문에 제공된 순서대로 두는 것이 좋습니다. 역순으로 되어 있는 경우 tac을 통해 해당 버전들을 바로 잡는것으로 충분합니다.

정렬이 불가피한 경우, sort -V는 사용이 불가능하므로, 다음 중 하나를 제안합니다:

스크립트에서 사용 가능한 환경 변수

이 스크립트에는 환경 변수가 제공되지 않습니다.

이 스크립트를 호출하는 명령어

  • asdf list all <name> [version]
  • asdf list all nodejs: 이 스크립트에 의해 반환된 모든 버전을 나열합니다, 한 행에 한개씩.
  • asdf list all nodejs 18: 이 스크립트에 의해 반환된 모든 버전을 나열하며, 각 행에 하나씩, 18로 시작하는 모든 버전에 필터가 적용됩니다.

asdf core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}/bin/list-all"

bin/download 필수

설명

지정된 장소에 지정된 버전에 대한 소스 코드 또는 바이너리 다운로드

구현 세부사항

  • 스크립트는 소스 또는 바이너리를 ASDF_DOWNLOAD_PATH에서 지정된 디렉토리에 다운로드해야합니다.
  • 압축 해제된 소스 코드 또는 바이너리만 ASDF_DOWNLOAD_PATH 디렉토리에 위치해야합니다.
  • 실패 시에는 ASDF_DOLOAD_PATH에 어떠한 파일도 남아서는 안 됩니다.
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.

레거시 플러그인

비록 이 스크립트는 모든 플러그인에서 _필수_로 되어 있지만, 이 스크립트가 도입되기 이전의 "레거시" 플러그인에서는 선택 입니다.

이 스크립트가 없는 경우, asdf는 bin/install 스크립트가 있다고 가정하고 해당 버전을 다운로드 그리고 설치합니다.

레거시 플러그인 지원은 최종적으로 제거될 예정이기 때문에 앞으로 작성할 모든 플러그인에서 이 스크립트를 포함해야합니다.

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • 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_DOWLOAD_PATH 디렉토리에 저장. 그 다음 bin/install 스크립트를 실행.

asdf core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}"/bin/download

bin/install 필수

설명

특정 버전의 도구를 지정된 위치에 설치.

구현 세부사항

  • 스크립트는 ASDF_INSTALL_PATH 경로에 지정된 버전을 설치해야합니다.
  • Shim은 $ASDF_INSTALL_PATH/bin에 있는 어떠한 파일에 대해서든 기본적으로 생성됩니다. 이 동작은 선택적 bin/list-bin-paths 스크립트로 맞춤 설정 가능합니다.
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.
  • TOCTOU(Time-of-Check-to-Off-Use) 문제를 방지하려면, 툴의 빌드 및 설치가 성공적이라고 판단될때만 스크립트에서 파일을 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 (태그/커밋/브랜치).
  • 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: Node.js 버전 18.0.0ASDF_INSTALL_PATH 디렉토리에 설치.

asdf core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}"/bin/install

선택적 스크립트

bin/latest-stable 추천

설명

도구의 최신 안정 버전을 결정합니다. 이 스크립트가 존재하지 않는 경우, asdf 코어는 bin/list-all의 출력을 비의도적으로 tail합니다.

구현 세부사항

  • 스크립트는 도구의 최신 안정 버전을 표준 출력에 출력해야합니다.
  • 비안정판이나 릴리스 후보판은 제외되어야 합니다.
  • 필터 쿼리는 스크립트의 첫 번째 인수로 제공됩니다 이 쿼리는 버전 번호나 툴 제공자에 의한 출력값을 필터하기 위해 사용되어야 합니다.
    • 예를 들어 ruby 플러그인에서의 asdf list all rubyjruby, rbx, truffleruby 등의 많은 제공자들의 Ruby 버전 목록을 출력합니다. 사용자가 제공한 필터는 플러그인이 유의적 버전 및/또는 공급자를 필터링하는 데 사용될 수 있습니다.
      > asdf latest ruby
      +3.2.2
      +> asdf latest ruby 2
      +2.7.8
      +> asdf latest ruby truffleruby
      +truffleruby+graalvm-22.3.1
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf global <tool> latest: 툴의 글로벌 버전을 해당 툴의 최신 안정 버전으로 설정합니다.
  • asdf local <name> latest: 툴의 로컬 버전을 해당 툴의 최신 안정 버전으로 설정합니다.
  • asdf install <tool> latest: 최신 버전의 툴을 설치합니다.
  • asdf latest <tool> [<version>]: 선택적인 필터를 기반으로 도구의 최신 버전을 출력합니다.
  • asdf latest --all: asdf에서 관리하는 모든 툴의 최신 버전과 설치 여부를 출력합니다.

asdf core에서 호출 시그니처

이 스크립트는 필터 쿼리라는 하나의 인수를 받습니다.

bash
"${plugin_path}"/bin/latest-stable "$query"

bin/help.overview

설명

플러그인 및 관리 중인 툴에 대한 일반적인 설명을 출력.

구현 세부사항

  • 플러그인에 대한 도움말 출력을 표시하려면 이 스크립트가 필요합니다.
  • asdf 코어가 머리말를 인쇄하므로 머리말을 출력해서는 안 됩니다.
  • 자유로운 형식의 텍스트로 출력해도 상관없지만 짧은 한 단락 정도의 설명이 이상적입니다.
  • 핵심이 되는 asdf-vm 문서에서 이미 설명되어 있는 정보는 출력하지 않아야 합니다.
  • 운영 체제와 설치된 툴의 버전에 맞게 출력해야합니다 (필요에 따라 ASDF_INSTALL_VERSIONASDF_INSTALL_TYPE 환경 변수의 값을 사용하십시오).
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf help <name> [<version>]: 플러그인 및 도구 문서를 출력

asdf core에서 호출 시그니처

bash
"${plugin_path}"/bin/help.overview

bin/help.deps

설명

운영 체제에 맞는 dependencies 목록을 출합니다. 한 행마다 한 개의 dependency.

bash
git
+curl
+sed

구현 세부사항

  • 이 스크립트의 출력되기 위해서는 bin/help.overview가 필요합니다.
  • 운영 체제와 설치된 툴의 버전에 맞게 출력해야합니다 (필요에 따라 ASDF_INSTALL_VERSIONASDF_INSTALL_TYPE 환경 변수의 값을 사용하십시오).
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf help <name> [<version>]: 플러그인 및 도구 문서를 출력

asdf core에서 호출 시그니처

bash
"${plugin_path}"/bin/help.deps

bin/help.config

설명

플러그인 및 도구에 필수적 또는 선택적 설정 출력. 예를 들어, 도구를 설치하거나 컴파일하는 데 필요한 환경 변수나 기타 플래그를 설명.

구현 세부사항

  • 이 스크립트의 출력되기 위해서는 bin/help.overview가 필요합니다.
  • 자유로운 형식의 텍스트로 출력할 수 있습니다.
  • 운영 체제와 설치된 툴의 버전에 맞게 출력해야합니다 (필요에 따라 ASDF_INSTALL_VERSIONASDF_INSTALL_TYPE 환경 변수의 값을 사용하십시오).
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf help <name> [<version>]: 플러그인 및 도구 문서를 출력

asdf core에서 호출 시그니처

bash
"${plugin_path}"/bin/help.config

설명

플러그인 및 툴과 관련된 링크 목록을 출력. 한 행마다 한 개의 링크.

bash
Git Repository:	https://github.com/vlang/v
+Documentation:	https://vlang.io

구현 세부사항

  • 이 스크립트의 출력되기 위해서는 bin/help.overview가 필요합니다.
  • 한행마다 한 개의 링크.
  • 형식은 다음 중에 하나여야합니다:
    • <title>: <link>
    • 또는 그냥 <link>
  • 운영 체제와 설치된 툴의 버전에 맞게 출력해야합니다 (필요에 따라 ASDF_INSTALL_VERSIONASDF_INSTALL_TYPE 환경 변수의 값을 사용하십시오).
  • 성공 시에는 0이 종료 코드입니다.
  • 실패 시에는 0이 아닌 상태의 종료 코드입니다.

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf help <name> [<version>]: 플러그인 및 도구 문서를 출력

asdf core에서 호출 시그니처

bash
"${plugin_path}"/bin/help.links

bin/list-bin-paths

설명

툴의 특정 버전에서 실행파일이 포함된 디렉토리 목록을 출력.

구현 세부사항

  • 이 스크립트가 존재하지 않는 경우, asdf는 "${ASDF_INSTALL_PATH}"/bin 디렉토리 내에 있는 바이너리들을 찾아 그 바이너리를 위한 shim들을 생성합니다.
  • 실행파일이 포함된 디렉토리의 경로를 공백으로 구분하여 출력합니다.
  • 경로는 ASDF_INSTALL_PATH로의 상대 경로이어야 합니다. 출력 예시는 다음과 같습니다:
bash
bin tools veggies

이는 asdf가 그 파일들을 위한 shim들을 다음 위치에 생성하게 지시합니다:

  • "${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 (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf install <tool> [version]: 초기에 바이너리들을 위한 shim들 생성.
  • asdf reshim <tool> <version>: 바이너리들을 위한 shim들 재생성.

asdf core에서 호출 시그니처

bash
"${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 (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf which <command>: 실행파일의 경로 표시
  • asdf exec <command> [args...]: 현재 버전에서 shim 명령을 실행
  • asdf env <command> [util]: shim 명령어 실행 시 사용되는 환경에서 유틸리티(기본값: env)를 실행.

asdf core에서 호출 시그니처

bash
"${plugin_path}/bin/exec-env"

bin/exec-path

툴의 특정 버전의 실행파일 경로를 가져옵니다. 실행파일에 대한 상대 경로를 문자열로 출력해야합니다. 이는 플러그인이 shim에서 지정한 실행파일 경로를 조건부로 덮어쓰게 하거나, 그렇지 않으면 shim에서 지정한 기본 경로를 반환합니다.

설명

툴의 특정 버전의 실행파일 경로를 가져옵니다.

구현 세부사항

  • 실행파일에 대한 상대 경로를 문자열로 출력.
  • Shim에서 지정한 실행파일 경로를 조건부로 덮어쓰거나, 그렇지 않으면 shim에서 지정한 기본 경로를 반환.
shell
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

스크립트에서 사용 가능한 환경 변수

  • ASDF_INSTALL_TYPE: version 또는 ref
  • ASDF_INSTALL_VERSION:
    • ASDF_INSTALL_TYPE=version의 경우, 풀 버전 번호.
    • ASDF_INSTALL_TYPE=ref의 경우, Git ref (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

  • asdf which <command>: 실행파일의 경로 표시
  • asdf exec <command> [args...]: 현재 버전에서 shim 명령을 실행
  • asdf env <command> [util]: shim 명령어 실행 시 사용되는 환경에서 유틸리티(기본값: env)를 실행.

asdf core에서 호출 시그니처

bash
"${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 core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}/bin/uninstall"

bin/list-legacy-filenames

설명

툴 버전을 결정하는 데 사용된 레거시 설정 파일 목록을 출력.

구현 세부사항

  • 파일이름들의 목록을 공백으로 구분하여 출력.
    bash
    .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 (태그/커밋/브랜치).
  • ASDF_INSTALL_PATH: 툴이 설치 되어있는, 또는 되어야하는 경로.

이 스크립트를 호출하는 명령어

툴 버전을 가져오는 모든 명령에서 호출됩니다.

asdf core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}/bin/list-legacy-filenames"

bin/parse-legacy-file

설명

asdf에 의해 발견된 레거시 파일을 parse하여 툴의 버전을 결정. 자바스크립트의 package.json이나 Go 언어의 go.mod와 같은 파일에서 버전 번호를 추출하는 데 유용.

구현 세부사항

  • 이 스크립트가 존재하지 않는 경우, asdf는 단순히 레거시 파일을 cat하여 버전을 결정합니다.
  • 다음과 같은 상황에서도 결정론적이고 항상 동일하고 정확한 버전을 반환해야합니다:
    • 동일한 레거시 파일을 구문 parsing할 때.
    • 무엇이 설치되어 있는지 또는 레거시 버전이 유효하거나 완전한지는 관계 없이. 일부 레거시 파일 형식은 맞지 않을 수도 있습니다.
  • 아래와 같이 버전 번호를 한 줄로 출력해 주세요:
    bash
    1.2.3

스크립트에서 사용 가능한 환경 변수

이 스크립트가 호출되기 전에 환경 변수가 설정되지 않습니다.

이 스크립트를 호출하는 명령어

툴 버전을 가져오는 모든 명령에서 호출됩니다.

asdf core에서 호출 시그니처

이 스크립트는 레거시 파일의 내용을 읽기 위해 레거시 파일의 경로라는 하나의 인수를 받습니다.

bash
"${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 core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}/bin/post-plugin-add"

bin/post-plugin-update

설명

이 콜백 스크립트는 asdf가 asdf plugin update <tool> [<git-ref>] 커맨드로 플러그인 업데이트 를 다운로드한 후에 실행됩니다.

관련된 명령어 훅들을 참조하세요:

  • pre_asdf_plugin_update
  • pre_asdf_plugin_update_${plugin_name}
  • post_asdf_plugin_update
  • post_asdf_plugin_update_${plugin_name}

스크립트에서 사용 가능한 환경 변수

  • ASDF_PLUGIN_PATH: 플러그인이 설치된 경로.
  • ASDF_PLUGIN_PREV_REF: 플러그인의 이전 git-ref
  • ASDF_PLUGIN_POST_REF: 플러그인의 업데이트 된 git-ref

asdf core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${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 core에서 호출 시그니처

제공되는 매개변수는 없습니다.

bash
"${plugin_path}/bin/pre-plugin-remove"

asdf CLI 확장 명령어 고급

lib/commands/command*.bash 스크립트 또는 플러그인 이름을 하위명령어로 사용하여 asdf 명령줄 인터페이스를 통해 호출할 수 있는 실행파일을 제공함으로써 새로운 asdf 명령어를 정의할 수 있습니다.

예를 들면, foo라고 하는 플러그인이 있다고 하면:

shell
foo/
+  lib/commands/
+    command.bash
+    command-bat.bash
+    command-bat-man.bash
+    command-help.bash

사용자는 아래 명령을 실행할 수 있게 됩니다:

shell
$ 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`

플러그인 개발자는 이 기능을 사용하여 툴과 관련된 유틸리티를 제공하거나, asdf 자체의 명령어 확장 플러그인을 생성할 수 있습니다.

실행 가능 비트(executable bit)가 부여되어 있는 경우, asdf 실행을 대신하여 해당 스크립트가 실행됩니다.

실행 가능 비트(executable bit)가 부여되지 않은 경우, asdf는 해당 스크립트를 Bash 스크립트로 source합니다.

$ASDF_CMD_FILE는 source 되는 파일의 전체 경로를 해결합니다.

haxe는 이 기능을 사용하는 플러그인의 좋은 예시입니다. 이 플러그인은 Haxe 실행파일이 해당 디렉토리에서 상대적으로 동적 라이브러리를 찾으려하는 문제해결을 위해 asdf haxe neko-dylibs-link를 제공합니다.

플러그인 README에는 asdf 확장 명령어에 관한 것을 반드시 기재하도록 하십시오.

맞춤 Shim 템플릿 고급

경고

반드시 필요한 경우에만 사용하세요.

asdf에서는 맞춤 shim 템플릿을 사용할 수 있습니다. foo라고 하는 실행파일에 대해, 플러그인 내에 shims/foo 파일이 존재하면, asdf는 표준 shim 템플릿을 사용하는 대신 그 파일을 복사합니다.

이 기능은 현명하게 사용해야합니다.

asdf 코어팀이 파악하고 있는 것은, 이 기능은 오직 공식 플러그인 Elixir 플러그인에서만 사용되고 있습니다. 이는 실행파일은 실행파일일 뿐만 아니라 Elixir 파일로도 읽히기 때문입니다. 이 때문에 표준 Bash shim을 사용할 수 없습니다.

테스팅

asdf에는 플러그인을 테스트하기 위한 plugin-test 명령어가 포함되어 있습니다:

shell
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 플러그인을 테스트하기 위해, 다음을 실행시킬 수 있습니다
    shell
    # asdf plugin test <plugin_name>  <plugin_url>                               [test_command]
    +  asdf plugin test nodejs         https://github.com/asdf-vm/asdf-nodejs.git node --version

노트

리눅스와 맥 운영체제 양쪽 CI 환경에서 모두 테스트하는 것을 권장합니다.

GitHub Action

asdf-vm/actions 리포지토리는 GitHub에서 호스팅되는 플러그인을 테스트하기 위한 GitHub Action을 제공합니다. .github/workflows/test.yaml 액션 워크플로우 예시:

yaml
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"

TravisCI 설정

.travis.yml 예시 파일, 필요에 따라 바꿔 사용하세요:

yaml
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를 사용하는 경우, 플러그인 위치에 대한 상대 경로를 전달할 필요가 있는 경우가 있습니다:

shell
asdf plugin test <tool_name> <path> '<tool_command> --version'

API 속도 제한

bin/list-all이나 bin/latest-stable과 같이 명령어가 외부 API에 대한 접근에 의존하고 있는 경우, 자동화 테스트 중에 속도 제한이 발생할 수 있습니다. 이를 줄이기 위해, 환경 변수를 통해 인증 토큰을 제공하는 코드 경로가 있는지 확인하십시오. 예를 들어:

shell
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 pipeline 환경 변수에 추가하십시오.

경고

절대 인증 토큰을 코드 리포지토리에 공개해서는 안됩니다.

플러그인 Shortname 인덱스

TIP

권장되는 플러그인 설치 방법은 URL을 바탕으로 직접 설치입니다:

shell
# asdf plugin add <name> <git_url>
+  asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

git_url이 지정되지 않은 경우, asdf는 사용될 git_url을 정확히 결정하기 위해 Shortname 인덱스 리포지토리를 사용합니다.

Shortname 인덱스에 설명서에 따라 플러그인을 해당 리포지토리에 추가할 수 있습니다.

+ + + + \ No newline at end of file diff --git a/manage/commands.html b/manage/commands.html new file mode 100644 index 00000000..8e91d2a2 --- /dev/null +++ b/manage/commands.html @@ -0,0 +1,90 @@ + + + + + + All Commands | asdf + + + + + + + + + + + + + + +
Skip to content

All Commands

The list of all commands available in asdf. This list is the asdf help command text.

txt
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
+ + + + \ No newline at end of file diff --git a/manage/configuration.html b/manage/configuration.html new file mode 100644 index 00000000..988ee677 --- /dev/null +++ b/manage/configuration.html @@ -0,0 +1,33 @@ + + + + + + Configuration | asdf + + + + + + + + + + + + + + +
Skip to content

Configuration

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 compile
  • path:~/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:

txt
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.

OptionsDescription
no defaultUse .tool-versions to read versions
yesUse plugin fallback to legacy version files (.ruby-version) if available

use_release_candidates

Configure the asdf update command to upgrade to the latest Release Candidate instead of the latest Semantic Version.

OptionsDescription
no defaultSemantic Version is used
yesRelease Candidate is used

always_keep_download

Configure the asdf install command to keep or delete the source code or binary it downloads.

OptionsDescription
no defaultDelete source code or binary after successful install
yesKeep source code or binary after install

plugin_repository_last_check_duration

Configure the duration (in minutes) between asdf plugin repository syncs. Trigger events result in a check of the duration. If more time has elapsed since the last sync than specified in the duration, a new sync occurs.

OptionsDescription
integer in range 1 to 999999999
60 is default
Sync on trigger event if duration (in minutes) since last sync has been exceeded
0Sync on each trigger event
neverNever sync

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.

OptionsDescription
no defaultClone or update the asdf plugin repository on sync events
yesDisable the plugin short-name repository

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.

OptionsDescription
integerNumber of cores to use when compiling the source code
autoCalculate 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.

Plugin Hooks

It is possible to execute custom code:

  • Before or after a plugin is installed, reshimed, updated, or uninstalled
  • Before or after a plugin command is executed

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:

text
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.

Environment Variables

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.

  • If Unset: $HOME/.asdfrc will be used.
  • Usage: 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.

  • If Unset: .tool-versions will be used.
  • Usage: 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.

  • If Unset: the parent directory of the bin/asdf executable is used.
  • Usage: 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.

  • If Unset: $HOME/.asdf if it exists, or else the value of ASDF_DIR
  • Usage: 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.

  • If Unset: the asdf config concurrency value is used.
  • Usage: 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.

  • If Unset: On macOS, defaults to yes; but on other systems, defaults to no
  • If yes: Force asdf directories to the front of the PATH
  • If set to any string other than yes: Do not force asdf directories to the front of the PATH
  • Usage: ASDF_FORCE_PREPEND=no . "<path-to-asdf-directory>/asdf.sh"

Full Configuration Example

Following a simple asdf setup with:

  • a Bash Shell
  • an installation location of $HOME/.asdf
  • installed via Git
  • NO environment variables set
  • NO custom .asdfrc file

would result in the following outcomes:

ConfigurationValueCalculated by
config file location$HOME/.asdfrcASDF_CONFIG_FILE is empty, so use $HOME/.asdfrc
default tool versions filename.tool-versionsASDF_DEFAULT_TOOL_VERSIONS_FILENAME is empty, so use .tool-versions
asdf dir$HOME/.asdfASDF_DIR is empty, so use parent dir of bin/asdf
asdf data dir$HOME/.asdfASDF_DATA_DIR is empty so use $HOME/.asdf as $HOME exists.
concurrencyautoASDF_CONCURRENCY is empty, so rely on concurrency value from the default configuration
legacy_version_filenoNo custom .asdfrc, so use the default configuration
use_release_candidatesnoNo custom .asdfrc, so use the default configuration
always_keep_downloadnoNo custom .asdfrc, so use the default configuration
plugin_repository_last_check_duration60No custom .asdfrc, so use the default configuration
disable_plugin_short_name_repositorynoNo custom .asdfrc, so use the default configuration

Internal 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.
+ + + + \ No newline at end of file diff --git a/manage/core.html b/manage/core.html new file mode 100644 index 00000000..f0df5544 --- /dev/null +++ b/manage/core.html @@ -0,0 +1,42 @@ + + + + + + Core | asdf + + + + + + + + + + + + + + +
Skip to content

Core

The core asdf command list is rather small, but can facilitate many workflows.

Installation & Setup

Covered in the Getting Started guide.

Exec

shell
asdf exec <command> [args...]

Executes the command shim for the current version.

Env

shell
asdf env <command> [util]

Info

shell
asdf info

A helper command to print the OS, Shell and asdf debug information. Share this when making a bug report.

Reshim

shell
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 .

Shim-versions

shell
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:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

Update

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:

MethodLatest Stable ReleaseLatest commit on master
asdf (via Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
PacmanDownload a new PKGBUILD & rebuild
or use your preferred AUR helper

Uninstall

To uninstall asdf follow these steps:

Bash & Git
  1. In your ~/.bashrc remove the lines that source asdf.sh and the completions:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. In your ~/.bash_profile remove the lines that source asdf.sh and the completions:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. In your ~/.bashrc remove the lines that source asdf.sh and the completions:
shell
. $(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.

  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

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.

  1. In your ~/.bash_profile remove the lines that source asdf.sh and the completions:
shell
. $(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.

  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. In your ~/.bashrc remove the lines that source asdf.sh and the completions:
shell
. /opt/asdf-vm/asdf.sh
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. In your ~/.config/fish/config.fish remove the lines that source asdf.fish:
shell
source ~/.asdf/asdf.fish

and remove completions with this command:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. Remove the $HOME/.asdf dir:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. In your ~/.config/fish/config.fish remove the lines that source asdf.fish:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. In your ~/.config/fish/config.fish remove the lines that source asdf.fish:
shell
source /opt/asdf-vm/asdf.fish
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. In your ~/.config/elvish/rc.elv remove the lines that use the asdf module:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

and uninstall the asdf module with this command:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Remove the $HOME/.asdf dir:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. In your ~/.config/elvish/rc.elv remove the lines that use the asdf module:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

and uninstall the asdf module with this command:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Uninstall with your package manager:
shell
brew uninstall asdf --force
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. In your ~/.config/elvish/rc.elv remove the lines that use the asdf module:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

and uninstall the asdf module with this command:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. In your ~/.zshrc remove the lines that source asdf.sh and completions:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

OR the ZSH Framework plugin if used.

  1. Remove the $HOME/.asdf dir:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. In your ~/.zshrc remove the lines that source asdf.sh:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. Uninstall with your package manager:
shell
brew uninstall asdf --force && brew autoremove
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. In your ~/.zshrc remove the lines that source asdf.sh:
shell
. /opt/asdf-vm/asdf.sh
  1. Uninstall with your package manager:
shell
pacman -Rs asdf-vm
  1. Remove the $HOME/.asdf dir:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Run this command to remove all asdf config files:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"

That's it! 🎉

+ + + + \ No newline at end of file diff --git a/manage/plugins.html b/manage/plugins.html new file mode 100644 index 00000000..3539a481 --- /dev/null +++ b/manage/plugins.html @@ -0,0 +1,35 @@ + + + + + + Plugins | asdf + + + + + + + + + + + + + + +
Skip to content

Plugins

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

Add plugins via their Git URL:

shell
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:

shell
asdf plugin add <name>
+# asdf plugin add erlang

Recommendation

Prefer the longer git-url method as it is independent of the short-name repo.

List Installed

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

List All in Short-name Repository

shell
asdf plugin list all

See Plugins Shortname Index for the entire short-name list of plugins.

Update

shell
asdf plugin update --all

If you want to update a specific package, just say so.

shell
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)

Remove

bash
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.

Syncing the asdf Short-name Repository

The short-name repo is synced to your local machine and periodically refreshed. This method to determine a sync is as follows:

  • sync events are triggered by commands:
    • asdf plugin add <name>
    • asdf plugin list all
  • if configuration option disable_plugin_short_name_repository is set to yes, then sync is aborted early. See the asdf config docs for more.
  • if there has not been a synchronization in the last 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.
+ + + + \ No newline at end of file diff --git a/manage/versions.html b/manage/versions.html new file mode 100644 index 00000000..5223ce82 --- /dev/null +++ b/manage/versions.html @@ -0,0 +1,54 @@ + + + + + + Versions | asdf + + + + + + + + + + + + + + +
Skip to content

Versions

Install Version

shell
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.

Install Latest Stable Version

shell
asdf install <name> latest
+# asdf install erlang latest

Install latest stable version that begins with a given string.

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

List Installed Versions

shell
asdf list <name>
+# asdf list erlang

Filter versions to those that begin with a given string.

shell
asdf list <name> <version>
+# asdf list erlang 17

List All Available Versions

shell
asdf list all <name>
+# asdf list all erlang

Filter versions to those that begin with a given string.

shell
asdf list all <name> <version>
+# asdf list all erlang 17

Show Latest Stable Version

shell
asdf latest <name>
+# asdf latest erlang

Show latest stable version that begins with a given string.

shell
asdf latest <name> <version>
+# asdf latest erlang 17

Set Current Version

shell
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 sets 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.

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

Fallback to System Version

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.

shell
asdf local <name> system
+# asdf local python system

View Current Version

shell
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

Uninstall Version

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

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, 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:

shell
# 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

By-passing asdf shims

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.

+ + + + \ No newline at end of file diff --git a/more/community-projects.html b/more/community-projects.html new file mode 100644 index 00000000..f9780ad2 --- /dev/null +++ b/more/community-projects.html @@ -0,0 +1,25 @@ + + + + + + Community Projects | asdf + + + + + + + + + + + + + + +
Skip to content

Community Projects

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.

+ + + + \ No newline at end of file diff --git a/more/faq.html b/more/faq.html new file mode 100644 index 00000000..3364283a --- /dev/null +++ b/more/faq.html @@ -0,0 +1,25 @@ + + + + + + FAQ | asdf + + + + + + + + + + + + + + +
Skip to content

FAQ

Here are some common questions regarding asdf.

WSL1 support?

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 support?

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.

Newly installed executable not running?

I just npm install -g yarn, but cannot execute yarn. 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.

Shell not detecting newly installed shims?

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.

+ + + + \ No newline at end of file diff --git a/more/thanks.html b/more/thanks.html new file mode 100644 index 00000000..ae790c5b --- /dev/null +++ b/more/thanks.html @@ -0,0 +1,25 @@ + + + + + + Thanks | asdf + + + + + + + + + + + + + + +
Skip to content

Thanks

Thank you page to the asdf authors & contributors!

Credits

Me (@HashNuke), High-fever, cold, cough.

Copyright 2014 to the end of time (MIT License)

Maintainers

Contributors

See the list of contributors 🙏 on GitHub

+ + + + \ No newline at end of file diff --git a/plugins/create.html b/plugins/create.html new file mode 100644 index 00000000..7e3c3718 --- /dev/null +++ b/plugins/create.html @@ -0,0 +1,83 @@ + + + + + + Create a Plugin | asdf + + + + + + + + + + + + + + +
Skip to content

Create a Plugin

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.

Quickstart

There are two options to get started with creating your own plugin:

  1. use the asdf-vm/asdf-plugin-template repository to generate a plugin repo (named asdf-<tool_name>) with default scripts implemented. Once generated, clone the repo and run the setup.bash script to interactively update the template.
  2. start your own repo called asdf-<tool_name> and implement the required scripts as listed in the documentation below.

Golden Rules for Plugin Scripts

  • scripts should NOT call other asdf commands
  • keep your dependency list of Shell tools/commands small
  • avoid non-portable tools or command flags. For example, sort -V. See our asdf core list of banned commands

Scripts Overview

The full list of scripts callable from asdf.

ScriptDescription
bin/list-all requiredList all installable versions
bin/download requiredDownload source code or binary for the specified version
bin/install requiredInstalls the specified version
bin/latest-stable recommendedList the latest stable version of the specified tool
bin/help.overviewOutput a general description about the plugin & tool
bin/help.depsOutput a list of dependencies per Operating System
bin/help.configOutput plugin or tool configuration information
bin/help.linksOutput a list of links for the plugin or tool
bin/list-bin-pathsList relative paths to directories with binaries to create shims
bin/exec-envPrepare the environment for running the binaries
bin/exec-pathOutput the executable path for a version of a tool
bin/uninstallUninstall a specific version of a tool
bin/list-legacy-filenamesOutput filenames of legacy version files: .ruby-version
bin/parse-legacy-fileCustom parser for legacy version files
bin/post-plugin-addHook to execute after a plugin has been added
bin/post-plugin-updateHook to execute after a plugin has been updated
bin/pre-plugin-removeHook to execute before a plugin is removed

To see which commands invoke which scripts, see the detailed documentation for each script.

Environment Variables Overview

The full list of Environment Variables used throughout all scripts.

Environment VariablesDescription
ASDF_INSTALL_TYPEversion or ref
ASDF_INSTALL_VERSIONfull version number or Git Ref depending on ASDF_INSTALL_TYPE
ASDF_INSTALL_PATHthe path to where the tool should, or has been installed
ASDF_CONCURRENCYthe number of cores to use when compiling the source code. Useful for setting make -j
ASDF_DOWNLOAD_PATHthe path to where the source code or binary was downloaded to by bin/download
ASDF_PLUGIN_PATHthe path the plugin was installed
ASDF_PLUGIN_SOURCE_URLthe source URL of the plugin
ASDF_PLUGIN_PREV_REFprevous git-ref of the plugin repo
ASDF_PLUGIN_POST_REFupdated git-ref of the plugin repo
ASDF_CMD_FILEresolves 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.

Required Scripts

bin/list-all required

Description

List all installable versions.

Output Format

Must print a string with a space-separated list of versions. For example:

txt
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:

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.

bash
"${plugin_path}/bin/list-all"

bin/download required

Description

Download the source code or binary for a specific version of a tool to a specified location.

Implementation Details

  • The script must download the source or binary to the directory specified by ASDF_DOWNLOAD_PATH.
  • Only the decompressed source code or binary should be placed in the ASDF_DOWNLOAD_PATH directory.
  • On failure, no files should be placed in ASDF_DOWNLOAD_PATH.
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

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:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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.

bash
"${plugin_path}"/bin/download

bin/install required

Description

Install a specific version of a tool to a specified location.

Implementation Details

  • The script should install the specified version in the path ASDF_INSTALL_PATH.
  • Shims will be created by default for any files in $ASDF_INSTALL_PATH/bin. This behaviour can be customised with the optional bin/list-bin-paths script.
  • Success should exit with 0.
  • Failure should exit with a non-zero status.
  • To avoid TOCTOU (Time-of-Check-to-Time-of-Use) issues, ensure the script only places files in 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:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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.

bash
"${plugin_path}"/bin/install

Optional Scripts

bin/latest-stable recommended

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

  • The script should print the latest stable version of the tool to stdout.
  • Non-stable or release candidate versions should be omitted.
  • A filter query is provided as the first argument to the script. This should be used to filter the output by version number or tool provider.
    • For instance, the output of 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
      +3.2.2
      +> asdf latest ruby 2
      +2.7.8
      +> asdf latest ruby truffleruby
      +truffleruby+graalvm-22.3.1
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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.

bash
"${plugin_path}"/bin/latest-stable "$query"

bin/help.overview

Description

Output a general description about the plugin and the tool being managed.

Implementation Details

  • This script is required for any help output to be displayed for the plugin.
  • No heading should be printed as asdf core will print headings.
  • Output may be free-form text but ideally only one short paragraph.
  • Must not output any information that is already covered in the core asdf-vm documentation.
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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 tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.overview

bin/help.deps

Description

Output the list of dependencies tailored to the operating system. One dependency per line.

bash
git
+curl
+sed

Implementation Details

  • This script requires bin/help.overview for its output to be considered.
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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 tool

Call signature from asdf core

bash
"${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

  • This script requires bin/help.overview for its output to be considered.
  • Output can be free-form text.
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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 tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.config

Description

Output a list of links relevant to the plugin and tool. One link per line.

bash
Git Repository:	https://github.com/vlang/v
+Documentation:	https://vlang.io

Implementation Details

  • This script requires bin/help.overview for its output to be considered.
  • One link per line.
  • Format must be either:
    • <title>: <link>
    • or just <link>
  • Should be tailored to the Operating System and version of the tool being installed (using optionally set Environment Variables ASDF_INSTALL_VERSION and ASDF_INSTALL_TYPE).
  • Success should exit with 0.
  • Failure should exit with a non-zero status.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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 tool

Call signature from asdf core

bash
"${plugin_path}"/bin/help.links

bin/list-bin-paths

Description

List directories containing executables for the specified version of the tool.

Implementation Details

  • If this script is not present, asdf will look for binaries in the "${ASDF_INSTALL_PATH}"/bin directory & create shims for those.
  • Output a space-separated list of paths containing executables.
  • Paths must be relative to ASDF_INSTALL_PATH. Example output would be:
bash
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:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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

bash
"${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:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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 executable
  • 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.

Call signature from asdf core

bash
"${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

  • Must print a string with the relative executable path.
  • Conditionally override the shim's specified executable path, otherwise return the default path specified by the shim.
shell
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

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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 executable
  • 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.

Call signature from asdf core

bash
"${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.

bash
"${plugin_path}/bin/uninstall"

bin/list-legacy-filenames

Description

List legacy configuration filenames for determining the specified version of the tool.

Implementation Details

  • Output a space-separated list of filenames.
    bash
    .ruby-version .rvmrc
  • Only applies for users who have enabled the legacy_version_file option in their "${HOME}"/.asdfrc.

Environment Variables available to script

  • ASDF_INSTALL_TYPE: version or ref
  • ASDF_INSTALL_VERSION:
    • Full version number if ASDF_INSTALL_TYPE=version.
    • Git ref (tag/commit/branch) if 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.

bash
"${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

  • If not present, asdf will simply cat the legacy file to determine the version.
  • Should be deterministic and always return the same exact version:
    • when parsing the same legacy file.
    • regardless of what is installed on the machine or whether the legacy version is valid or complete. Some legacy file formats may not be suitable.
  • Output a single line with the version:
    bash
    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.

bash
"${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.

bash
"${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-ref
  • ASDF_PLUGIN_POST_REF: the plugin's updated git-ref

Call signature from asdf core

No parameters provided.

bash
"${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.

bash
"${plugin_path}/bin/pre-plugin-remove"

Extension Commands for asdf CLI advanced

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:

shell
foo/
+  lib/commands/
+    command.bash
+    command-bat.bash
+    command-bat-man.bash
+    command-help.bash

Users can now execute:

shell
$ 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`

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.

Custom Shim Templates advanced

WARNING

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.

Testing

asdf contains the plugin-test command to test your plugin:

shell
asdf plugin test <plugin_name> <plugin_url> [--asdf-tool-version <version>] [--asdf-plugin-gitref <git_ref>] [test_command...]
  • <plugin_name> & <plugin_url> are required
  • If optional [--asdf-tool-version <version>] is specified, the tool will be installed with that specific version. Defaults to asdf latest <plugin-name>
  • If optional [--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.
  • Optional parameter [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
    shell
    # 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

GitHub Action

The asdf-vm/actions repo provides a GitHub Action for testing your plugins hosted on GitHub. A sample .github/workflows/test.yaml Actions Workflow:

yaml
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"

TravisCI Config

A sample .travis.yml file, customize it to your needs

yaml
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:

shell
asdf plugin test <tool_name> <path> '<tool_command> --version'

API Rate Limiting

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:

shell
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

Plugin Shortname Index

TIP

The recommended installation method for a plugin is via direct URL installation:

shell
# 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.

+ + + + \ No newline at end of file diff --git a/pt-br/contribute/core.html b/pt-br/contribute/core.html new file mode 100644 index 00000000..4c508a1c --- /dev/null +++ b/pt-br/contribute/core.html @@ -0,0 +1,49 @@ + + + + + + asdf + + + + + + + + + + + + + + +
Skip to content

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.

guia de contribuição principal asdf.

Configuração inicial

Fork asdf no GitHub e/ou Git clone o branch padrão:

shell
# 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:

shell
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:

shell
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:

  • bats-core: Bash Automated Testing System, para testes unitários de scripts compatíveis com Bash ou POSIX.
  • shellcheck: Ferramenta de análise estática para scripts de shell.
  • shfmt: Um analisador, formatador e interpretador de shell com suporte a bash; inclui shfmt

Desenvolvimento

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:

shell
# 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

Teste de BATS

É 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:

shell
# 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.

Pull Requests, Releases e Commits Convencionais

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 patchfeat: 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.

Imagens Docker

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.

+ + + + \ No newline at end of file diff --git a/pt-br/contribute/documentation.html b/pt-br/contribute/documentation.html new file mode 100644 index 00000000..39f4a318 --- /dev/null +++ b/pt-br/contribute/documentation.html @@ -0,0 +1,53 @@ + + + + + + Docs & Site | asdf + + + + + + + + + + + + + + +
Skip to content

Docs & Site

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.

Configuração inicial

Fork asdf no GitHub e/ou Git clone o branch padrão:

shell
# 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:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

Instale a(s) versão(ões) da ferramenta com:

shell
asdf install
  • Node.js: tempo de execução JavaScript criado no mecanismo JavaScript V8 do Chrome.

Instale as dependências do Node.js do docs/package.json:

shell
npm install

Desenvolvimento

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:

@code json{3-5}

Para iniciar o servidor de desenvolvimento local:

shell
npm run dev

Formate o código antes de confirmar:

shell
npm run format

Pull Requests, Releases e Commits Convencionais

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>.

Vuepress

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.

I18n

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 é:

js
{
+  ...
+  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:

shell
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.

+ + + + \ No newline at end of file diff --git a/pt-br/contribute/first-party-plugins.html b/pt-br/contribute/first-party-plugins.html new file mode 100644 index 00000000..8bad2d73 --- /dev/null +++ b/pt-br/contribute/first-party-plugins.html @@ -0,0 +1,25 @@ + + + + + + First-Party Plugins | asdf + + + + + + + + + + + + + + +
Skip to content

First-Party Plugins

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:

+ + + + \ No newline at end of file diff --git a/pt-br/contribute/github-actions.html b/pt-br/contribute/github-actions.html new file mode 100644 index 00000000..4eab8cc8 --- /dev/null +++ b/pt-br/contribute/github-actions.html @@ -0,0 +1,25 @@ + + + + + + GitHub Actions | asdf + + + + + + + + + + + + + + +
Skip to content

GitHub Actions

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.

Obrigado pelo seu interesse, consulte o repositório de ações asdf para ver os problemas, conversas e diretrizes de contribuição existentes.

+ + + + \ No newline at end of file diff --git a/pt-br/guide/getting-started.html b/pt-br/guide/getting-started.html new file mode 100644 index 00000000..9d7b85db --- /dev/null +++ b/pt-br/guide/getting-started.html @@ -0,0 +1,37 @@ + + + + + + Começando | asdf + + + + + + + + + + + + + + +
Skip to content

Começando

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:

  1. Instalar as dependências
  2. Instalar o núcleo do asdf
  3. Adicionar o asdf ao seu shell
  4. Instalar um plugin para cada ferramenta que você gostaria de gerenciar
  5. Instalar uma versão desta ferramenta
  6. Definir uma versão global e uma versão local através do arquivo de configuração .tool-versions

Você pode também acompanhar o passo a passo da instalação através deste vídeo.

1. Instalando as dependências

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).

OSPackage ManagerCommand
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

Note

sudo may be required depending on your system configuration.

2. Download asdf

Official Download

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.15.0

Community Supported Download Methods

We highly recommend using the official git method.

MethodCommand
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper

3. Adicionando ao seu shell

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:

Bash & Git

Adicione esta linha ao seu ~/.bashrc:

shell
. "$HOME/.asdf/asdf.sh"

O auto completar deve ser configurado manualmente a partir da adição da seguinte linha ao .bashrc:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

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:

shell
. "$HOME/.asdf/asdf.sh"

O auto completar deve ser configurado manualmente a partir da adição da seguinte linha ao .bash_profile:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

Adicione asdf.sh ao ~/.bashrc através do comando:

shell
echo -e "\n. $(brew --prefix asdf)/asdf.sh" >> ~/.bashrc

O auto completar deve ser configurado seguindo as instruções da Homebrew, ou as seguintes:

shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bashrc
Bash & Homebrew (macOS)

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:

shell
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:

shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bash_profile
Bash & Pacman

Adicione a seguinte linha ao seu ~/.bashrc:

shell
. /opt/asdf-vm/asdf.sh

O pacote bash-completion precisa ser instalado para o auto completar funcionar.

Fish & Git

Adicione a seguinte linha ao seu ~/.config/fish/config.fish:

shell
source ~/.asdf/asdf.fish

O auto completar deve ser configurado manualmente através do seguinte comando:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

Adicione asdf.fish ao seu ~/.config/fish/config.fish através do comando:

shell
echo -e "\nsource "(brew --prefix asdf)"/asdf.fish" >> ~/.config/fish/config.fish

O auto completar é configurado pela Homebrew para o fish shell.

Fish & Pacman

Adicione a seguinte linha ao seu ~/.config/fish/config.fish:

shell
source /opt/asdf-vm/asdf.fish

O auto completar é configurado automaticamente durante a instalação do pacote AUR.

Elvish & Git

Adicione asdf.elv ao ~/.config/elvish/rc.elv através do comando:

shell
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

Elvish & Homebrew

Adicione asdf.elv ao ~/.config/elvish/rc.elv através do comando:

shell
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

Elvish & Pacman

Adicione asdf.elv ao ~/.config/elvish/rc.elv através do comando:

shell
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

ZSH & Git

Adicione a seguinte linha ao seu ~/.zshrc:

shell
. "$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:

shell
# append completions to fpath
+fpath=(${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • Se você está utilizando uma configuração compinit customizada, garanta que compinit esteja abaixo chamada asdf.sh
  • Se você está utilizando uma configuração 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.

ZSH & Homebrew

Adicione asdf.sh ao seu ~/.zshrc através do comando:

shell
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.

ZSH & Pacman

Adicione a seguinte linha ao seu ~/.zshrc:

shell
. /opt/asdf-vm/asdf.sh
PowerShell Core & Git

Adicione a seguinte linha ao seu ~/.config/powershell/profile.ps1:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

Adicione asdf.ps1 ao seu ~/.config/powershell/profile.ps1 através do comando:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.ps1\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

Adicione a seguinte linha ao seu ~/.config/powershell/profile.ps1:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

Adicione asdf.nu ao seu ~/.config/nushell/config.nu através do comando:

shell
"\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

Nushell & Homebrew

Adicione asdf.nu ao seu ~/.config/nushell/config.nu através do comando:

shell
"\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

Nushell & Pacman

Adicione asdf.nu ao seu ~/.config/nushell/config.nu através do comando:

shell
"\n$env.ASDF_DIR = '/opt/asdf-vm/'\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

Ao concluir atualizará automaticamente

POSIX Shell & Git

Adicione a seguinte linha ao seu ~/.profile:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

Adicione asdf.sh ao ~/.profile através do comando:

shell
echo -e "\nexport ASDF_DIR=\"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
+echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
POSIX Shell & Pacman

Adicione a seguinte linha ao seu ~/.profile:

shell
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á.

4. Instalando um plugin

Para demonstração, vamos instalar e configurar o Node.js através do plugin asdf-nodejs.

Dependências dos plugins

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:

SOInstalação de dependencia
Linux (Debian)apt-get install dirmngr gpg curl gawk
macOSbrew install gpg gawk

Devemos instalar instalar as dependências primeiro, pois alguns plugins exigem algumas ações após a instalação.

Instalando o plugin

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. Instalando uma versão

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:

shell
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.

6. Definindo uma versã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.

Versões globais

Os padrões globais são gerenciados em $HOME/.tool-versions. Defina uma versão global através do comando:

shell
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

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:

shell
asdf local nodejs latest

$PWD/.tool-versions ficará assim:

nodejs 16.5.0

Usando arquivos de versão existentes

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.

Setup finalizado!

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:

+ + + + \ No newline at end of file diff --git a/pt-br/guide/introduction.html b/pt-br/guide/introduction.html new file mode 100644 index 00000000..d9a4ca82 --- /dev/null +++ b/pt-br/guide/introduction.html @@ -0,0 +1,25 @@ + + + + + + Introdução | asdf + + + + + + + + + + + + + + +
Skip to content

Introduçã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.

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.

Funcionamento

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.

Projetos relacionados

nvm / n / rbenv etc

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.

direnv

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.

Homebrew

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.

NixOS

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.

Por que usar o asdf?

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.

+ + + + \ No newline at end of file diff --git a/pt-br/index.html b/pt-br/index.html new file mode 100644 index 00000000..23ef22cf --- /dev/null +++ b/pt-br/index.html @@ -0,0 +1,25 @@ + + + + + + asdf + + + + + + + + + + + + + + +
Skip to content

asdf

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!

+ + + + \ No newline at end of file diff --git a/pt-br/manage/commands.html b/pt-br/manage/commands.html new file mode 100644 index 00000000..742c5e4d --- /dev/null +++ b/pt-br/manage/commands.html @@ -0,0 +1,90 @@ + + + + + + All Commands | asdf + + + + + + + + + + + + + + +
Skip to content

All Commands

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.

txt
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
+ + + + \ No newline at end of file diff --git a/pt-br/manage/configuration.html b/pt-br/manage/configuration.html new file mode 100644 index 00000000..9b30a518 --- /dev/null +++ b/pt-br/manage/configuration.html @@ -0,0 +1,26 @@ + + + + + + Configuration | asdf + + + + + + + + + + + + + + +
Skip to content

Configuration

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.

.tool-versions

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
+nodejs 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 compi
  • path:~/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.

Variáveis de ambiente

  • 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.
+ + + + \ No newline at end of file diff --git a/pt-br/manage/core.html b/pt-br/manage/core.html new file mode 100644 index 00000000..12b0ba1e --- /dev/null +++ b/pt-br/manage/core.html @@ -0,0 +1,42 @@ + + + + + + Core | asdf + + + + + + + + + + + + + + +
Skip to content

Core

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.

Instalação e configuração

Baseado no Guia de Introdução.

Execute

shell
asdf exec <command> [args...]

Executa o comando shim para a versão atual

Variável de Ambiente

shell
asdf env <command> [util]

Informações

shell
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.

Reshim

shell
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.

Versionamento do Shim

shell
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:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

Atualizar

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:

MethodLatest Stable ReleaseLatest commit on master
asdf (via Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
PacmanObter manualmente um novo PKGBUILD e
reconstruir ou usar suas preferências de AUR.

Desinstalar

Para desinstalar asdf siga os passos:

Bash & Git
  1. Em seu ~/.bashrc remova as linhas do asdf.sh e seus complementos:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. Em seu ~/.bash_profile remova as linhas do asdf.sh e remova seus complementos:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. Em seu ~/.bashrc remova as linhas do asdf.sh e remova seus complementos:
shell
. $(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.

  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

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.

  1. Em seu ~/.bash_profile remova as linhas do asdf.sh e remova seus complementos:
shell
. $(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.

  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. Em seu ~/.bashrc remova as linhas do asdf.sh e seus complementos:
shell
. /opt/asdf-vm/asdf.sh
  1. Desinstale usando seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. Em seu ~/.config/fish/config.fish remova as linhas do asdf.sh:
shell
source ~/.asdf/asdf.fish

e remova os complementos de com esse comando:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. Em seu ~/.config/fish/config.fish remova as linhas do asdf.fish:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. Em seu ~/.config/fish/config.fish remova as linhas do asdf.fish:
shell
source /opt/asdf-vm/asdf.fish
  1. Desinstale usando seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. Em seu ~/.config/elvish/rc.elv remova as linhas que importa o módulo asdf:
shell
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:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Remova o diretório $HOME/.asdf:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Execute este comando para remover todos os arquivos de configuração asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. Em seu ~/.config/elvish/rc.elv remova as linhas que importa o módulo asdf:
shell
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:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Desinstale com seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute este comando para remover todos os arquivos de configuração asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. Em seu ~/.config/elvish/rc.elv remova as linhas que importa o módulo asdf:
shell
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:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. Desinstale com seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $ HOME/.asdf:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. Execute este comando para remover todos os arquivos de configuração asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. Em seu ~/.zshrc remova as linhas do asdf.sh e seus complementos:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

Ou use ZSH Framework plugin.

  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. Em seu ~/.zshrc remova as linhas do asdf.sh:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. Desinstale usando seu gerenciador de pacotes:
shell
brew uninstall asdf --force
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. Em seu ~/.zshrc remova as linhas do asdf.sh:
shell
. /opt/asdf-vm/asdf.sh
  1. Desinstale usando seu gerenciador de pacotes:
shell
pacman -Rs asdf-vm
  1. Remova o diretório $HOME/.asdf:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. Execute o comando para remover todos os arquivos de configurações do asdf:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"

Tudo pronto! 🎉

+ + + + \ No newline at end of file diff --git a/pt-br/manage/plugins.html b/pt-br/manage/plugins.html new file mode 100644 index 00000000..1ba86ae8 --- /dev/null +++ b/pt-br/manage/plugins.html @@ -0,0 +1,35 @@ + + + + + + Plugins | asdf + + + + + + + + + + + + + + +
Skip to content

Plugins

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.

Adicionar

Adicione os plugins via sua Url Git:

shell
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:

shell
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.

Listar Instalados

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

Listar todos nomes abreviados no repositório

shell
asdf plugin list all

Veja Plugins Shortname Index para toda a lista de nomes curtos de plugins.

Atualizar

shell
asdf plugin update --all

Se você quiser atualizar um pacote específico, apenas use.

shell
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)

Remover

bash
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.

Sincronizar nome abreviado no repositório

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:

  • comandos asdf plugin add <name> ou asdf plugin list all disparam a sincronização
  • ocorre uma sincronização se não houver nenhuma nos últimos X minutos
  • X 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.
+ + + + \ No newline at end of file diff --git a/pt-br/manage/versions.html b/pt-br/manage/versions.html new file mode 100644 index 00000000..3712ade2 --- /dev/null +++ b/pt-br/manage/versions.html @@ -0,0 +1,54 @@ + + + + + + Versões | asdf + + + + + + + + + + + + + + +
Skip to content

Versões

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.

Instalar Versão

shell
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.

Instalar última versão estável

shell
asdf install <name> latest
+# asdf install erlang latest

Instale a última versão estável que inicia com um texto.

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

Listar versões instaladas

shell
asdf list <name>
+# asdf list erlang

Limite as versões que inicie com um determinado texto.

shell
asdf list <name> <version>
+# asdf list erlang 17

Listar todas as versões disponíveis

shell
asdf list all <name>
+# asdf list all erlang

Limite as versões que inicie com um determinado texto.

shell
asdf list all <name> <version>
+# asdf list all erlang 17

Mostrar última versão estável

shell
asdf latest <name>
+# asdf latest erlang

Mostrar última versão estável que inicie com um determinado texto.

shell
asdf latest <name> <version>
+# asdf latest erlang 17

Selecionar versão atual

shell
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.

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

Resposta do sistema de versão

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.

shell
asdf local <name> system
+# asdf local python system

Verificar a versão atual

shell
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)

Desinstalar versão

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

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, 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:

shell
# 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

Ignorando shims do asdf

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.

+ + + + \ No newline at end of file diff --git a/pt-br/more/community-projects.html b/pt-br/more/community-projects.html new file mode 100644 index 00000000..ba83dd07 --- /dev/null +++ b/pt-br/more/community-projects.html @@ -0,0 +1,25 @@ + + + + + + Community Projects | asdf + + + + + + + + + + + + + + +
Skip to content

Community Projects

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.

+ + + + \ No newline at end of file diff --git a/pt-br/more/faq.html b/pt-br/more/faq.html new file mode 100644 index 00000000..7fd36ade --- /dev/null +++ b/pt-br/more/faq.html @@ -0,0 +1,25 @@ + + + + + + Perguntas frequentes | asdf + + + + + + + + + + + + + + +
Skip to content

Perguntas frequentes

Aqui estão algumas perguntas comuns sobre asdf.

Suporte WSL1?

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.

Suporte WSL2?

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.

Exectable recém-instalado não está funcionando?

Acabei de instalar o npm -g yarn, mas não consigo executar o yarn. 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).

Shell não detecta shims recém-instalados?

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.

+ + + + \ No newline at end of file diff --git a/pt-br/more/thanks.html b/pt-br/more/thanks.html new file mode 100644 index 00000000..97743dde --- /dev/null +++ b/pt-br/more/thanks.html @@ -0,0 +1,25 @@ + + + + + + Créditos | asdf + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pt-br/plugins/create.html b/pt-br/plugins/create.html new file mode 100644 index 00000000..0a880395 --- /dev/null +++ b/pt-br/plugins/create.html @@ -0,0 +1,59 @@ + + + + + + Criar um plug-in | asdf + + + + + + + + + + + + + + +
Skip to content

Criar um plug-in

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 que há em um plug-in

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.

Scripts obrigatórios

  • bin/list-all - lista todas as versões instaláveis
  • bin/download - baixe o código fonte ou binário para a versão especificada
  • bin/install - instala a versão especificada

Variavéis de Ambiente

Todos 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.

bin/list-all

Deve imprimir uma string com uma lista de versões separadas por espaço. A saída de exemplo seria a seguinte:

shell
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.

bin/download

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.

bin/install

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.

Scripts Opcional

scripts bin/help

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.

bin/list-bin-paths

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:

shell
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.

bin/exec-env

Configure o env para executar os binários no pacote.

bin/exec-path

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.

shell
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

bin/uninstall

Desinstala uma versão específica de uma ferramenta.

bin/list-legacy-filenames

Registre arquivos setter adicionais para este plugin. Deve imprimir uma string com uma lista de nomes de arquivos separados por espaços.

shell
.ruby-version .rvmrc

Nota: Isso só se aplica a usuários que habilitaram a opção legacy_version_file em seu ~/.asdfrc.

bin/parse-legacy-file

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.

bin/post-plugin-add

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}

bin/pre-plugin-remove

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}

Comandos de extensão para asdf CLI.

É 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:

shell
foo/
+  lib/commands/
+    command.bash
+    command-bat.bash
+    command-bat-man.bash
+    command-help.bash

Os usuários agora podem executar

shell
$ 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.

Modelos de calços personalizados

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.

Testando plug-ins

asdf contém o comando plugin-test para testar seu plugin. Você pode usá-lo da seguinte forma

shell
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

shell
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.

Exemplo GitHub Action

O repositório asdf-vm/actions fornece uma ação do GitHub para testar seus plugins hospedados no github.

yaml
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

Exemplo de configuração do TravisCI

Aqui está um arquivo .travis.yml de amostra, personalize-o de acordo com suas necessidades

yaml
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'.

Limitação de taxa da API do GitHub

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

shell
cmd="curl -s"
+if [ -n "$GITHUB_API_TOKEN" ]; then
+ cmd="$cmd -H 'Authorization: token $GITHUB_API_TOKEN'"
+fi
+
+cmd="$cmd $releases_path"

Enviando plugins para o repositório oficial de plugins

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.

+ + + + \ No newline at end of file diff --git a/vp-icons.css b/vp-icons.css new file mode 100644 index 00000000..ddc5bd8e --- /dev/null +++ b/vp-icons.css @@ -0,0 +1 @@ +.vpi-social-github{--icon:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' width='24' height='24'%3E%3Cpath fill='black' d='M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-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-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .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")} \ No newline at end of file diff --git a/zh-hans/contribute/core.html b/zh-hans/contribute/core.html new file mode 100644 index 00000000..4c47cf44 --- /dev/null +++ b/zh-hans/contribute/core.html @@ -0,0 +1,49 @@ + + + + + + asdf + + + + + + + + + + + + + + +
Skip to content

asdf

asdf 核心贡献指南.

初始化安装

在 Github 上 fork asdf 并且/或者使用 Git 克隆默认分支:

shell
# 克隆你 fork 的 asdf
+git clone https://github.com/<GITHUB_USER>/asdf.git
+# 或者直接克隆 asdf
+git clone https://github.com/asdf-vm/asdf.git

核心开发所需的工具都列举在这个存储库的 .tool-versions 文件中。如果你想要使用 asdf 自身来管理它,请使用以下命令添加这些插件:

shell
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

shell
asdf install

在本地机器的开发过程中不使用 asdf 来管理工具 或许 对你有帮助,因为你可能需要打破某些可能会影响到你的开发工具链的功能。以下是所需工具的原始列表:

  • bats-core:Bash 自动化测试系统,用于单元测试 Bash 或 POSIX 兼容脚本。
  • shellcheck:Shell 脚本的静态分析工具。
  • shfmt:支持 Bash 的 Shell 解析器、格式化器和解释器;包含 shfmt。

开发

如果你想要在不更改已安装的 asdf 的情况下尝试应用你的更改,可以将 $ASDF_DIR 变量设置为克隆存储库的路径,并临时将目录的 binshims 目录添加到你的路径中。

最好在提交或推送到远程之前,在本地做好格式化、lint 检查和测试你的代码。可以使用以下脚本/命令:

shell
# 脚本检查
+./scripts/shellcheck.bash
+
+# 格式化
+./scripts/shfmt.bash
+
+# 测试:所有案例
+bats test/
+# 测试:特定命令
+bats test/list_commands.bash

提示

增加测试! - 新特性需要进行测试,并加快错误修复的审查速度。请在创建拉取请求之前覆盖新的代码路径。查看 bats-core 文档 了解更多。

Bats 测试

强烈建议在编写测试之前检查现有的测试套件和 bats-core 文档

Bats 调试有时可能很困难。使用带有 -t 标识的 TAP 输出将使你能够在测试执行期间打印带有特殊文件描述符 >&3 的输出,从而简化调试。例如:

shell
# 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> 的所有类型包含: featfixdocsstylerefactorperftestbuildcichorerevert

  • !:表示重大更改
  • fix:将会创建一个新的 SemVer patch 补丁
  • feat:将会创建一个新的 SemVer minor 小版本
  • <type>!:将会创建一个新的 SemVer major 大版本

拉取请求标题必须遵循这种格式。

提示

请使用约定式提交信息格式作为拉取请求标题。

Docker 镜像

asdf-alpineasdf-ubuntu 项目正在努力提供一些 asdf 工具的容器化镜像。你可以使用这些容器镜像作为开发服务器的基础镜像,或者运行生产应用。

+ + + + \ No newline at end of file diff --git a/zh-hans/contribute/documentation.html b/zh-hans/contribute/documentation.html new file mode 100644 index 00000000..c69fe59f --- /dev/null +++ b/zh-hans/contribute/documentation.html @@ -0,0 +1,53 @@ + + + + + + 文档 & 网站 | asdf + + + + + + + + + + + + + + +
Skip to content

文档 & 网站

文档 & 网站贡献指南。

初始化设置

在 Github 上 fork asdf 并且/或者使用 Git 克隆默认分支:

shell
# 克隆你 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 进行管理。使用以下命令添加插件:

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs

使用以下命令安装工具版本:

shell
asdf install
  • Node.js:基于 Chrome 的 V8 引擎的 JavaScript 运行环境。

根据 docs/package.json 文件安装 Node.js 依赖:

shell
npm install

开发

Vuepress (v2) 是我们用来构建 asdf 文档网站的静态站点生成器(SSG)。它被选中来取代 Docsify.js,因为我们希望在用户没有可用或未启用 JavaScript 时支持仅依靠 HTML。Docsify 无法做到这一点。除此之外,两者特性集合大致相同,重点是 Vuepress 可以用最少的配置编写 Markdown 文件。

package.json 包含了开发所需的脚本:

@code json{3-5}

启动本地开发服务器:

shell
npm run dev

在提交之前格式化代码:

shell
npm run format

拉取请求、发布以及约定式提交

asdf 正在使用依赖 PR 标题中的约定式提交的自动化发布流水线。具体的文档可以查看 核心贡献指南.

当为文档更改创建 PR 请求时,请确保 PR 标题使用了约定式提交类型 docs 以及 docs: <description> 的格式。

Vuepress

网站的配置包含在几个 JavaScript 文件中,其中 JS 对象用于表示配置。它们是:

  • docs/.vuepress/config.js:网站的根配置文件。请查看 Vuepress 文档 了解更多详情。

为了简化根配置文件,更大的 JS 对象表示 导航栏和侧边栏 配置已经被提取并按照语言类型分隔开来。请参考以下文件:

  • docs/.vuepress/navbar.js
  • docs/.vuepress/sidebar.js

这些配置的官方文档位于 默认主题参考

I18n 国际化

Vuepress 有一流的国际化支持。根配置文件 docs/.vuepress/config.js 定义了支持的语言类型及其 URL、在选择下拉菜单中的标题以及导航栏/侧边栏配置引用。

导航栏/侧边栏配置在上述配置文件中捕获,按语言类型分隔开并单独导出。

每种语言的 markdown 内容必须位于与根配置文件中 locale 键同名的目录位置。也就是:

js
{
+  ...
+  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/ 目录下,如下所示:

shell
docs
+├─ README.md
+├─ foo.md
+├─ nested
+  └─ README.md
+└─ pt-BR
+   ├─ README.md
+   ├─ foo.md
+   └─ nested
+      └─ README.md

请查看 Vuepress i18n 国际化官方文档 了解更多详情。

+ + + + \ No newline at end of file diff --git a/zh-hans/contribute/first-party-plugins.html b/zh-hans/contribute/first-party-plugins.html new file mode 100644 index 00000000..a9ba8051 --- /dev/null +++ b/zh-hans/contribute/first-party-plugins.html @@ -0,0 +1,25 @@ + + + + + + 官方插件 | asdf + + + + + + + + + + + + + + +
Skip to content

官方插件

asdf 核心团队已经开发了一些与他们日常工作相关的插件。随时欢迎大家维护和改进这些插件。这些插件所对应的存储库链接如下所示:

对于社区插件,请参考:

+ + + + \ No newline at end of file diff --git a/zh-hans/contribute/github-actions.html b/zh-hans/contribute/github-actions.html new file mode 100644 index 00000000..2d69e8e1 --- /dev/null +++ b/zh-hans/contribute/github-actions.html @@ -0,0 +1,25 @@ + + + + + + GitHub Actions | asdf + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/zh-hans/guide/getting-started.html b/zh-hans/guide/getting-started.html new file mode 100644 index 00000000..d9c4b61e --- /dev/null +++ b/zh-hans/guide/getting-started.html @@ -0,0 +1,37 @@ + + + + + + 快速入门 | asdf + + + + + + + + + + + + + + +
Skip to content

快速入门

asdf 安装过程包括:

  1. 安装依赖
  2. 下载 asdf 核心
  3. 安装 asdf
  4. 为每一个你想要管理的工具/运行环境安装插件
  5. 安装工具/运行环境的一个版本
  6. 通过 .tool-versions 配置文件设置全局和项目版本

1. 安装依赖

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).

OSPackage ManagerCommand
linuxAptitudeapt install curl git
linuxDNFdnf install curl git
linuxPacmanpacman -S curl git
linuxZypperzypper install curl git
macOSHomebrewbrew install coreutils curl git
macOSSpackspack install coreutils curl git

Note

sudo may be required depending on your system configuration.

2. 下载 asdf

Official Download

shell
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.15.0

Community Supported Download Methods

We highly recommend using the official git method.

MethodCommand
Homebrewbrew install asdf
Pacmangit clone https://aur.archlinux.org/asdf-vm.git && cd asdf-vm && makepkg -si or use your preferred AUR helper

3. 安装 asdf

根据 Shell 脚本、操作系统和安装方法的组合不同,相应的配置也会不同。展开以下与你的系统最匹配的选项:

Bash & Git

~/.bashrc 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.sh"

补全功能必须在 .bashrc 文件中加入以下内容来配置完成:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Git (macOS)

如果你正在使用 macOS Catalina 或者更新的版本, 默认的 shell 已经被修改为 ZSH。除非修改回 Bash, 否则请遵循 ZSH 的说明。

~/.bash_profile 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.sh"

补全功能必须在 .bash_profile 文件中使用以下内容手动配置完成:

shell
. "$HOME/.asdf/completions/asdf.bash"
Bash & Homebrew

使用以下命令将 asdf.sh 加入到 ~/.bashrc 文件中:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.bashrc

补全功能将需要 按照 Homebrew 的说明完成配置 或者执行以下命令:

shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bashrc
Bash & Homebrew (macOS)

如果你正在使用 macOS Catalina 或者更新的版本, 默认的 shell 已经被修改为 ZSH。除非修改回 Bash, 否则请遵循 ZSH 的说明。

使用以下命令将 asdf.sh 加入到 ~/.bash_profile 文件中:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.bash_profile

补全功能将需要 按照 Homebrew 的说明完成配置 或者执行以下命令:

shell
echo -e "\n. \"$(brew --prefix asdf)/etc/bash_completion.d/asdf.bash\"" >> ~/.bash_profile
Bash & Pacman

~/.bashrc 文件中加入以下内容:

shell
. /opt/asdf-vm/asdf.sh

为了让补全功能正常工作需要安装 bash-completion

Fish & Git

~/.config/fish/config.fish 文件中加入以下内容:

shell
source ~/.asdf/asdf.fish

补全功能必须按照以下命令手动配置完成:

shell
mkdir -p ~/.config/fish/completions; and ln -s ~/.asdf/completions/asdf.fish ~/.config/fish/completions
Fish & Homebrew

使用以下命令将 asdf.fish 加入到 ~/.config/fish/config.fish 文件中:

shell
echo -e "\nsource "(brew --prefix asdf)"/libexec/asdf.fish" >> ~/.config/fish/config.fish

Fish shell 的补全功能可以交给 Homebrew 处理. 很友好!

Fish & Pacman

~/.config/fish/config.fish 文件中加入以下内容:

shell
source /opt/asdf-vm/asdf.fish

补全功能将会在安装过程中由 AUR 包管理器自动配置完成。

Elvish & Git

使用以下命令将 asdf.elv 加入到 ~/.config/elvish/rc.elv 文件中:

shell
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

补全功能将会自动配置。

Elvish & Homebrew

使用以下命令将 asdf.elv 加入到 ~/.config/elvish/rc.elv 文件中:

shell
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

补全功能将会自动配置。

Elvish & Pacman

使用以下命令将 asdf.elv 加入到 ~/.config/elvish/rc.elv 文件中:

shell
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

补全功能将会自动配置。

ZSH & Git

~/.zshrc 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.sh"

或者 使用 ZSH 框架插件,比如 asdf for oh-my-zsh 将会使脚本生效并安装补全功能。

补全功能会被 ZSH 框架 asdf 插件或者通过在 .zshrc 文件中加入以下内容自动配置:

shell
# append completions to fpath
+fpath=(${ASDF_DIR}/completions $fpath)
+# initialise completions with ZSH's compinit
+autoload -Uz compinit && compinit
  • 如果你正在使用自定义的 compinit 配置,请确保 compinitasdf.sh 生效位置的下方
  • 如果你正在使用自定义的 compinit 配置和 ZSH 框架,请确保 compinit 在框架生效位置的下方

警告

如果你正在使用 ZSH 框架,有关的 asdf 插件或许需要更新才能通过 fpath 正确地使用最新的 ZSH 补全功能。Oh-My-ZSH asdf 插件还在更新中,请查看 ohmyzsh/ohmyzsh#8837 了解更多。

ZSH & Homebrew

使用以下命令将 asdf.sh 加入到 ~/.zshrc 文件中:

shell
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 了解更多。

ZSH & Pacman

~/.zshrc 文件中加入以下内容:

shell
. /opt/asdf-vm/asdf.sh

补全功能会被放在一个对 ZSH 很友好的位置,但是 ZSH 必须使用自动补全完成配置

PowerShell Core & Git

~/.config/powershell/profile.ps1 文件中加入以下内容:

shell
. "$HOME/.asdf/asdf.ps1"
PowerShell Core & Homebrew

使用以下命令将 asdf.ps1 加入到 ~/.config/powershell/profile.ps1 文件中:

shell
echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.ps1\"" >> ~/.config/powershell/profile.ps1
PowerShell Core & Pacman

~/.config/powershell/profile.ps1 文件中加入以下内容:

shell
. /opt/asdf-vm/asdf.ps1
Nushell & Git

使用以下命令将 asdf.nu 加入到 ~/.config/nushell/config.nu 文件中:

shell
"\n$env.ASDF_DIR = ($env.HOME | path join '.asdf')\n source " + ($env.HOME | path join '.asdf/asdf.nu') | save --append $nu.config-path

补全功能将会自动配置。

Nushell & Homebrew

使用以下命令将 asdf.nu 加入到 ~/.config/nushell/config.nu 文件中:

shell
"\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

补全功能将会自动配置。

Nushell & Pacman

使用以下命令将 asdf.nu 加入到 ~/.config/nushell/config.nu 文件中:

shell
"\n$env.ASDF_DIR = '/opt/asdf-vm/'\n source /opt/asdf-vm/asdf.nu" | save --append $nu.config-path

补全功能将会自动配置。

POSIX Shell & Git

~/.profile 文件中加入以下内容:

shell
export ASDF_DIR="$HOME/.asdf"
+. "$HOME/.asdf/asdf.sh"
POSIX Shell & Homebrew

使用以下命令将 asdf.sh 加入到 ~/.profile 文件中:

shell
echo -e "\nexport ASDF_DIR=\"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
+echo -e "\n. \"$(brew --prefix asdf)/libexec/asdf.sh\"" >> ~/.profile
POSIX Shell & Pacman

~/.profile 文件中加入以下内容:

shell
export ASDF_DIR="/opt/asdf-vm"
+. /opt/asdf-vm/asdf.sh

asdf 脚本需要在设置好的 $PATH 之后和已经生效的框架(比如 oh-my-zsh 等等)之后的位置生效。

通常打开一个新的终端标签页来重启你的 shell 让 PATH 更改即时生效。

核心安装完成!

这样就完成了 asdf 核心的安装 🎉

asdf 仅在你安装插件工具和管理它们的版本时才开始真正发挥作用。请继续阅读下面的指南来了解这些是如何做到的。

4. 安装插件

出于演示目的,我们将通过 asdf-nodejs 插件来安装和设置 Node.js

插件依赖

每个插件都有依赖,所以我们需要确认应该列举了这些依赖的插件源码。对于 asdf-nodejs 来说,它们是:

操作系统安装依赖
Linux (Debian)apt-get install dirmngr gpg curl gawk
macOSbrew install gpg gawk

我们应该提前安装这些依赖,因为有些插件有 post-install 钩子。

安装插件

shell
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git

5. 安装指定版本

现在我们已经有了 Node.js 插件,所以我们可以开始安装某个版本了。

我们通过 asdf list all nodejs 可以看到所有可用的版本或者通过 asdf list all nodejs 14 查看版本子集。

我们将只安装最新可用的 latest 版本:

shell
asdf install nodejs latest

注意

asdf 强制使用准确的版本。latest 是一个通过 asdf 来解析到执行时刻的实际版本号的辅助工具。

6. 设置默认版本

asdf 在从当前工作目录一直到 $HOME 目录的所有 .tool-versions 文件中进行工具的版本查找。查找在执行 asdf 管理的工具时实时发生。

警告

如果没有为工具找到指定的版本,则会出现错误asdf current 将显示当前目录中的工具和版本解析结果,或者不存在,以便你可以观察哪些工具将无法执行。

全局

全局默认配置在 $HOME/.tool-versions 文件中进行管理。使用以下命令可以设置一个全局版本:

shell
asdf global nodejs latest

$HOME/.tool-versions 文件内容将会如下所示:

nodejs 16.5.0

某些操作系统已经有一些由系统而非 asdf 安装和管理的工具了,python 就是一个常见的例子。你需要告诉 asdf 将管理权还给系统。版本参考部分 将会引导你。

本地

本地版本被定义在 $PWD/.tool-versions 文件中(当前工作目录)。通常,这将会是一个项目的 Git 存储库。当在你想要的目录执行:

shell
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 来查看它们。命令主要分为三类:

+ + + + \ No newline at end of file diff --git a/zh-hans/guide/introduction.html b/zh-hans/guide/introduction.html new file mode 100644 index 00000000..ae7465f9 --- /dev/null +++ b/zh-hans/guide/introduction.html @@ -0,0 +1,25 @@ + + + + + + 项目简介 | asdf + + + + + + + + + + + + + + +
Skip to content

项目简介

asdf 是一个工具版本管理器。所有的工具版本定义都包含在一个文件(.tool-versions)中,你可以将配置文件放在项目的 Git 存储库中以便于和团队其他成员共享,从而确保每个人都使用完全相同的工具版本。

传统工作方式需要多个命令行版本管理器,而且每个管理器都有其不同的 API、配置文件和实现方式(比如,$PATH 操作、垫片、环境变量等等)。asdf 提供单个交互方式和配置文件来简化开发工作流程,并可通过简单的插件接口扩展到所有工具和运行环境。

它是如何工作的

一旦 asdf 核心在 Shell 配置中设置好之后,你可以安装插件来管理特定的工具。当通过插件安装工具时,安装的可执行程序会为每个可执行程序创建 垫片。当你尝试运行其中一个可执行程序时,将运行垫片,从而允许 asdf 识别 .tool-versions 文件中设置的工具版本并执行该版本。

相关项目

nvm / n / rbenv 等

nvm, nrbenv 等工具都是用 Shell 脚本写的,这些脚本能为工具安装的可执行程序创建垫片。

asdf 非常相似,目的是在工具/运行环境版本管理领域竞争。asdf 的区别之处在于它的插件系统,它消除了每个工具/运行环境对管理工具的需求、每个管理工具的不同命令以及存储库中不同的*-版本文件。

direnv

使用可以根据当前目录加载和卸载环境变量的新功能增强现有 shell。

asdf 不管理环境变量,但是有一个插件 asdf-direnv 可以用来集成 direnv 的特性到 asdf 中。

请查看 direnv 文档 了解更多。

Homebrew

macOS(或者 Linux)上缺失包的管理器

Homebrew 管理你的软件包及其上游依赖。asdf 不管理上游依赖,它不是包管理器。这个责任取决于用户,尽管我们试图保持依赖关系列表很小。

请查看 Homebrew 文档 了解更多。

NixOS

Nix 是一种采用独特方法进行软件包管理和系统配置的工具

NixOS 旨在通过管理每个工具的整个依赖关系树中软件包的确切版本来构建真正可重复的环境,有些是 asdf 无法做到的。NixOS 使用自己的编程语言、许多命令行工具和超过 60,000 个包的包集合来实现这一点。

同样,asdf 不管理上游依赖,并且它不是一个包管理器。

请查看 NixOS 文档 了解更多。

为什么使用 asdf?

asdf 确保团队可以使用完全相同的工具版本,通过插件系统支持很多工具,以及作为 Shell 配置中包含的单个 Shell 脚本的 简单性和熟悉性

注意

asdf 并不打算成为一个系统包管理器。它是一个工具版本管理器。仅仅因为你可以为任何工具创建插件并使用 asdf 管理其版本,并不意味着这是这个特定工具的最佳实践方案。

+ + + + \ No newline at end of file diff --git a/zh-hans/index.html b/zh-hans/index.html new file mode 100644 index 00000000..9296ed69 --- /dev/null +++ b/zh-hans/index.html @@ -0,0 +1,25 @@ + + + + + + asdf + + + + + + + + + + + + + + +
Skip to content

asdf

多运行时版本管理器

使用一个工具管理所有运行时版本!

+ + + + \ No newline at end of file diff --git a/zh-hans/manage/commands.html b/zh-hans/manage/commands.html new file mode 100644 index 00000000..88e200de --- /dev/null +++ b/zh-hans/manage/commands.html @@ -0,0 +1,90 @@ + + + + + + 所有命令 | asdf + + + + + + + + + + + + + + +
Skip to content

所有命令

asdf 中所有可用命令的列表。这个列表就是 asdf help 命令的打印内容。

txt
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
+ + + + \ No newline at end of file diff --git a/zh-hans/manage/configuration.html b/zh-hans/manage/configuration.html new file mode 100644 index 00000000..4b4b16a7 --- /dev/null +++ b/zh-hans/manage/configuration.html @@ -0,0 +1,33 @@ + + + + + + 配置 | asdf + + + + + + + + + + + + + + +
Skip to content

配置

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 将会使用这个文件所指定的配置。下面的文件展示了所需的格式,其中包含用于演示的默认值:

txt
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 文件。

选项描述
no 默认.tool-versions 文件读取版本
yes如果可行的话,从传统版本文件读取版本(.ruby-versions

use_release_candidates

配置 asdf update 命令以升级到最新的候选版本,而不是最新的语义版本。

选项描述
no 默认语义版本被使用
yes候选版本被使用

always_keep_download

配置 asdf install 命令以保留或删除下载的源代码或二进制文件。

选项描述
no 默认在成功安装后删除源代码或二进制文件
yes在成功安装后保留源代码或二进制文件

plugin_repository_last_check_duration

配置自上次 asdf 插件存储库同步到下一次存储库同步的持续时间。命令 asdf plugin add <name> 或者 asdf plugin list all 将会触发持续时间的检查,如果持续时间已过,则进行同步。

选项描述
1999999999 的数字
默认60
如果已过自上次同步的持续时间,触发器事件发生时同步
0每个触发器事件发生时同步
never从不同步

环境变量

  • 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 等包管理器使用它来确保个性化安装的正确的更新方法。
+ + + + \ No newline at end of file diff --git a/zh-hans/manage/core.html b/zh-hans/manage/core.html new file mode 100644 index 00000000..788d500a --- /dev/null +++ b/zh-hans/manage/core.html @@ -0,0 +1,42 @@ + + + + + + 核心 | asdf + + + + + + + + + + + + + + +
Skip to content

核心

核心 asdf 命令列表很小,但可以促进很多工作流。

安装和配置

请查看 快速上手 了解更多详情。

Exec

shell
asdf exec <command> [args...]

执行当前版本的命令垫片。

Env

shell
asdf env <command> [util]

Info

shell
asdf info

用于打印操作系统、Shell 和 asdf 调试信息的辅助命令。在报告 bug 时需要共享这些信息。

Reshim

shell
asdf reshim <name> <version>

这将为某个包的当前版本重新创建垫片。默认情况下,垫片是在某个工具安装的过程中由插件创建。一些工具像 npm 命令行 允许全局安装可执行程序,比如使用 npm install -g yarn 命令安装 Yarn。因为这个可执行程序不是通过插件生命周期安装的,所以还没有对应的垫片存在。asdf reshim nodejs <version> 命令将会强制重新计算任何新可执行程序的垫片,类似 nodejsversions 版本下的 yarn

Shim-versions

shell
asdf shim-versions <command>

列举为命令提供垫片的插件和版本。

例如,Node.js 附带了两个可执行程序,nodenpm。当使用 asdf-nodejs插件安装了这些工具的很多版本时,执行shim-versions` 命令会返回:

shell
 asdf shim-versions node
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0
shell
 asdf shim-versions npm
+nodejs 14.8.0
+nodejs 14.17.3
+nodejs 16.5.0

更新

asdf 有一个依赖于 Git (我们推荐的安装方法)的内置命令用于更新。如果你使用了其他方法安装,则应按照该方法的步骤操作:

方法最新稳定版本master 分支上的最新提交
asdf (Git)asdf updateasdf update --head
Homebrewbrew upgrade asdfbrew upgrade asdf --fetch-HEAD
Pacman下载一个新的 PKGBUILD 并且重新编译
或者使用你习惯的 AUR helper

卸载

根据以下步骤卸载 asdf

Bash & Git
  1. ~/.bashrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Git (macOS)
  1. ~/.bash_profile 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. "$HOME/.asdf/asdf.sh"
+. "$HOME/.asdf/completions/asdf.bash"
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew
  1. ~/.bashrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

补全功能可能已经如 Homebrew 的指南 那样配置了,因此请按照他们的指南找出要删除的内容。

  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Homebrew (macOS)

如果你正在使用 macOS Catalina 以及更新版本,默认的 shell 已经变成了 ZSH。如果你在 ~/.bash_profile 文件中找不到任何配置,则可能位于 ~/.zshrc 中。在这种情况下,请按照 ZSH 指南进行操作。

  1. ~/.bash_profile 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
+. $(brew --prefix asdf)/etc/bash_completion.d/asdf.bash

补全功能可能已经如 Homebrew 的指南 那样配置了,因此请按照他们的指南找出要删除的内容。

  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Bash & Pacman
  1. ~/.bashrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. /opt/asdf-vm/asdf.sh
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Git
  1. ~/.config/fish/config.fish 配置文件中移除生效 asdf.fish 的行:
shell
source ~/.asdf/asdf.fish

以及使用以下命令移除补全功能:

shell
rm -rf ~/.config/fish/completions/asdf.fish
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Homebrew
  1. ~/.config/fish/config.fish 配置文件中移除生效 asdf.fish 的行:
shell
source "(brew --prefix asdf)"/libexec/asdf.fish
  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Fish & Pacman
  1. ~/.config/fish/config.fish 配置文件中移除生效 asdf.fish 的行:
shell
source /opt/asdf-vm/asdf.fish
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录:
shell
rm -rf (string join : -- $ASDF_DATA_DIR $HOME/.asdf)
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Git
  1. ~/.config/elvish/rc.elv 配置文件中移除使用 asdf 模块的行:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

以及使用以下命令卸载 asdf 模块:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 移除 $HOME/.asdf 目录:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Homebrew
  1. ~/.config/elvish/rc.elv 配置文件中移除使用 asdf 模块的行:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

以及使用以下命令卸载 asdf 模块:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 用包管理器卸载:
shell
brew uninstall asdf --force
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
Elvish & Pacman
  1. ~/.config/elvish/rc.elv 配置文件中移除使用 asdf 模块的行:
shell
use asdf _asdf; var asdf~ = $_asdf:asdf~
+set edit:completion:arg-completer[asdf] = $_asdf:arg-completer~

以及使用以下命令卸载 asdf 模块:

shell
rm -f ~/.config/elvish/lib/asdf.elv
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录:
shell
if (!=s $E:ASDF_DATA_DIR "") { rm -rf $E:ASDF_DATA_DIR } else { rm -rf ~/.asdf }
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Git
  1. ~/.zshrc 配置文件中移除生效 asdf.sh 和补全功能的行:
shell
. "$HOME/.asdf/asdf.sh"
+# ...
+fpath=(${ASDF_DIR}/completions $fpath)
+autoload -Uz compinit
+compinit

或者 ZSH 框架插件(如果用了的话)

  1. 移除 $HOME/.asdf 目录:
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Homebrew
  1. ~/.zshrc 配置文件中移除生效 asdf.sh 的行:
shell
. $(brew --prefix asdf)/libexec/asdf.sh
  1. 用包管理器卸载:
shell
brew uninstall asdf --force && brew autoremove
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"
ZSH & Pacman
  1. ~/.zshrc 配置文件中移除生效 asdf.sh 的行:
shell
. /opt/asdf-vm/asdf.sh
  1. 用包管理器卸载:
shell
pacman -Rs asdf-vm
  1. 移除 $HOME/.asdf 目录
shell
rm -rf "${ASDF_DATA_DIR:-$HOME/.asdf}"
  1. 执行以下命令移除 asdf 所有配置文件:
shell
rm -rf "$HOME/.tool-versions" "$HOME/.asdfrc"

恭喜你完成了 🎉

+ + + + \ No newline at end of file diff --git a/zh-hans/manage/plugins.html b/zh-hans/manage/plugins.html new file mode 100644 index 00000000..704f09ee --- /dev/null +++ b/zh-hans/manage/plugins.html @@ -0,0 +1,35 @@ + + + + + + 插件 | asdf + + + + + + + + + + + + + + +
Skip to content

插件

插件告诉 asdf 如何处理不同的工具,如 Node.js、 Ruby、 Elixir 等。

请参考 创建插件 了解用于支持更多工具的插件 API。

添加

通过 Git URL 地址添加插件:

shell
asdf plugin add <name> <git-url>
+# asdf plugin add elm https://github.com/vic/asdf-elm

或者通过插件存储库中的缩写添加插件:

shell
asdf plugin add <name>
+# asdf plugin add erlang

建议

推荐独立于缩写存储库的、更长的 git-url 方法。

列举已安装

shell
asdf plugin list
+# asdf plugin list
+# java
+# nodejs
shell
asdf plugin list --urls
+# asdf plugin list
+# java            https://github.com/halcyon/asdf-java.git
+# nodejs          https://github.com/asdf-vm/asdf-nodejs.git

列举缩写存储库中的所有插件

shell
asdf plugin list all

请参考 插件缩写索引 了解插件的完整缩写列表。

更新

shell
asdf plugin update --all

如果你想要更新特定的包,如下所示。

shell
asdf plugin update <name>
+# asdf plugin update erlang

这种更新方式将会获取插件存储库的 源代码默认分支最新提交。版本化的插件和更新正在开发中 (#916)。

移除

bash
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 配置文档 了解更多。
+ + + + \ No newline at end of file diff --git a/zh-hans/manage/versions.html b/zh-hans/manage/versions.html new file mode 100644 index 00000000..4d4ccf71 --- /dev/null +++ b/zh-hans/manage/versions.html @@ -0,0 +1,54 @@ + + + + + + 版本 | asdf + + + + + + + + + + + + + + +
Skip to content

版本

安装版本

shell
asdf install <name> <version>
+# asdf install erlang 17.3

如果一个插件支持从源代码下载和编译,你可以指定 ref:foo,其中 foo 是特定的分支、标签或者提交。卸载该版本时,你也需要使用相同的名称和引用。

安装最新稳定版本

shell
asdf install <name> latest
+# asdf install erlang latest

安装给定字符串开头的最新稳定版本。

shell
asdf install <name> latest:<version>
+# asdf install erlang latest:17

列举已安装版本

shell
asdf list <name>
+# asdf list erlang

筛选出以给定字符串开头的版本。

shell
asdf list <name> <version>
+# asdf list erlang 17

列举所有可用版本

shell
asdf list all <name>
+# asdf list all erlang

筛选出以给定字符串开头的版本。

shell
asdf list all <name> <version>
+# asdf list all erlang 17

显示最新稳定版本

shell
asdf latest <name>
+# asdf latest erlang

显示以给定字符串开头的最新稳定版本。

shell
asdf latest <name> <version>
+# asdf latest erlang 17

设置当前版本

shell
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 文件支持的版本格式相同。

shell
ASDF_ELIXIR_VERSION=1.4.0 mix test

回退到系统版本

要使用工具 <name> 的系统版本而非 asdf 管理版本,你可以将工具的版本设置为 system

使用 globallocal 或者 shell 设置系统,如上面的 设置当前版本 部分所述。

shell
asdf local <name> system
+# asdf local python system

显示当前版本

shell
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)

卸载版本

shell
asdf uninstall <name> <version>
+# asdf uninstall erlang 17.3

垫片(Shims)

当 asdf 安装一个包时,它会在 $ASDF_DATA_DIR/shims 目录(默认为 ~/.asdf/shims)中为该包中的每个可执行程序创建垫片。这个位于 $PATH 中(通过 asdf.shasdf.fish 等等实现)的目录是已安装程序在环境中可用的方式。

垫片本身是非常简单的包装器,它 exec (执行)一个辅助程序 asdf exec,向其传递插件的名称和垫片正在包装的已安装包中的可执行程序的路径。

asdf exec 辅助程序确定要使用的软件包版本(比如在 .tool-versions 文件中指定,通过 asdf local ... 或者 asdf global ... 命令选择)、软件包安装目录中的可执行程序的最终路径(这可以在插件中通过 exec-path 回调来操作)以及要在其中执行的环境(也由插件 - exec-env 脚本提供),最后完成执行。

注意

因为此系统使用 exec 调用,所以软件包中的任何脚本如果要由 shell 生效而不是执行的脚本都需要直接访问,而不是通过垫片包装器进行访问。两个 asdf 命令:whichwhere 可以通过返回已安装软件包的路径来帮助解决这个问题。

shell
# 返回当前版本中主要可执行程序的路径
+source $(asdf which ${PLUGIN})/../script.sh
+
+# 返回软件包安装目录的路径
+source $(asdf where ${PLUGIN} $(asdf current ${PLUGIN}))/bin/script.sh

绕过 asdf 垫片

如果由于某种原因,你希望绕过 asdf 垫片,或者希望在进入项目目录时自动设置环境变量,则 asdf-direnv 插件可能会有所帮助。请务必查看其 README 文件了解更多详情。

+ + + + \ No newline at end of file diff --git a/zh-hans/more/community-projects.html b/zh-hans/more/community-projects.html new file mode 100644 index 00000000..0e425c70 --- /dev/null +++ b/zh-hans/more/community-projects.html @@ -0,0 +1,25 @@ + + + + + + Community Projects | asdf + + + + + + + + + + + + + + +
Skip to content

Community Projects

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.

+ + + + \ No newline at end of file diff --git a/zh-hans/more/faq.html b/zh-hans/more/faq.html new file mode 100644 index 00000000..dd525054 --- /dev/null +++ b/zh-hans/more/faq.html @@ -0,0 +1,25 @@ + + + + + + FAQ | asdf + + + + + + + + + + + + + + +
Skip to content

FAQ

以下是 asdf 相关的一些常见问题。

支持 WSL1 吗?

WSL1 (Windows Subsystem for Linux 1) 不受官方支持。asdf 的某些方面可能无法正常工作。我们不打算添加对 WSL1 的官方支持。

支持 WSL2 吗?

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 命令文档 了解更多。

Shell 没有检测到新安装的垫片?

如果 asdf reshim 没有解决你的问题,那么很有可能是在 asdf.sh 或者 asdf.fish 的生效不在你的 Shell 配置文件(.bash_profile.zshrcconfig.fish 等等)的下方。这需要你在设置你的 $PATH 之后和生效你的框架(oh-my-zsh 等等)(如果有的话)之后再生效。

+ + + + \ No newline at end of file diff --git a/zh-hans/more/thanks.html b/zh-hans/more/thanks.html new file mode 100644 index 00000000..f3e8c16b --- /dev/null +++ b/zh-hans/more/thanks.html @@ -0,0 +1,25 @@ + + + + + + 致谢 | asdf + + + + + + + + + + + + + + +
Skip to content

致谢

asdf 作者和贡献者的感谢页!

作者

我 (@HashNuke),高烧、感冒、咳嗽。

版权 2014 直到时间尽头 (MIT License)

维护者

贡献者

请查看 Github 上的 贡献者名单 🙏 了解更多。

+ + + + \ No newline at end of file diff --git a/zh-hans/plugins/create.html b/zh-hans/plugins/create.html new file mode 100644 index 00000000..f9cdb6dd --- /dev/null +++ b/zh-hans/plugins/create.html @@ -0,0 +1,59 @@ + + + + + + 创建插件 | asdf + + + + + + + + + + + + + + +
Skip to content

创建插件

插件里有什么

插件是一个包含几个可执行脚本的 git 存储库,用于支持对某种语言或工具进行版本控制。这些脚本在执行 list-allinstall 或者 uninstall 命令时被执行。你可以设定或取消设定环境变量,并执行设置工具环境所需的任何操作。

必要的脚本

  • bin/list-all - 列举所有可安装的版本
  • bin/download - 下载指定版本的源代码或二进制文件
  • bin/install - 安装指定版本

环境变量

所有脚本除了 bin/list-all 之外对以下环境变量有权限进行操作:

  • ASDF_INSTALL_TYPE - version 或者 ref
  • ASDF_INSTALL_VERSION - 如果 ASDF_INSTALL_TYPEversion,那么这将是版本号。否则它将传递为 git 的 ref。可能指向存储库的一个标签/提交/分支。
  • ASDF_INSTALL_PATH - 已经 安装到的目录(或 bin/install 脚本执行情况下 应该 安装到的目录)

这些附加的环境变量将可用于 bin/install 脚本:

  • ASDF_CONCURRENCY - 编译源代码时使用的内核数。对于配置 make -j 非常有用。
  • ASDF_DOWNLOAD_PATH - bin/download 脚本下载源代码或二进制文件的路径。

这些附加的环境变量将可用于 bin/download 脚本:

  • ASDF_DOWNLOAD_PATH - 源代码或二进制文件应该下载到的路径。

bin/list-all

必须打印一个带有空格分隔的版本列表的字符串,示例输出如下所示:

shell
1.0.1 1.0.2 1.3.0 1.4

请注意,最新版本应列在最后,以便它看起来更接近用户的提示。这很有帮助,因为 list-all 命令会在自己的行打印每个版本。如果有很多版本,那么早期版本可能会不在屏幕上。

如果从网站上的发布页面拉取版本,建议尽可能不对版本进行排序。通常,版本已经按照正确的顺序排列,或者以相反的顺序排列,在这种情况下,像 tac 这样的东西就足够了。如果必须手动对版本进行排序,则不能依赖 sort -V,因为 OSX 操作系统不支持。一种可以替代的排序功能是 更好的选择

bin/download

此脚本必须下载源代码或者二进制文件到 ASDF_DOWNLOAD_PATH 环境变量包含的路径。如果下载的源代码或者二进制文件是压缩的,则只有未压缩的源代码或二进制文件会放置在 ASDF_DOWNLOAD_PATH 目录中。

下载成功后脚本必须以 0 状态退出。如果下载失败,脚本必须以任何非零退出状态退出。

如果可能,脚本应该仅将文件放在 ASDF_DOWNLOAD_PATH 中。如果下载失败,则不应将任何文件放在目录中。

如果此脚本不存在,asdf 将假设存在 bin/install 脚本,将下载并安装该版本。asdf 仅在没有此脚本的情况下才能支持传统插件。所有插件都必须包含此脚本,最终将删除对传统插件的支持。

bin/install

本脚本应在 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 脚本已经下载源代码。

可选脚本

bin/help 脚本

这不是一个回调脚本,而是一组回调脚本,每个脚本将打印不同的文档到 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_VERSIONASDF_INSTALL_TYPE 的值。它们是可选的,并不总是被设置。

帮助回调脚本不得输出核心 asdf-vm 文档中已涵盖的任何信息。不得出现一般的 asdf 使用信息。

bin/latest-stable

如果实现了此回调,asdf 将使用它来确定工具的最新稳定版本,而不是尝试自行判断。asdf latest 通过查看由 list-all 回调打印的最新版本,在从输出中排除了几种类型的版本(如发布候选版本)之后推断出最新版本。当你的插件的 list-all 回调打印同一工具的不同变体并且最新版本不是你希望默认使用的变体的最新稳定版本时,这种默认行为是不可取的。例如,对于 Ruby,最新的稳定版本应该是 Ruby(MRI)的常规实现,但最后 list-all 回调打印的是 truffleruby 版本。

此回调使用单个 “过滤器” 字符串调用,因为它是唯一的参数。这应该用于过滤所有最新稳定版本。例如对于 Ruby,用户可以选择传入 jruby 以选择 jruby 的最新稳定版本。

bin/list-bin-paths

列举指定工具版本的可执行程序。必须打印一个带有空格分隔的包含可执行文件的目录路径列表的字符串。路径必须相对于传递的安装路径。示例输出如下所示:

shell
bin tools veggies

这将指示 asdf 为 <install-path>/bin<install-path>/tools<install-path>/veggies 中的文件创建垫片。

如果未指定此脚本,asdf 将在安装中查找 bin 目录并为这些脚本创建垫片。

bin/exec-env

设置环境变量以运行包中的二进制文件。

bin/exec-path

获取工具的指定版本的可执行程序路径。必须打印具有相对可执行程序路径的字符串。这允许插件有条件地覆盖垫片指定的可执行程序路径,否则返回垫片指定的默认路径。

shell
用法:
+  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

bin/uninstall

卸载某个工具的指定版本。

bin/list-legacy-filenames

为此插件注册其他设置器文件。必须打印一个带有空格分隔的文件名列表的字符串。

shell
.ruby-version .rvmrc

注意:这仅适用于在 ~/.asdfrc 配置文件中启用了 legacy_version_file 选项的用户。

bin/parse-legacy-file

这可用于进一步解析 asdf 找到的传统文件。如果 parse-legacy-file 未实现,asdf 将会简单读取文件来确定版本。脚本将传递文件路径作为其第一个参数。

bin/post-plugin-add

这可用于在插件添加到 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}

bin/post-plugin-update

这可用于在 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}

bin/pre-plugin-remove

这可用于在从 asdf 中删除插件之前运行任何预删除操作。

该脚本可以访问安装插件的路径(${ASDF_PLUGIN_PATH})。

其他请参考相关钩子:

  • pre_asdf_plugin_remove
  • pre_asdf_plugin_remove_${plugin_name}
  • post_asdf_plugin_remove
  • post_asdf_plugin_remove_${plugin_name}

asdf 命令行的扩展命令

插件可以通过提供 lib/commands/command*.bash 脚本或者可执行程序来定义新的 asdf 命令,这些脚本或可执行程序将使用插件名称作为 asdf 命令的子命令进行调用。

例如,假设一个 foo 插件有以下文件:

shell
foo/
+  lib/commands/
+    command.bash
+    command-bat.bash
+    command-bat-man.bash
+    command-help.bash

用户现在可以执行:

shell
$ 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 命令用于测试插件。你可以像下面这样使用它:

shell
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 插件,我们可以运行:

shell
asdf plugin test nodejs https://github.com/asdf-vm/asdf-nodejs.git node --version

我们强烈建议你在 CI 环境中测试你的插件,并确保它可以在 Linux 和 OSX 上运行。

GitHub Action 示例

asdf-vm/actions 存储库为托管在 github 的项目提供了使用 Github Action 来测试插件的可能。

yaml
steps:
+  - name: asdf_plugin_test
+    uses: asdf-vm/actions/plugin-test@v1
+    with:
+      command: "my_tool --version"
+    env:
+      GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} # 自动提供

TravisCI 配置示例

这是一个 .travis.yml 示例文件,请根据你的需要进行自定义:

yaml
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'

GitHub API 频率限制

如果你的插件的 list-all 依赖于访问 GitHub API,请确保在访问时提供授权令牌,否则你的测试可能会因频率限制而失败。

为此,创建一个仅具有 public_repo 权限的 新个人令牌

然后,在 travis.ci 构建设置中添加一个名为 GITHUB_API_TOKEN安全 环境变量。并且 绝对不要 在你的代码中公布你的 token。

最后,添加如下内容到 bin/list-all

shell
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 中的说明了解更多。

+ + + + \ No newline at end of file