ヴェズルフェルニルの研究ノート

座右の銘「ただ一人犀の角のように歩め」的な研究活動ノート

言語バージョン管理ツールmiseへの乗り換え(asdfから)

言語バージョン管理ツールとしてasdfに替わるものがないか探していて、miseが最新トレンドになっているのを知り、自分もmiseを使い始めてみた。

Home | mise-en-place

長らくasdfを利用していたが、asdfが起因となっている言語環境関係の障害に何度も遭遇したので、もうasdfを使うのはやめたいと考えていた。asdfの言語のバージョンの切り替え方法はシェルスクリプトが使われているが、この手法が環境によっては上手く動いてくれないときがある。asdfの前に使っていたanyenvに戻そうかと思って、いくつかのPC開発環境ではそうしていたが、anyenvは対応言語の種類が少なすぎるのがネックだ。

それで、miseを使い始めてみたら、miseはRustで書かれているからだろうか、asdfよりずっと安定感があり、各言語のバージョンのインストールも高速だった。完全にasdfを捨ててmiseに乗り換えることにした。

miseは、 asdfが生成するプロジェクト・ディレクトリ毎言語バージョン設定ファイル .tool-versionsや pyenvやnodenvが生成する同ファイル .python-version.node-versionを認識してくれるようになっているので、asdfでインストールした言語バージョンを使っていたプロジェクトが在っても、これらのファイルを残したままasdfを破棄することができる。

miseのインストール

brew install mise
curl https://mise.run | sh

miseのシェル設定

Mac

% echo 'eval "$(mise activate bash)"' >> ~/.bashrc
% source ~/.bashrc
% echo 'eval "$(mise activate zsh)"' >> ~/.zshrc
% source ~/.zshrc

Ubuntu

$ echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
$ source ~/.bashrc
$ echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc
$ source ~/.zshrc

miseによる言語バージョンのインストール

Python

% mise ls-remote python
activepython-2.7.14
activepython-3.5.4
activepython-3.6.0
anaconda-1.4.0
....    ....
....    ....
....    ....
....    ....
....    ....
....    ....
....    ....
....    ....
3.7.17
3.8.0
3.8-dev
3.8.1
3.8.2
3.8.3
3.8.4
3.8.5
3.8.6
3.8.7
3.8.8
3.8.9
3.8.10
3.8.11
3.8.12
3.8.13
3.8.14
3.8.15
3.8.16
3.8.17
3.8.18
3.8.19
3.8.20
3.9.0
....    ....
....    ....
3.9.22
3.10.0
3.10-dev
3.10.1
3.10.2
3.10.3
3.10.4
3.10.5
3.10.6
3.10.7
3.10.8
3.10.9
3.10.10
3.10.11
3.10.12
3.10.13
3.10.14
3.10.15
3.10.16
3.10.17
3.11.0
....    ....
....    ....
3.11.12
3.12.0
3.12-dev
3.12.1
3.12.2
3.12.3
3.12.4
3.12.5
3.12.6
3.12.7
3.12.8
3.12.9
3.12.10
3.13.0
....    ....
....    ....
% mise install python@3.8.18
% mise install python@3.10.10
% mise install python@3.12.8

Node.js

% mise ls-remote node
0.1.14
0.1.15
0.1.16
0.1.17
....    ....
....    ....
....    ....
....    ....
....    ....
....    ....
....    ....
....    ....
17.9.1
18.0.0
18.1.0
18.2.0
18.3.0
18.4.0
18.5.0
18.6.0
18.7.0
18.8.0
18.9.0
18.9.1
18.10.0
18.11.0
18.12.0
18.12.1
18.13.0
18.14.0
18.14.1
18.14.2
18.15.0
18.16.0
18.16.1
18.17.0
18.17.1
18.18.0
18.18.1
18.18.2
18.19.0
18.19.1
18.20.0
18.20.1
18.20.2
18.20.3
18.20.4
18.20.5
18.20.6
18.20.7
18.20.8
19.0.0
....    ....
....    ....
19.9.0
20.0.0
20.1.0
20.2.0
20.3.0
20.3.1
20.4.0
20.5.0
20.5.1
20.6.0
20.6.1
20.7.0
20.8.0
20.8.1
20.9.0
20.10.0
20.11.0
20.11.1
20.12.0
20.12.1
20.12.2
20.13.0
20.13.1
20.14.0
20.15.0
20.15.1
20.16.0
20.17.0
20.18.0
20.18.1
20.18.2
20.18.3
20.19.0
20.19.1
20.19.2
21.0.0
....    ....
....    ....
21.7.3
22.0.0
22.1.0
22.2.0
22.3.0
22.4.0
22.4.1
22.5.0
22.5.1
22.6.0
22.7.0
22.8.0
22.9.0
22.10.0
22.11.0
22.12.0
22.13.0
22.13.1
22.14.0
22.15.0
22.15.1
22.16.0
23.0.0
....    ....
....    ....
% mise install node@18.18.0
% mise install node@20.10.0
% mise install node@22.10.0

miseによる言語バージョンの設定

グローバルな言語バージョン設定

% mise list python
Tool    Version  Source                      Requested
python  3.8.18
python  3.10.10
python  3.12.8
% mise use -g python@3.10.10
mise ~/.config/mise/config.toml tools: python@3.10.10
% cd
% python --version
Python 3.10.10
  • Node.js
% mise list node
Tool  Version  Source                      Requested
node  18.18.0
node  20.10.0
node  22.10.0
% mise use -g node@20.10.0
mise ~/.config/mise/config.toml tools: node@20.10.0
% cd
% node -v
v20.10.0

プロジェクトの言語バージョン設定

% mkdir PROJECT_DIR
% cd PROJECT_DIR
% mise use python@3.8.18
mise ~/PROJEC_DIR/mise.toml tools: python@3.8.18
% python --version
Python 3.8.18
  • Node.js
% mkdir PROJECT_DIR
% cd PROJECT_DIR
% mise use node@18.18.0
mise ~/PROJECT_DIR/mise.toml tools: node@18.18.0
% node -v
v18.18.0

コマンド "mise use" は、("mise install" による)言語バージョンのインストールとバージョン設定を同時にやってくれるので、言語の新しいバージョンをインストールして使用するときは "mise use" だけを使えば良い。

miseで利用可能な言語

% mise registry
Tool                          Backends
1password                     aqua:1password/cli asdf:mise-plugins/mise-1password-cli
1password-cli                 aqua:1password/cli asdf:mise-plugins/mise-1password-cli
aapt2                         asdf:mise-plugins/mise-aapt2
act                           aqua:nektos/act ubi:nektos/act asdf:gr1m0h/asdf-act
action-validator              aqua:mpalmer/action-validator ubi:mpalmer/action-validator asdf:mpalmer/action-validator
actionlint                    aqua:rhysd/actionlint ubi:rhysd/actionlint asdf:crazy-matt/asdf-actionlint
adr-tools                     aqua:npryce/adr-tools asdf:https://gitlab.com/td7x/asdf/adr-tools
ag                            asdf:mise-plugins/mise-ag
age                           aqua:FiloSottile/age asdf:threkk/asdf-age
age-plugin-yubikey            ubi:str4d/age-plugin-yubikey asdf:joke/asdf-age-plugin-yubikey
agebox                        ubi:slok/agebox asdf:slok/asdf-agebox
aichat                        aqua:sigoden/aichat
air                           aqua:air-verse/air asdf:pdemagny/asdf-air
aks-engine                    aqua:Azure/aks-engine asdf:robsonpeixoto/asdf-aks-engine
allure                        asdf:mise-plugins/mise-allure
allurectl                     ubi:allure-framework/allurectl
alp                           aqua:tkuchiki/alp asdf:asdf-community/asdf-alp
amass                         ubi:owasp-amass/amass asdf:dhoeric/asdf-amass
amazon-ecr-credential-helper  aqua:awslabs/amazon-ecr-credential-helper asdf:dex4er/asdf-amazon-ecr-credential-helper
amplify                       ubi:aws-amplify/amplify-cli[exe=amplify] asdf:LozanoMatheus/asdf-aws-amplify-cli
android-sdk                   asdf:mise-plugins/mise-android-sdk
ansible                       pipx:ansible[uvx=false,pipx_args=--include-deps]
ansible-base                  pipx:ansible-core
ansible-core                  pipx:ansible-core
ant                           asdf:mise-plugins/mise-ant
apko                          aqua:chainguard-dev/apko ubi:chainguard-dev/apko asdf:omissis/asdf-apko
apollo-ios                    asdf:mise-plugins/mise-apollo-ios-cli
apollo-ios-cli                asdf:mise-plugins/mise-apollo-ios-cli
apollo-router                 ubi:apollographql/router asdf:safx/asdf-apollo-router
apollo-rover                  ubi:apollographql/rover
aqua                          ubi:aquaproj/aqua
arduino                       aqua:arduino/arduino-cli asdf:egnor/asdf-arduino-cli
argc                          ubi:sigoden/argc
argo                          aqua:argoproj/argo-workflows asdf:sudermanjr/asdf-argo
argo-rollouts                 aqua:argoproj/argo-rollouts asdf:abatilo/asdf-argo-rollouts
argocd                        aqua:argoproj/argo-cd ubi:argoproj/argo-cd[exe=argocd] asdf:beardix/asdf-argocd
asciidoctorj                  asdf:mise-plugins/mise-asciidoctorj
assh                          ubi:moul/assh asdf:mise-plugins/mise-assh
ast-grep                      aqua:ast-grep/ast-grep cargo:ast-grep npm:@ast-grep/cli pipx:ast-grep-cli
astro                         ubi:astronomer/astro-cli[exe=astro]
atlas                         aqua:ariga/atlas asdf:komi1230/asdf-atlas
atmos                         aqua:cloudposse/atmos asdf:cloudposse/asdf-atmos
auto-doc                      ubi:tj-actions/auto-doc asdf:mise-plugins/mise-auto-doc
aws                           aqua:aws/aws-cli asdf:MetricMike/asdf-awscli
aws-amplify                   ubi:aws-amplify/amplify-cli[exe=amplify] asdf:LozanoMatheus/asdf-aws-amplify-cli
aws-cli                       aqua:aws/aws-cli asdf:MetricMike/asdf-awscli
aws-copilot                   aqua:aws/copilot-cli asdf:NeoHsu/asdf-copilot
aws-iam-authenticator         aqua:kubernetes-sigs/aws-iam-authenticator asdf:zekker6/asdf-aws-iam-authenticator
aws-nuke                      aqua:ekristen/aws-nuke asdf:bersalazar/asdf-aws-nuke
aws-sam                       pipx:aws-sam-cli asdf:mise-plugins/mise-pyapp
aws-sam-cli                   pipx:aws-sam-cli asdf:mise-plugins/mise-pyapp
aws-sso                       aqua:synfinatic/aws-sso-cli asdf:adamcrews/asdf-aws-sso-cli
aws-vault                     aqua:99designs/aws-vault asdf:karancode/asdf-aws-vault
awscli                        aqua:aws/aws-cli asdf:MetricMike/asdf-awscli
awscli-local                  asdf:mise-plugins/mise-awscli-local
awsebcli                      pipx:awsebcli asdf:mise-plugins/mise-pyapp
awsls                         ubi:jckuester/awsls asdf:chessmango/asdf-awsls
awsrm                         ubi:jckuester/awsrm asdf:chessmango/asdf-awsrm
awsweeper                     ubi:jckuester/awsweeper asdf:chessmango/asdf-awsweeper
azure                         asdf:mise-plugins/mise-azure-cli
azure-cli                     asdf:mise-plugins/mise-azure-cli
azure-functions-core-tools    asdf:mise-plugins/mise-azure-functions-core-tools
azure-kubelogin               aqua:Azure/kubelogin asdf:sechmann/asdf-kubelogin
babashka                      ubi:babashka/babashka[exe=bb] asdf:pitch-io/asdf-babashka
balena                        ubi:balena-io/balena-cli[exe=balena] asdf:boatkit-io/asdf-balena-cli
balena-cli                    ubi:balena-io/balena-cli[exe=balena] asdf:boatkit-io/asdf-balena-cli
bashbot                       aqua:mathew-fleisch/bashbot asdf:mathew-fleisch/asdf-bashbot
bashly                        asdf:mise-plugins/mise-bashly
bat                           ubi:sharkdp/bat cargo:bat asdf:https://gitlab.com/wt0f/asdf-bat
bat-extras                    asdf:mise-plugins/mise-bat-extras
bats                          aqua:bats-core/bats-core asdf:timgluz/asdf-bats
bazel                         ubi:bazelbuild/bazel asdf:rajatvig/asdf-bazel
bazel-watcher                 aqua:bazelbuild/bazel-watcher
bazelisk                      aqua:bazelbuild/bazelisk asdf:josephtate/asdf-bazelisk
bbr                           ubi:cloudfoundry-incubator/bosh-backup-and-restore[matching=bbr-1] asdf:mise-plugins/tanzu-plug-in-for-asdf
bbr-s3-config-validator       asdf:mise-plugins/tanzu-plug-in-for-asdf
benthos                       aqua:benthosdev/benthos asdf:benthosdev/benthos-asdf
bfs                           asdf:mise-plugins/mise-bfs
binnacle                      aqua:Traackr/binnacle asdf:Traackr/asdf-binnacle
biome                         aqua:biomejs/biome ubi:biomejs/biome
bitwarden                     aqua:bitwarden/clients asdf:vixus0/asdf-bitwarden
bitwarden-secrets-manager     ubi:bitwarden/sdk[tag_regex=^bws,exe=bws] asdf:asdf-community/asdf-bitwarden-secrets-manager
black                         aqua:psf/black
boilerplate                   aqua:gruntwork-io/boilerplate
bombardier                    aqua:codesenberg/bombardier asdf:NeoHsu/asdf-bombardier
borg                          aqua:borgbackup/borg asdf:lwiechec/asdf-borg
bosh                          aqua:cloudfoundry/bosh-cli asdf:mise-plugins/tanzu-plug-in-for-asdf
bosh-backup-and-restore       ubi:cloudfoundry-incubator/bosh-backup-and-restore[matching=bbr-1] asdf:mise-plugins/tanzu-plug-in-for-asdf
bottom                        aqua:ClementTsang/bottom asdf:carbonteq/asdf-btm
boundary                      aqua:hashicorp/boundary asdf:mise-plugins/mise-hashicorp
bpkg                          asdf:mise-plugins/mise-bpkg
brig                          aqua:brigadecore/brigade asdf:Ibotta/asdf-brig
btop                          aqua:aristocratos/btop ubi:aristocratos/btop
btrace                        asdf:mise-plugins/mise-btrace
buf                           aqua:bufbuild/buf ubi:bufbuild/buf asdf:truepay/asdf-buf
buildpack                     aqua:buildpacks/pack asdf:johnlayton/asdf-buildpack
buildpacks                    aqua:buildpacks/pack asdf:johnlayton/asdf-buildpack
bun                           core:bun
cabal                         aqua:haskell/cabal/cabal-install
caddy                         aqua:caddyserver/caddy asdf:salasrod/asdf-caddy
calendarsync                  ubi:inovex/CalendarSync asdf:FeryET/asdf-calendarsync
calicoctl                     aqua:projectcalico/calico/calicoctl asdf:TheCubicleJockey/asdf-calicoctl
cargo-binstall                aqua:cargo-bins/cargo-binstall ubi:cargo-bins/cargo-binstall[tag_regex=^\\d\\.] cargo:cargo-binstall
cargo-insta                   aqua:mitsuhiko/insta ubi:mitsuhiko/insta
cargo-make                    ubi:sagiegurari/cargo-make asdf:mise-plugins/asdf-cargo-make
carp                          ubi:carp-lang/Carp[exe=carp] asdf:susurri/asdf-carp
carthage                      asdf:mise-plugins/mise-carthage
ccache                        ubi:ccache/ccache asdf:asdf-community/asdf-ccache
certstrap                     ubi:square/certstrap asdf:carnei-ro/asdf-certstrap
cf                            asdf:mise-plugins/mise-cf
cfssl                         aqua:cloudflare/cfssl/cfssl asdf:mathew-fleisch/asdf-cfssl
chamber                       ubi:segmentio/chamber asdf:mintel/asdf-chamber
changie                       ubi:miniscruff/changie asdf:pdemagny/asdf-changie
cheat                         aqua:cheat/cheat asdf:jmoratilla/asdf-cheat-plugin
checkmake                     aqua:mrtazz/checkmake
checkov                       ubi:bridgecrewio/checkov asdf:bosmak/asdf-checkov
chezmoi                       ubi:twpayne/chezmoi asdf:joke/asdf-chezmoi
chezscheme                    asdf:mise-plugins/mise-chezscheme
chicken                       asdf:mise-plugins/mise-chicken
chisel                        ubi:jpillora/chisel go:github.com/jpillora/chisel asdf:lwiechec/asdf-chisel
choose                        ubi:theryangeary/choose cargo:choose asdf:carbonteq/asdf-choose
chromedriver                  asdf:mise-plugins/mise-chromedriver
cidr-merger                   ubi:zhanhb/cidr-merger asdf:ORCID/asdf-cidr-merger
cidrchk                       ubi:mhausenblas/cidrchk asdf:ORCID/asdf-cidrchk
cilium-cli                    ubi:cilium/cilium-cli[exe=cilium] asdf:carnei-ro/asdf-cilium-cli
cilium-hubble                 ubi:cilium/hubble asdf:NitriKx/asdf-cilium-hubble
circleci                      ubi:CircleCI-Public/circleci-cli[exe=circleci] asdf:ucpr/asdf-circleci-cli
circleci-cli                  ubi:CircleCI-Public/circleci-cli[exe=circleci] asdf:ucpr/asdf-circleci-cli
clang                         asdf:mise-plugins/mise-llvm vfox:mise-plugins/vfox-clang
clang-format                  asdf:mise-plugins/mise-llvm
clangd                        asdf:mise-plugins/mise-llvm
clarinet                      ubi:hirosystems/clarinet asdf:alexgo-io/asdf-clarinet
cli53                         aqua:barnybug/cli53
clickhouse                    asdf:mise-plugins/mise-clickhouse
clj-kondo                     ubi:clj-kondo/clj-kondo asdf:rynkowsg/asdf-clj-kondo
cljstyle                      ubi:greglook/cljstyle asdf:abogoyavlensky/asdf-cljstyle
clojure                       asdf:mise-plugins/mise-clojure
cloud-sql-proxy               aqua:GoogleCloudPlatform/cloud-sql-proxy asdf:pbr0ck3r/asdf-cloud-sql-proxy
cloudflared                   aqua:cloudflare/cloudflared asdf:threkk/asdf-cloudflared
clusterawsadm                 ubi:kubernetes-sigs/cluster-api-provider-aws asdf:kahun/asdf-clusterawsadm
clusterctl                    aqua:kubernetes-sigs/cluster-api asdf:pfnet-research/asdf-clusterctl
cmake                         asdf:mise-plugins/mise-cmake vfox:mise-plugins/vfox-cmake
cmctl                         aqua:cert-manager/cmctl asdf:asdf-community/asdf-cmctl
cmdx                          ubi:suzuki-shunsuke/cmdx
cockroach                     aqua:cockroachdb/cockroach asdf:salasrod/asdf-cockroach
cocoapods                     asdf:mise-plugins/mise-cocoapods
cocogitto                     aqua:cocogitto/cocogitto
codefresh                     ubi:codefresh-io/cli[exe=codefresh] asdf:gurukulkarni/asdf-codefresh
codeql                        asdf:mise-plugins/mise-codeql
coder                         aqua:coder/coder asdf:mise-plugins/asdf-coder
colima                        ubi:abiosoft/colima asdf:CrouchingMuppet/asdf-colima
committed                     aqua:crate-ci/committed
conan                         pipx:conan asdf:mise-plugins/mise-pyapp
concourse                     aqua:concourse/concourse/concourse asdf:mattysweeps/asdf-concourse
conduit                       ubi:ConduitIO/conduit asdf:gmcabrita/asdf-conduit
conform                       aqua:siderolabs/conform asdf:skyzyx/asdf-conform
conftest                      aqua:open-policy-agent/conftest asdf:looztra/asdf-conftest
consul                        aqua:hashicorp/consul asdf:mise-plugins/mise-hashicorp
container-structure-test      aqua:GoogleContainerTools/container-structure-test asdf:FeryET/asdf-container-structure-test
cookiecutter                  pipx:cookiecutter asdf:shawon-crosen/asdf-cookiecutter
copier                        pipx:copier asdf:looztra/asdf-copier
copper                        ubi:cloud66-oss/copper asdf:vladlosev/asdf-copper
coq                           asdf:mise-plugins/mise-coq
coredns                       ubi:coredns/coredns asdf:s3than/asdf-coredns
coreutils                     aqua:uutils/coreutils ubi:uutils/coreutils
cosign                        aqua:sigstore/cosign asdf:https://gitlab.com/wt0f/asdf-cosign
coursier                      ubi:coursier/coursier[exe=cs] asdf:jiahuili430/asdf-coursier
cowsay                        npm:cowsay
crane                         aqua:google/go-containerregistry ubi:google/go-containerregistry[exe=crane] asdf:dmpe/asdf-crane
crc                           asdf:mise-plugins/mise-crc
credhub                       aqua:cloudfoundry/credhub-cli asdf:mise-plugins/tanzu-plug-in-for-asdf
crictl                        aqua:kubernetes-sigs/cri-tools/crictl asdf:FairwindsOps/asdf-crictl
crossplane                    aqua:crossplane/crossplane asdf:joke/asdf-crossplane-cli
crossplane-cli                aqua:crossplane/crossplane asdf:joke/asdf-crossplane-cli
crystal                       asdf:mise-plugins/mise-crystal vfox:mise-plugins/vfox-crystal
ctlptl                        aqua:tilt-dev/ctlptl asdf:ezcater/asdf-ctlptl
ctop                          ubi:bcicen/ctop asdf:NeoHsu/asdf-ctop
cue                           aqua:cue-lang/cue asdf:asdf-community/asdf-cue
curlie                        aqua:rs/curlie
cyclonedx                     aqua:CycloneDX/cyclonedx-cli asdf:xeedio/asdf-cyclonedx
dagger                        aqua:dagger/dagger asdf:virtualstaticvoid/asdf-dagger
danger-js                     asdf:mise-plugins/mise-danger-js
danger-swift                  spm:danger/swift
dapr                          aqua:dapr/cli asdf:asdf-community/asdf-dapr-cli
dart                          asdf:mise-plugins/mise-dart vfox:mise-plugins/vfox-dart
dasel                         aqua:TomWright/dasel asdf:asdf-community/asdf-dasel
databricks-cli                ubi:databricks/cli[exe=databricks]
datree                        aqua:datreeio/datree asdf:lukeab/asdf-datree
daytona                       asdf:mise-plugins/mise-daytona
dbmate                        aqua:amacneil/dbmate asdf:juusujanar/asdf-dbmate
deck                          aqua:Kong/deck asdf:nutellinoit/asdf-deck
delta                         aqua:dandavison/delta ubi:dandavison/delta asdf:andweeb/asdf-delta
deno                          core:deno
depot                         ubi:depot/cli[exe=depot] asdf:depot/asdf-depot
desk                          aqua:jamesob/desk asdf:endorama/asdf-desk
devspace                      aqua:devspace-sh/devspace asdf:NeoHsu/asdf-devspace
dhall                         asdf:mise-plugins/mise-dhall
difftastic                    ubi:wilfred/difftastic[exe=difft] asdf:volf52/asdf-difftastic
digdag                        asdf:mise-plugins/mise-digdag
direnv                        aqua:direnv/direnv asdf:asdf-community/asdf-direnv
dive                          ubi:wagoodman/dive asdf:looztra/asdf-dive
djinni                        ubi:cross-language-cpp/djinni-generator asdf:cross-language-cpp/asdf-djinni
dmd                           asdf:mise-plugins/mise-dmd
docker-compose                aqua:docker/compose
docker-slim                   ubi:slimtoolkit/slim asdf:xataz/asdf-docker-slim
dockle                        aqua:goodwithtech/dockle asdf:mathew-fleisch/asdf-dockle
doctl                         ubi:digitalocean/doctl asdf:maristgeek/asdf-doctl
doctoolchain                  asdf:mise-plugins/mise-doctoolchain
docuum                        ubi:stepchowfun/docuum cargo:docuum asdf:bradym/asdf-docuum
doggo                         aqua:mr-karan/doggo ubi:mr-karan/doggo
dome                          asdf:mise-plugins/mise-dome
doppler                       ubi:DopplerHQ/cli[exe=doppler] asdf:takutakahashi/asdf-doppler
dotenv-linter                 ubi:dotenv-linter/dotenv-linter asdf:wesleimp/asdf-dotenv-linter
dotnet                        asdf:mise-plugins/mise-dotnet vfox:mise-plugins/vfox-dotnet
dotnet-core                   asdf:mise-plugins/mise-dotnet-core
dotty                         asdf:mise-plugins/mise-dotty
dprint                        aqua:dprint/dprint asdf:asdf-community/asdf-dprint
draft                         aqua:Azure/draft asdf:kristoflemmens/asdf-draft
driftctl                      aqua:snyk/driftctl asdf:nlamirault/asdf-driftctl
drone                         ubi:harness/drone-cli[exe=drone] asdf:virtualstaticvoid/asdf-drone
dt                            aqua:so-dang-cool/dt asdf:so-dang-cool/asdf-dt
dtm                           ubi:devstream-io/devstream[exe=dtm] asdf:zhenyuanlau/asdf-dtm
dua                           aqua:Byron/dua-cli ubi:Byron/dua-cli[exe=dua]
duckdb                        aqua:duckdb/duckdb ubi:duckdb/duckdb
duf                           aqua:muesli/duf asdf:NeoHsu/asdf-duf
dust                          ubi:bootandy/dust asdf:looztra/asdf-dust
dvc                           asdf:mise-plugins/mise-dvc
dyff                          aqua:homeport/dyff asdf:https://gitlab.com/wt0f/asdf-dyff
dynatrace-monaco              ubi:Dynatrace/dynatrace-configuration-as-code[exe=monaco] asdf:nsaputro/asdf-monaco
e1s                           asdf:tbobm/asdf-e1s
earthly                       aqua:earthly/earthly asdf:YR-ZR0/asdf-earthly
ecspresso                     aqua:kayac/ecspresso asdf:kayac/asdf-ecspresso
editorconfig-checker          aqua:editorconfig-checker/editorconfig-checker asdf:gabitchov/asdf-editorconfig-checker
ejson                         aqua:Shopify/ejson asdf:cipherstash/asdf-ejson
eksctl                        aqua:eksctl-io/eksctl asdf:elementalvoid/asdf-eksctl
elasticsearch                 asdf:mise-plugins/mise-elasticsearch
elixir                        core:elixir
elixir-ls                     asdf:mise-plugins/mise-elixir-ls
elm                           ubi:elm/compiler[exe=elm] asdf:asdf-community/asdf-elm
emsdk                         asdf:mise-plugins/mise-emsdk
envcli                        ubi:EnvCLI/EnvCLI[exe=envcli] asdf:zekker6/asdf-envcli
envsubst                      aqua:a8m/envsubst asdf:dex4er/asdf-envsubst
ephemeral-postgres            asdf:mise-plugins/mise-ephemeral-postgres
erlang                        core:erlang
esc                           ubi:pulumi/esc asdf:fxsalazar/asdf-esc
esy                           asdf:mise-plugins/mise-esy
etcd                          aqua:etcd-io/etcd asdf:particledecay/asdf-etcd vfox:mise-plugins/vfox-etcd
evans                         aqua:ktr0731/evans asdf:goki90210/asdf-evans
eza                           asdf:mise-plugins/mise-eza cargo:eza
fastfetch                     aqua:fastfetch-cli/fastfetch
fd                            aqua:sharkdp/fd ubi:sharkdp/fd asdf:https://gitlab.com/wt0f/asdf-fd
ffmpeg                        asdf:mise-plugins/mise-ffmpeg
figma-export                  ubi:RedMadRobot/figma-export asdf:younke/asdf-figma-export
fillin                        aqua:itchyny/fillin asdf:ouest/asdf-fillin
firebase                      aqua:firebase/firebase-tools asdf:jthegedus/asdf-firebase
fission                       aqua:fission/fission asdf:virtualstaticvoid/asdf-fission
flamingo                      ubi:flux-subsystem-argo/flamingo asdf:log2/asdf-flamingo
flarectl                      ubi:cloudflare/cloudflare-go[exe=flarectl] asdf:mise-plugins/asdf-flarectl
flatc                         ubi:google/flatbuffers[exe=flatc] asdf:TheOpenDictionary/asdf-flatc
flutter                       asdf:mise-plugins/mise-flutter vfox:mise-plugins/vfox-flutter
fluttergen                    ubi:FlutterGen/flutter_gen[exe=fluttergen] asdf:FlutterGen/asdf-fluttergen
flux2                         aqua:fluxcd/flux2 asdf:tablexi/asdf-flux2
fly                           aqua:concourse/concourse/fly asdf:mise-plugins/tanzu-plug-in-for-asdf
flyctl                        aqua:superfly/flyctl ubi:superfly/flyctl asdf:chessmango/asdf-flyctl
flyway                        asdf:mise-plugins/mise-flyway
foundry                       ubi:foundry-rs/foundry[extract_all=true]
func-e                        asdf:mise-plugins/mise-func-e
furyctl                       ubi:sighupio/furyctl asdf:sighupio/asdf-furyctl
fx                            aqua:antonmedv/fx asdf:https://gitlab.com/wt0f/asdf-fx
fzf                           aqua:junegunn/fzf ubi:junegunn/fzf asdf:kompiro/asdf-fzf
gallery-dl                    asdf:mise-plugins/mise-gallery-dl
gam                           ubi:GAM-team/GAM[exe=gam] asdf:offbyone/asdf-gam
gator                         ubi:open-policy-agent/gatekeeper[exe=gator] asdf:MxNxPx/asdf-gator
gauche                        asdf:mise-plugins/mise-gauche
gcc-arm-none-eabi             asdf:mise-plugins/mise-gcc-arm-none-eabi
gcloud                        asdf:mise-plugins/mise-gcloud
gdu                           aqua:dundee/gdu
getenvoy                      ubi:tetratelabs-attic/getenvoy asdf:mise-plugins/mise-getenvoy
gh                            aqua:cli/cli ubi:cli/cli[exe=gh] asdf:bartlomiejdanek/asdf-github-cli
ghalint                       aqua:suzuki-shunsuke/ghalint ubi:suzuki-shunsuke/ghalint
ghc                           asdf:mise-plugins/mise-ghcup
ghcup                         ubi:haskell/ghcup-hs[exe=ghcup] asdf:mise-plugins/mise-ghcup
ghidra                        asdf:mise-plugins/mise-ghidra
ghorg                         aqua:gabrie30/ghorg asdf:gbloquel/asdf-ghorg
ghq                           aqua:x-motemen/ghq asdf:kajisha/asdf-ghq
ginkgo                        go:github.com/onsi/ginkgo/v2/ginkgo asdf:mise-plugins/mise-ginkgo
git-chglog                    aqua:git-chglog/git-chglog asdf:GoodwayGroup/asdf-git-chglog
git-cliff                     aqua:orhun/git-cliff asdf:jylenhof/asdf-git-cliff
gitconfig                     ubi:0ghny/gitconfig asdf:0ghny/asdf-gitconfig
github-cli                    aqua:cli/cli ubi:cli/cli[exe=gh] asdf:bartlomiejdanek/asdf-github-cli
github-markdown-toc           aqua:ekalinin/github-markdown-toc asdf:skyzyx/asdf-github-markdown-toc
gitleaks                      aqua:gitleaks/gitleaks asdf:jmcvetta/asdf-gitleaks
gitsign                       aqua:sigstore/gitsign asdf:spencergilbert/asdf-gitsign
gitu                          ubi:altsem/gitu cargo:gitu
gitui                         aqua:extrawurst/gitui asdf:looztra/asdf-gitui
gitversion                    aqua:gittools/gitversion ubi:gittools/gitversion
glab                          ubi:gitlab-org/cli[provider=gitlab,exe=glab] asdf:mise-plugins/mise-glab
gleam                         aqua:gleam-lang/gleam asdf:asdf-community/asdf-gleam
glen                          ubi:lingrino/glen asdf:bradym/asdf-glen
glooctl                       ubi:solo-io/gloo asdf:halilkaya/asdf-glooctl
glow                          aqua:charmbracelet/glow asdf:mise-plugins/asdf-glow
go                            core:go
go-containerregistry          aqua:google/go-containerregistry asdf:dex4er/asdf-go-containerregistry
go-getter                     aqua:hashicorp/go-getter asdf:mise-plugins/mise-go-getter
go-jira                       aqua:go-jira/jira asdf:dguihal/asdf-go-jira
go-jsonnet                    aqua:google/go-jsonnet asdf:https://gitlab.com/craigfurman/asdf-go-jsonnet
go-junit-report               ubi:jstemmer/go-junit-report asdf:jwillker/asdf-go-junit-report
go-sdk                        asdf:mise-plugins/mise-go-sdk
go-swagger                    aqua:go-swagger/go-swagger asdf:jfreeland/asdf-go-swagger
goconvey                      go:github.com/smartystreets/goconvey asdf:mise-plugins/mise-goconvey
gocryptfs                     aqua:rfjakob/gocryptfs ubi:rfjakob/gocryptfs
gofumpt                       ubi:mvdan/gofumpt asdf:looztra/asdf-gofumpt
gojq                          aqua:itchyny/gojq asdf:jimmidyson/asdf-gojq
gokey                         ubi:cloudflare/gokey
golangci-lint                 aqua:golangci/golangci-lint ubi:golangci/golangci-lint asdf:hypnoglow/asdf-golangci-lint
golangci-lint-langserver      ubi:nametake/golangci-lint-langserver go:github.com/nametake/golangci-lint-langserver
golines                       ubi:segmentio/golines go:github.com/segmentio/golines
gomigrate                     aqua:golang-migrate/migrate asdf:joschi/asdf-gomigrate
gomplate                      aqua:hairyhenderson/gomplate asdf:sneakybeaky/asdf-gomplate
gopass                        aqua:gopasspw/gopass asdf:trallnag/asdf-gopass
goreleaser                    aqua:goreleaser/goreleaser ubi:goreleaser/goreleaser asdf:kforsthoevel/asdf-goreleaser
goss                          aqua:goss-org/goss asdf:raimon49/asdf-goss
gotestsum                     aqua:gotestyourself/gotestsum asdf:pmalek/mise-gotestsum
graalvm                       asdf:mise-plugins/mise-graalvm
gradle                        aqua:gradle/gradle vfox:mise-plugins/vfox-gradle
gradle-profiler               asdf:mise-plugins/mise-gradle-profiler
grails                        asdf:mise-plugins/mise-grails
grain                         ubi:grain-lang/grain[tag_regex=^grain-] asdf:mise-plugins/mise-grain
granted                       aqua:common-fate/granted asdf:dex4er/asdf-granted
grex                          aqua:pemistahl/grex asdf:ouest/asdf-grex
gron                          aqua:tomnomnom/gron ubi:tomnomnom/gron
groovy                        asdf:mise-plugins/mise-groovy vfox:mise-plugins/vfox-groovy
grpc-health-probe             aqua:grpc-ecosystem/grpc-health-probe asdf:zufardhiyaulhaq/asdf-grpc-health-probe
grpcurl                       aqua:fullstorydev/grpcurl asdf:asdf-community/asdf-grpcurl
grype                         ubi:anchore/grype asdf:poikilotherm/asdf-grype
guile                         asdf:mise-plugins/mise-guile
gum                           aqua:charmbracelet/gum asdf:lwiechec/asdf-gum
gup                           aqua:nao1215/gup
gwvault                       aqua:GoodwayGroup/gwvault asdf:GoodwayGroup/asdf-gwvault
hadolint                      aqua:hadolint/hadolint ubi:hadolint/hadolint asdf:devlincashman/asdf-hadolint
hamler                        asdf:mise-plugins/mise-hamler
harper-cli                    aqua:Automattic/harper/harper-cli
harper-ls                     aqua:Automattic/harper/harper-ls
has                           aqua:kdabir/has asdf:sylvainmetayer/asdf-has
haskell                       asdf:mise-plugins/mise-haskell
hasura-cli                    aqua:hasura/graphql-engine asdf:gurukulkarni/asdf-hasura
haxe                          ubi:HaxeFoundation/haxe asdf:mise-plugins/mise-haxe
hcl2json                      aqua:tmccombs/hcl2json asdf:dex4er/asdf-hcl2json
hcloud                        aqua:hetznercloud/cli asdf:chessmango/asdf-hcloud
helix                         ubi:helix-editor/helix[extract_all=true]
helm                          aqua:helm/helm asdf:Antiarchitect/asdf-helm
helm-cr                       aqua:helm/chart-releaser asdf:Antiarchitect/asdf-helm-cr
helm-ct                       aqua:helm/chart-testing asdf:tablexi/asdf-helm-ct
helm-diff                     ubi:databus23/helm-diff[exe=diff,rename_exe=helm-diff] asdf:mise-plugins/mise-helm-diff
helm-docs                     aqua:norwoodj/helm-docs asdf:sudermanjr/asdf-helm-docs
helmfile                      ubi:helmfile/helmfile asdf:feniix/asdf-helmfile
helmsman                      ubi:Praqma/helmsman asdf:luisdavim/asdf-helmsman
helmwave                      aqua:helmwave/helmwave ubi:helmwave/helmwave
heroku                        asdf:mise-plugins/mise-heroku-cli
heroku-cli                    asdf:mise-plugins/mise-heroku-cli
hexyl                         aqua:sharkdp/hexyl ubi:sharkdp/hexyl
hey                           asdf:mise-plugins/mise-hey
hishtory                      ubi:ddworken/hishtory asdf:asdf-community/asdf-hishtory
hivemind                      ubi:DarthSim/hivemind go:github.com/DarthSim/hivemind
hk                            aqua:jdx/hk ubi:jdx/hk
hledger                       ubi:simonmichael/hledger asdf:airtonix/asdf-hledger
hledger-flow                  ubi:apauley/hledger-flow asdf:airtonix/asdf-hledger-flow
hls                           asdf:mise-plugins/mise-ghcup
hostctl                       aqua:guumaster/hostctl asdf:svenluijten/asdf-hostctl
htmlq                         aqua:mgdm/htmlq ubi:mgdm/htmlq
httpie-go                     aqua:nojima/httpie-go asdf:abatilo/asdf-httpie-go
hub                           aqua:mislav/hub asdf:mise-plugins/asdf-hub
hugo                          aqua:gohugoio/hugo ubi:gohugoio/hugo asdf:NeoHsu/asdf-hugo asdf:nklmilojevic/asdf-hugo
hugo-extended                 aqua:gohugoio/hugo/hugo-extended
hurl                          aqua:Orange-OpenSource/hurl asdf:raimon49/asdf-hurl
hwatch                        ubi:blacknon/hwatch asdf:chessmango/asdf-hwatch
hygen                         ubi:jondot/hygen asdf:brentjanderson/asdf-hygen
hyperfine                     aqua:sharkdp/hyperfine ubi:sharkdp/hyperfine asdf:volf52/asdf-hyperfine
iam-policy-json-to-terraform  aqua:flosell/iam-policy-json-to-terraform asdf:carlduevel/asdf-iam-policy-json-to-terraform
iamlive                       aqua:iann0036/iamlive asdf:chessmango/asdf-iamlive
ibmcloud                      asdf:mise-plugins/mise-ibmcloud
idris                         asdf:mise-plugins/mise-idris
idris2                        asdf:mise-plugins/mise-idris2
imagemagick                   asdf:mise-plugins/mise-imagemagick
imgpkg                        aqua:carvel-dev/imgpkg asdf:vmware-tanzu/asdf-carvel
infracost                     aqua:infracost/infracost asdf:dex4er/asdf-infracost
inlets                        aqua:inlets/inletsctl asdf:nlamirault/asdf-inlets
io                            asdf:mise-plugins/mise-io
istioctl                      aqua:istio/istio/istioctl asdf:virtualstaticvoid/asdf-istioctl
janet                         asdf:mise-plugins/mise-janet
java                          core:java
jb                            aqua:jsonnet-bundler/jsonnet-bundler asdf:beardix/asdf-jb
jbang                         asdf:mise-plugins/jbang-asdf
jc                            aqua:kellyjonbrazil/jc ubi:kellyjonbrazil/jc pipx:jc
jd                            aqua:josephburnett/jd ubi:josephburnett/jd go:github.com/josephburnett/jd
jfrog-cli                     asdf:mise-plugins/mise-jfrog-cli
jib                           asdf:mise-plugins/mise-jib
jiq                           aqua:fiatjaf/jiq asdf:chessmango/asdf-jiq
jj                            aqua:jj-vcs/jj ubi:jj-vcs/jj
jless                         aqua:PaulJuliusMartinez/jless asdf:jc00ke/asdf-jless
jmespath                      aqua:jmespath/jp asdf:skyzyx/asdf-jmespath
jmeter                        asdf:mise-plugins/mise-jmeter
jnv                           aqua:ynqa/jnv asdf:raimon49/asdf-jnv
jq                            aqua:jqlang/jq asdf:mise-plugins/asdf-jq
jqp                           aqua:noahgorstein/jqp asdf:https://gitlab.com/wt0f/asdf-jqp
jreleaser                     aqua:jreleaser/jreleaser asdf:joschi/asdf-jreleaser
jsonnet-bundler               aqua:jsonnet-bundler/jsonnet-bundler asdf:beardix/asdf-jb
jujutsu                       aqua:jj-vcs/jj ubi:jj-vcs/jj
julia                         asdf:mise-plugins/mise-julia
just                          ubi:casey/just asdf:olofvndrhr/asdf-just
jwt                           ubi:mike-engel/jwt-cli[exe=jwt] cargo:jwt-cli
jwtui                         ubi:jwt-rs/jwt-ui[exe=jwtui] cargo:jwt-ui
jx                            ubi:jenkins-x/jx asdf:vbehar/asdf-jx
k0sctl                        ubi:k0sproject/k0sctl asdf:Its-Alex/asdf-plugin-k0sctl
k2tf                          ubi:sl1pm4t/k2tf asdf:carlduevel/asdf-k2tf
k3d                           ubi:k3d-io/k3d asdf:spencergilbert/asdf-k3d
k3kcli                        ubi:rancher/k3k[tag_regex=v\d] asdf:xanmanning/asdf-k3kcli
k3s                           asdf:mise-plugins/mise-k3s
k3sup                         aqua:alexellis/k3sup asdf:cgroschupp/asdf-k3sup
k6                            ubi:grafana/k6 asdf:gr1m0h/asdf-k6
k9s                           aqua:derailed/k9s ubi:derailed/k9s asdf:looztra/asdf-k9s
kafka                         asdf:mise-plugins/mise-kafka
kafkactl                      aqua:deviceinsight/kafkactl asdf:anweber/asdf-kafkactl
kapp                          aqua:carvel-dev/kapp asdf:vmware-tanzu/asdf-carvel
kbld                          aqua:carvel-dev/kbld asdf:vmware-tanzu/asdf-carvel
kcat                          asdf:mise-plugins/mise-kcat
kcctl                         ubi:kcctl/kcctl asdf:joschi/asdf-kcctl
kcl                           aqua:kcl-lang/cli asdf:mise-plugins/mise-kcl
kconf                         aqua:particledecay/kconf asdf:particledecay/asdf-kconf
ki                            ubi:Kotlin/kotlin-interactive-shell[exe=ki] asdf:comdotlinux/asdf-ki
killport                      ubi:jkfran/killport
kind                          ubi:kubernetes-sigs/kind asdf:johnlayton/asdf-kind
kiota                         aqua:microsoft/kiota asdf:asdf-community/asdf-kiota
kn                            aqua:knative/client asdf:joke/asdf-kn
ko                            aqua:ko-build/ko asdf:zasdaym/asdf-ko
koka                          ubi:koka-lang/koka asdf:susurri/asdf-koka
kompose                       ubi:kubernetes/kompose asdf:technikhil314/asdf-kompose
kops                          aqua:kubernetes/kops asdf:Antiarchitect/asdf-kops
kotlin                        asdf:mise-plugins/mise-kotlin vfox:mise-plugins/vfox-kotlin
kp                            ubi:vmware-tanzu/kpack-cli[exe=kp] asdf:asdf-community/asdf-kpack-cli
kpack                         ubi:vmware-tanzu/kpack-cli[exe=kp] asdf:asdf-community/asdf-kpack-cli
kpt                           aqua:kptdev/kpt asdf:nlamirault/asdf-kpt
krab                          ubi:ohkrab/krab asdf:ohkrab/asdf-krab
krew                          aqua:kubernetes-sigs/krew asdf:bjw-s/asdf-krew
kscript                       ubi:kscripting/kscript asdf:edgelevel/asdf-kscript
ksops                         aqua:viaduct-ai/kustomize-sops ubi:viaduct-ai/kustomize-sops[exe=ksops] asdf:janpieper/asdf-ksops
ktlint                        aqua:pinterest/ktlint asdf:mise-plugins/mise-ktlint
kube-capacity                 aqua:robscott/kube-capacity asdf:looztra/asdf-kube-capacity
kube-code-generator           asdf:mise-plugins/mise-kube-code-generator
kube-controller-tools         ubi:kubernetes-sigs/controller-tools[exe=controller-gen] asdf:jimmidyson/asdf-kube-controller-tools
kube-credential-cache         aqua:ryodocx/kube-credential-cache asdf:ryodocx/kube-credential-cache
kube-linter                   aqua:stackrox/kube-linter asdf:devlincashman/asdf-kube-linter
kube-score                    aqua:zegl/kube-score asdf:bageljp/asdf-kube-score
kubebuilder                   aqua:kubernetes-sigs/kubebuilder asdf:virtualstaticvoid/asdf-kubebuilder
kubecm                        aqua:sunny0826/kubecm asdf:samhvw8/asdf-kubecm
kubecolor                     aqua:hidetatz/kubecolor asdf:dex4er/asdf-kubecolor
kubeconform                   aqua:yannh/kubeconform asdf:lirlia/asdf-kubeconform
kubectl                       aqua:kubernetes/kubectl asdf:asdf-community/asdf-kubectl
kubectl-bindrole              aqua:Ladicle/kubectl-rolesum asdf:looztra/asdf-kubectl-bindrole
kubectl-convert               aqua:kubernetes/kubectl-convert asdf:iul1an/asdf-kubectl-convert
kubectl-kots                  aqua:replicatedhq/kots asdf:ganta/asdf-kubectl-kots
kubectl-kuttl                 aqua:kudobuilder/kuttl asdf:jimmidyson/asdf-kuttl
kubectl-rolesum               aqua:Ladicle/kubectl-rolesum asdf:looztra/asdf-kubectl-bindrole
kubectx                       aqua:ahmetb/kubectx asdf:https://gitlab.com/wt0f/asdf-kubectx
kubefedctl                    aqua:kubernetes-retired/kubefed asdf:kvokka/asdf-kubefedctl
kubefirst                     ubi:konstructio/kubefirst asdf:Claywd/asdf-kubefirst
kubelogin                     aqua:int128/kubelogin
kubemqctl                     aqua:kubemq-io/kubemqctl asdf:johnlayton/asdf-kubemqctl
kubens                        aqua:ahmetb/kubectx/kubens
kubent                        aqua:doitintl/kube-no-trouble asdf:virtualstaticvoid/asdf-kubent
kubeone                       aqua:kubermatic/kubeone aqua:kubermatic/kubeone
kubergrunt                    aqua:gruntwork-io/kubergrunt asdf:NeoHsu/asdf-kubergrunt
kubeseal                      aqua:bitnami-labs/sealed-secrets asdf:stefansedich/asdf-kubeseal
kubesec                       aqua:controlplaneio/kubesec asdf:vitalis/asdf-kubesec
kubeshark                     aqua:kubeshark/kubeshark asdf:carnei-ro/asdf-kubeshark
kubespy                       aqua:pulumi/kubespy asdf:jfreeland/asdf-kubespy
kubeval                       aqua:instrumenta/kubeval asdf:stefansedich/asdf-kubeval
kubevela                      aqua:kubevela/kubevela asdf:gustavclausen/asdf-kubevela
kubie                         aqua:sbstp/kubie asdf:johnhamelink/asdf-kubie
kustomize                     aqua:kubernetes-sigs/kustomize asdf:Banno/asdf-kustomize
kuttl                         aqua:kudobuilder/kuttl asdf:jimmidyson/asdf-kuttl
kwokctl                       aqua:kubernetes-sigs/kwok/kwokctl
kwt                           aqua:carvel-dev/kwt asdf:vmware-tanzu/asdf-carvel
kyverno                       aqua:kyverno/kyverno asdf:https://github.com/hobaen/asdf-kyverno-cli.git
lab                           aqua:zaquestion/lab asdf:particledecay/asdf-lab
lane                          ubi:CodeReaper/lane asdf:CodeReaper/asdf-lane
lazydocker                    aqua:jesseduffield/lazydocker ubi:jesseduffield/lazydocker
lazygit                       aqua:jesseduffield/lazygit asdf:nklmilojevic/asdf-lazygit
lazyjournal                   aqua:Lifailon/lazyjournal ubi:Lifailon/lazyjournal
lean                          asdf:mise-plugins/mise-lean
lefthook                      aqua:evilmartians/lefthook ubi:evilmartians/lefthook asdf:jtzero/asdf-lefthook
leiningen                     asdf:mise-plugins/mise-lein
levant                        aqua:hashicorp/levant asdf:mise-plugins/mise-hashicorp
lfe                           asdf:mise-plugins/mise-lfe
libsql-server                 ubi:tursodatabase/libsql[tag_regex=libsql-server,exe=sqld] asdf:jonasb/asdf-libsql-server
license-plist                 ubi:mono0926/LicensePlist[exe=license-plist] asdf:MacPaw/asdf-license-plist
lima                          aqua:lima-vm/lima asdf:CrouchingMuppet/asdf-lima
linkerd                       aqua:linkerd/linkerd2 asdf:kforsthoevel/asdf-linkerd
liqoctl                       aqua:liqotech/liqo asdf:pdemagny/asdf-liqoctl
liquibase                     asdf:mise-plugins/mise-liquibase
litestream                    aqua:benbjohnson/litestream asdf:threkk/asdf-litestream
llvm-objcopy                  asdf:mise-plugins/mise-llvm
llvm-objdump                  asdf:mise-plugins/mise-llvm
localstack                    ubi:localstack/localstack-cli[exe=localstack]
logtalk                       asdf:mise-plugins/mise-logtalk
loki-logcli                   aqua:grafana/loki/logcli asdf:comdotlinux/asdf-loki-logcli
ls-lint                       aqua:loeffel-io/ls-lint asdf:Ameausoone/asdf-ls-lint
lsd                           aqua:lsd-rs/lsd asdf:mise-plugins/asdf-lsd
lua                           asdf:mise-plugins/mise-lua
lua-language-server           aqua:LuaLS/lua-language-server asdf:bellini666/asdf-lua-language-server
luajit                        asdf:mise-plugins/mise-luaJIT
luau                          aqua:luau-lang/luau
lychee                        aqua:lycheeverse/lychee
maestro                       ubi:mobile-dev-inc/maestro asdf:dotanuki-labs/asdf-maestro
mage                          aqua:magefile/mage asdf:mathew-fleisch/asdf-mage
make                          asdf:mise-plugins/mise-make
mani                          ubi:alajmo/mani asdf:anweber/asdf-mani
mark                          ubi:kovetskiy/mark asdf:jfreeland/asdf-mark
markdownlint-cli2             npm:markdownlint-cli2 asdf:paulo-ferraz-oliveira/asdf-markdownlint-cli2
marksman                      aqua:artempyanykh/marksman
marp-cli                      aqua:marp-team/marp-cli asdf:xataz/asdf-marp-cli
mask                          aqua:jacobdeichert/mask asdf:aaaaninja/asdf-mask
maven                         asdf:mise-plugins/mise-maven vfox:mise-plugins/vfox-maven
mc                            asdf:mise-plugins/mise-mc
mdbook                        aqua:rust-lang/mdBook asdf:cipherstash/asdf-mdbook
mdbook-linkcheck              ubi:Michael-F-Bryan/mdbook-linkcheck asdf:mise-plugins/mise-mdbook-linkcheck
melange                       aqua:chainguard-dev/melange asdf:omissis/asdf-melange
melt                          ubi:charmbracelet/melt asdf:chessmango/asdf-melt
memcached                     asdf:mise-plugins/mise-memcached
mercury                       asdf:mise-plugins/mise-mercury
meson                         asdf:mise-plugins/mise-meson
micronaut                     asdf:mise-plugins/mise-micronaut
mill                          asdf:mise-plugins/mise-mill
mimirtool                     aqua:grafana/mimir/mimirtool asdf:asdf-community/asdf-mimirtool
minify                        aqua:tdewolff/minify asdf:axilleas/asdf-minify
minikube                      aqua:kubernetes/minikube asdf:alvarobp/asdf-minikube
minio                         asdf:mise-plugins/mise-minio
minishift                     aqua:minishift/minishift asdf:sqtran/asdf-minishift
minisign                      aqua:jedisct1/minisign
mint                          ubi:mint-lang/mint asdf:mint-lang/asdf-mint
mirrord                       ubi:metalbear-co/mirrord asdf:metalbear-co/asdf-mirrord
mitmproxy                     asdf:mise-plugins/mise-mitmproxy
mkcert                        ubi:FiloSottile/mkcert asdf:salasrod/asdf-mkcert
mlton                         asdf:mise-plugins/mise-mlton
mockery                       aqua:vektra/mockery asdf:cabify/asdf-mockery
mockolo                       ubi:uber/mockolo asdf:mise-plugins/mise-mockolo
mold                          ubi:rui314/mold
monarch                       asdf:mise-plugins/mise-monarch
mongodb                       asdf:mise-plugins/mise-mongodb
mongosh                       ubi:mongodb-js/mongosh asdf:itspngu/asdf-mongosh
mprocs                        ubi:pvolok/mprocs
mssqldef                      aqua:sqldef/sqldef/mssqldef
mutanus                       asdf:mise-plugins/mise-mutanus
mvnd                          aqua:apache/maven-mvnd asdf:joschi/asdf-mvnd
mysql                         asdf:mise-plugins/mise-mysql
mysqldef                      aqua:sqldef/sqldef/mysqldef
nancy                         aqua:sonatype-nexus-community/nancy asdf:iilyak/asdf-nancy
nano                          asdf:mise-plugins/mise-nano
nasm                          asdf:mise-plugins/mise-nasm
navi                          aqua:denisidoro/navi ubi:denisidoro/navi
neko                          ubi:HaxeFoundation/neko asdf:asdf-community/asdf-neko
neonctl                       aqua:neondatabase/neonctl ubi:neondatabase/neonctl
neovim                        aqua:neovim/neovim asdf:richin13/asdf-neovim
nerdctl                       aqua:containerd/nerdctl asdf:dmpe/asdf-nerdctl
newrelic                      ubi:newrelic/newrelic-cli[exe=newrelic] asdf:NeoHsu/asdf-newrelic-cli
newrelic-cli                  ubi:newrelic/newrelic-cli[exe=newrelic] asdf:NeoHsu/asdf-newrelic-cli
nfpm                          aqua:goreleaser/nfpm ubi:goreleaser/nfpm asdf:ORCID/asdf-nfpm
nim                           asdf:mise-plugins/mise-nim
ninja                         aqua:ninja-build/ninja asdf:asdf-community/asdf-ninja
node                          core:node
nomad                         aqua:hashicorp/nomad asdf:mise-plugins/mise-hashicorp
nomad-pack                    asdf:mise-plugins/mise-hashicorp
notation                      aqua:notaryproject/notation asdf:bodgit/asdf-notation
nova                          aqua:FairwindsOps/nova asdf:elementalvoid/asdf-nova
nsc                           ubi:nats-io/nsc asdf:dex4er/asdf-nsc
numbat                        ubi:sharkdp/numbat
oapi-codegen                  go:github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen asdf:dylanrayboss/asdf-oapi-codegen
oauth2c                       ubi:cloudentity/oauth2c
oc                            asdf:mise-plugins/mise-oc
ocaml                         asdf:mise-plugins/mise-ocaml
oci                           asdf:mise-plugins/mise-oci
octosql                       ubi:cube2222/octosql
odin                          ubi:odin-lang/Odin[exe=odin] asdf:jtakakura/asdf-odin
odo                           aqua:redhat-developer/odo asdf:rm3l/asdf-odo
okta-aws                      aqua:okta/okta-aws-cli asdf:bennythejudge/asdf-plugin-okta-aws-cli
okta-aws-cli                  aqua:okta/okta-aws-cli asdf:bennythejudge/asdf-plugin-okta-aws-cli
okteto                        aqua:okteto/okteto asdf:BradenM/asdf-okteto
ollama                        aqua:ollama/ollama asdf:virtualstaticvoid/asdf-ollama
om                            aqua:pivotal-cf/om asdf:mise-plugins/tanzu-plug-in-for-asdf
onyx                          ubi:onyx-lang/onyx asdf:jtakakura/asdf-onyx
op                            aqua:1password/cli asdf:mise-plugins/mise-1password-cli
opa                           aqua:open-policy-agent/opa asdf:tochukwuvictor/asdf-opa
opam                          ubi:ocaml/opam asdf:asdf-community/asdf-opam
openbao                       ubi:openbao/openbao[exe=bao]
openfaas-cli                  aqua:openfaas/faas-cli asdf:zekker6/asdf-faas-cli
openresty                     asdf:mise-plugins/mise-openresty
opensearch                    asdf:mise-plugins/mise-opensearch
opensearch-cli                ubi:opensearch-project/opensearch-cli asdf:mise-plugins/mise-opensearch-cli
openshift-install             asdf:mise-plugins/mise-openshift-install
opentofu                      aqua:opentofu/opentofu ubi:opentofu/opentofu[exe=tofu] asdf:virtualroot/asdf-opentofu
operator-sdk                  aqua:operator-framework/operator-sdk asdf:Medium/asdf-operator-sdk
opsgenie-lamp                 ubi:opsgenie/opsgenie-lamp asdf:mise-plugins/mise-opsgenie-lamp
oras                          aqua:oras-project/oras asdf:bodgit/asdf-oras
osqueryi                      asdf:mise-plugins/mise-osqueryi
overmind                      ubi:DarthSim/overmind go:github.com/DarthSim/overmind/v2
oxipng                        aqua:shssoichiro/oxipng
pachctl                       aqua:pachyderm/pachyderm asdf:abatilo/asdf-pachctl
pack                          aqua:buildpacks/pack asdf:johnlayton/asdf-buildpack
packer                        aqua:hashicorp/packer asdf:mise-plugins/mise-hashicorp
pandoc                        ubi:jgm/pandoc asdf:Fbrisset/asdf-pandoc
patat                         ubi:jaspervdj/patat asdf:airtonix/asdf-patat
pdm                           pipx:pdm asdf:1oglop1/asdf-pdm
peco                          aqua:peco/peco asdf:asdf-community/asdf-peco
periphery                     aqua:peripheryapp/periphery asdf:mise-plugins/mise-periphery
perl                          aqua:skaji/relocatable-perl asdf:ouest/asdf-perl
php                           asdf:mise-plugins/asdf-php vfox:mise-plugins/vfox-php
pinact                        aqua:suzuki-shunsuke/pinact ubi:suzuki-shunsuke/pinact
pint                          aqua:cloudflare/pint asdf:sam-burrell/asdf-pint
pipectl                       aqua:pipe-cd/pipecd/pipectl asdf:pipe-cd/asdf-pipectl
pipelight                     asdf:mise-plugins/mise-pipelight
pipenv                        asdf:mise-plugins/mise-pipenv
pipx                          asdf:mise-plugins/mise-pipx
pitchfork                     ubi:jdx/pitchfork
pivnet                        aqua:pivotal-cf/pivnet-cli asdf:mise-plugins/tanzu-plug-in-for-asdf
pixi                          ubi:prefix-dev/pixi
pkl                           aqua:apple/pkl asdf:mise-plugins/asdf-pkl
please                        aqua:thought-machine/please asdf:asdf-community/asdf-please
pluto                         ubi:FairwindsOps/pluto asdf:FairwindsOps/asdf-pluto
pnpm                          aqua:pnpm/pnpm asdf:jonathanmorley/asdf-pnpm
podman                        ubi:containers/podman asdf:tvon/asdf-podman
poetry                        asdf:mise-plugins/mise-poetry
polaris                       aqua:FairwindsOps/polaris asdf:particledecay/asdf-polaris
popeye                        aqua:derailed/popeye asdf:nlamirault/asdf-popeye
postgis                       asdf:mise-plugins/mise-postgis
postgres                      asdf:mise-plugins/mise-postgres
powerline-go                  aqua:justjanne/powerline-go ubi:justjanne/powerline-go asdf:dex4er/asdf-powerline-go
powerpipe                     aqua:turbot/powerpipe asdf:jc00ke/asdf-powerpipe
powershell-core               aqua:PowerShell/PowerShell asdf:daveneeley/asdf-powershell-core
pre-commit                    aqua:pre-commit/pre-commit asdf:jonathanmorley/asdf-pre-commit
promtool                      aqua:prometheus/prometheus asdf:asdf-community/asdf-promtool
protobuf                      aqua:protocolbuffers/protobuf/protoc asdf:paxosglobal/asdf-protoc
protoc                        aqua:protocolbuffers/protobuf/protoc asdf:paxosglobal/asdf-protoc
protoc-gen-connect-go         go:connectrpc.com/connect/cmd/protoc-gen-connect-go asdf:dylanrayboss/asdf-protoc-gen-connect-go
protoc-gen-go                 aqua:protocolbuffers/protobuf-go/protoc-gen-go asdf:pbr0ck3r/asdf-protoc-gen-go
protoc-gen-go-grpc            aqua:grpc/grpc-go/protoc-gen-go-grpc asdf:pbr0ck3r/asdf-protoc-gen-go-grpc
protoc-gen-grpc-web           asdf:mise-plugins/mise-protoc-gen-grpc-web
protoc-gen-js                 ubi:protocolbuffers/protobuf-javascript[exe=protoc-gen-js] asdf:pbr0ck3r/asdf-protoc-gen-js
protoc-gen-validate           aqua:bufbuild/protoc-gen-validate go:github.com/envoyproxy/protoc-gen-validate
protolint                     aqua:yoheimuta/protolint asdf:spencergilbert/asdf-protolint
protonge                      asdf:mise-plugins/mise-protonge
psc-package                   ubi:purescript/psc-package asdf:nsaunders/asdf-psc-package
psqldef                       aqua:sqldef/sqldef/psqldef
pulumi                        aqua:pulumi/pulumi asdf:canha/asdf-pulumi
purerl                        ubi:purerl/purerl asdf:GoNZooo/asdf-purerl
purescript                    ubi:purescript/purescript[exe=purs] asdf:jrrom/asdf-purescript
purty                         asdf:mise-plugins/mise-purty
python                        core:python
qdns                          ubi:natesales/q asdf:moritz-makandra/asdf-plugin-qdns
qsv                           ubi:dathere/qsv asdf:vjda/asdf-qsv
quarkus                       asdf:mise-plugins/mise-quarkus
r                             asdf:mise-plugins/mise-r
rabbitmq                      asdf:mise-plugins/asdf-rabbitmq
racket                        asdf:mise-plugins/mise-racket
raku                          asdf:mise-plugins/mise-raku
rancher                       aqua:rancher/cli asdf:abinet/asdf-rancher
rbac-lookup                   aqua:FairwindsOps/rbac-lookup asdf:looztra/asdf-rbac-lookup
rclone                        aqua:rclone/rclone ubi:rclone/rclone asdf:johnlayton/asdf-rclone
rebar                         asdf:mise-plugins/mise-rebar
reckoner                      ubi:FairwindsOps/reckoner asdf:FairwindsOps/asdf-reckoner
redis                         asdf:mise-plugins/mise-redis
redis-cli                     asdf:mise-plugins/mise-redis-cli
redo                          ubi:barthr/redo asdf:chessmango/asdf-redo
reg                           aqua:genuinetools/reg asdf:looztra/asdf-reg
regal                         aqua:StyraInc/regal asdf:mise-plugins/mise-regal
regctl                        aqua:regclient/regclient/regctl asdf:ORCID/asdf-regctl
regsync                       aqua:regclient/regclient/regsync asdf:rsrchboy/asdf-regsync
restic                        aqua:restic/restic asdf:xataz/asdf-restic
restish                       ubi:danielgtaylor/restish go:github.com/danielgtaylor/restish
revive                        aqua:mgechev/revive asdf:bjw-s/asdf-revive
rg                            aqua:BurntSushi/ripgrep ubi:BurntSushi/ripgrep[exe=rg] asdf:https://gitlab.com/wt0f/asdf-ripgrep
richgo                        aqua:kyoh86/richgo asdf:paxosglobal/asdf-richgo
ripgrep                       aqua:BurntSushi/ripgrep ubi:BurntSushi/ripgrep[exe=rg] asdf:https://gitlab.com/wt0f/asdf-ripgrep
ripgrep-all                   aqua:phiresky/ripgrep-all
ripsecrets                    aqua:sirwart/ripsecrets asdf:https://github.com/boris-smidt-klarrio/asdf-ripsecrets
rke                           aqua:rancher/rke asdf:particledecay/asdf-rke
rlwrap                        asdf:mise-plugins/mise-rlwrap
ruby                          core:ruby
ruff                          aqua:astral-sh/ruff ubi:astral-sh/ruff asdf:simhem/asdf-ruff
rust                          core:rust asdf:code-lever/asdf-rust
rust-analyzer                 aqua:rust-lang/rust-analyzer asdf:Xyven1/asdf-rust-analyzer
rustic                        ubi:rustic-rs/rustic
rye                           aqua:astral-sh/rye asdf:Azuki-bar/asdf-rye
saml2aws                      aqua:Versent/saml2aws asdf:elementalvoid/asdf-saml2aws
sampler                       aqua:sqshq/sampler ubi:sqshq/sampler
sbcl                          asdf:mise-plugins/mise-sbcl
sbt                           asdf:mise-plugins/mise-sbt
scala                         asdf:mise-plugins/mise-scala vfox:mise-plugins/vfox-scala
scala-cli                     ubi:VirtusLab/scala-cli asdf:mise-plugins/mise-scala-cli
scaleway                      aqua:scaleway/scaleway-cli asdf:albarralnunez/asdf-plugin-scaleway-cli
scaleway-cli                  aqua:scaleway/scaleway-cli asdf:albarralnunez/asdf-plugin-scaleway-cli
scalingo-cli                  aqua:Scalingo/cli asdf:brandon-welsch/asdf-scalingo-cli
scarb                         ubi:software-mansion/scarb asdf:software-mansion/asdf-scarb
sccache                       ubi:mozilla/sccache asdf:emersonmx/asdf-sccache
schemacrawler                 asdf:mise-plugins/mise-schemacrawler
scie-pants                    ubi:pantsbuild/scie-pants asdf:robzr/asdf-scie-pants
sd                            aqua:chmln/sd
seed7                         asdf:mise-plugins/mise-seed7
semgrep                       asdf:mise-plugins/mise-semgrep
semtag                        asdf:mise-plugins/mise-semtag
semver                        aqua:fsaintjacques/semver-tool asdf:mathew-fleisch/asdf-semver
sentinel                      asdf:mise-plugins/mise-hashicorp
sentry                        ubi:getsentry/sentry-cli
sentry-cli                    ubi:getsentry/sentry-cli
serf                          asdf:mise-plugins/mise-hashicorp
serverless                    asdf:mise-plugins/mise-serverless
setup-envtest                 asdf:mise-plugins/mise-setup-envtest
shell2http                    aqua:msoap/shell2http asdf:ORCID/asdf-shell2http
shellcheck                    ubi:koalaman/shellcheck aqua:koalaman/shellcheck asdf:luizm/asdf-shellcheck
shellspec                     aqua:shellspec/shellspec asdf:poikilotherm/asdf-shellspec
shfmt                         aqua:mvdan/sh asdf:luizm/asdf-shfmt
shorebird                     asdf:mise-plugins/mise-shorebird
signadot                      ubi:signadot/cli[exe=signadot]
sinker                        aqua:plexsystems/sinker asdf:elementalvoid/asdf-sinker
skaffold                      aqua:GoogleContainerTools/skaffold asdf:nklmilojevic/asdf-skaffold
skate                         aqua:charmbracelet/skate asdf:chessmango/asdf-skate
skeema                        aqua:skeema/skeema ubi:skeema/skeema
sloth                         aqua:slok/sloth asdf:slok/asdf-sloth
slsa-verifier                 ubi:slsa-framework/slsa-verifier
smithy                        asdf:mise-plugins/mise-smithy
smlnj                         asdf:mise-plugins/mise-smlnj
snyk                          aqua:snyk/cli asdf:nirfuchs/asdf-snyk
soft-serve                    ubi:charmbracelet/soft-serve[exe=soft] asdf:chessmango/asdf-soft-serve
solidity                      ubi:ethereum/solidity[exe=solc] asdf:diegodorado/asdf-solidity
sonobuoy                      ubi:vmware-tanzu/sonobuoy asdf:Nick-Triller/asdf-sonobuoy
sops                          aqua:getsops/sops ubi:getsops/sops asdf:mise-plugins/mise-sops
sopstool                      aqua:ibotta/sopstool asdf:elementalvoid/asdf-sopstool
soracom                       ubi:soracom/soracom-cli asdf:gr1m0h/asdf-soracom
sourcery                      asdf:mise-plugins/mise-sourcery
spacectl                      aqua:spacelift-io/spacectl asdf:bodgit/asdf-spacectl
spago                         ubi:purescript/spago asdf:jrrom/asdf-spago
spark                         aqua:apache/spark asdf:mise-plugins/mise-spark
spectral                      aqua:stoplightio/spectral asdf:vbyrd/asdf-spectral
spin                          aqua:spinnaker/spin asdf:pavloos/asdf-spin
spring-boot                   asdf:mise-plugins/mise-spring-boot
spruce                        aqua:geofffranks/spruce asdf:woneill/asdf-spruce
sqlite                        asdf:mise-plugins/mise-sqlite
sqlite3def                    aqua:sqldef/sqldef/sqlite3def
sshi                          aqua:aakso/ssh-inscribe/sshi
sshuttle                      asdf:mise-plugins/mise-sshuttle
stack                         aqua:commercialhaskell/stack asdf:mise-plugins/mise-ghcup
starboard                     aqua:aquasecurity/starboard asdf:zufardhiyaulhaq/asdf-starboard
starknet-foundry              ubi:foundry-rs/starknet-foundry[exe=snforge]
starknet-foundry-sncast       ubi:foundry-rs/starknet-foundry[exe=sncast]
starship                      ubi:starship/starship asdf:gr1m0h/asdf-starship
staticcheck                   aqua:dominikh/go-tools/staticcheck asdf:pbr0ck3r/asdf-staticcheck
steampipe                     aqua:turbot/steampipe asdf:carnei-ro/asdf-steampipe
step                          aqua:smallstep/cli asdf:log2/asdf-step
stern                         aqua:stern/stern asdf:looztra/asdf-stern
stripe                        aqua:stripe/stripe-cli asdf:offbyone/asdf-stripe
stripe-cli                    aqua:stripe/stripe-cli asdf:offbyone/asdf-stripe
stylua                        aqua:JohnnyMorganz/StyLua asdf:jc00ke/asdf-stylua
sui                           ubi:MystenLabs/sui asdf:placeholder-soft/asdf-sui
superfile                     aqua:yorukot/superfile
sver                          aqua:mitoma/sver asdf:robzr/asdf-sver
svu                           aqua:caarlos0/svu asdf:asdf-community/asdf-svu
swag                          aqua:swaggo/swag asdf:behoof4mind/asdf-swag
swift                         core:swift
swift-package-list            asdf:mise-plugins/mise-swift-package-list
swiftformat                   asdf:mise-plugins/mise-swiftformat
swiftgen                      asdf:mise-plugins/mise-swiftgen
swiftlint                     aqua:realm/SwiftLint asdf:mise-plugins/mise-swiftlint
swiprolog                     asdf:mise-plugins/mise-swiprolog
syft                          aqua:anchore/syft asdf:davidgp1701/asdf-syft
talhelper                     aqua:budimanjojo/talhelper asdf:bjw-s/asdf-talhelper
talos                         ubi:siderolabs/talos[exe=talosctl] asdf:particledecay/asdf-talos
talosctl                      ubi:siderolabs/talos[exe=talosctl] asdf:bjw-s/asdf-talosctl
tanka                         aqua:grafana/tanka asdf:trotttrotttrott/asdf-tanka
tanzu                         asdf:mise-plugins/tanzu-plug-in-for-asdf
taplo                         aqua:tamasfe/taplo/full ubi:tamasfe/taplo[matching=full] cargo:taplo-cli
task                          ubi:go-task/task asdf:particledecay/asdf-task
tctl                          aqua:temporalio/tctl asdf:eko/asdf-tctl
tekton                        aqua:tektoncd/cli asdf:johnhamelink/asdf-tekton-cli
tekton-cli                    aqua:tektoncd/cli asdf:johnhamelink/asdf-tekton-cli
teleport-community            asdf:mise-plugins/mise-teleport-community
teleport-ent                  asdf:mise-plugins/mise-teleport-ent
telepresence                  aqua:telepresenceio/telepresence asdf:pirackr/asdf-telepresence
television                    aqua:alexpasmantier/television
teller                        aqua:tellerops/teller asdf:pdemagny/asdf-teller
temporal                      aqua:temporalio/temporal asdf:asdf-community/asdf-temporal
terradozer                    aqua:jckuester/terradozer asdf:chessmango/asdf-terradozer
terraform                     aqua:hashicorp/terraform asdf:mise-plugins/mise-hashicorp vfox:mise-plugins/vfox-terraform
terraform-docs                aqua:terraform-docs/terraform-docs asdf:looztra/asdf-terraform-docs
terraform-ls                  aqua:hashicorp/terraform-ls asdf:mise-plugins/mise-hashicorp
terraform-lsp                 aqua:juliosueiras/terraform-lsp asdf:bartlomiejdanek/asdf-terraform-lsp
terraform-validator           aqua:thazelart/terraform-validator asdf:looztra/asdf-terraform-validator
terraformer                   aqua:GoogleCloudPlatform/terraformer asdf:gr1m0h/asdf-terraformer
terragrunt                    aqua:gruntwork-io/terragrunt asdf:gruntwork-io/asdf-terragrunt
terramate                     aqua:terramate-io/terramate asdf:martinlindner/asdf-terramate
terrascan                     aqua:tenable/terrascan asdf:hpdobrica/asdf-terrascan
tf-summarize                  aqua:dineshba/tf-summarize asdf:adamcrews/asdf-tf-summarize
tfc-agent                     asdf:mise-plugins/mise-hashicorp
tfctl                         aqua:flux-iac/tofu-controller/tfctl asdf:deas/asdf-tfctl
tfenv                         aqua:tfutils/tfenv asdf:carlduevel/asdf-tfenv
tflint                        aqua:terraform-linters/tflint ubi:terraform-linters/tflint asdf:skyzyx/asdf-tflint
tfmigrate                     aqua:minamijoyo/tfmigrate asdf:dex4er/asdf-tfmigrate
tfnotify                      aqua:mercari/tfnotify asdf:jnavarrof/asdf-tfnotify
tfsec                         aqua:aquasecurity/tfsec asdf:woneill/asdf-tfsec
tfstate-lookup                aqua:fujiwara/tfstate-lookup asdf:carnei-ro/asdf-tfstate-lookup
tfswitch                      ubi:warrensbox/terraform-switcher[exe=tfswitch] asdf:iul1an/asdf-tfswitch
tfupdate                      aqua:minamijoyo/tfupdate asdf:yuokada/asdf-tfupdate
thrift                        asdf:mise-plugins/mise-thrift
tilt                          aqua:tilt-dev/tilt asdf:eaceaser/asdf-tilt
timoni                        aqua:stefanprodan/timoni asdf:Smana/asdf-timoni
tiny                          asdf:mise-plugins/mise-tiny
tinytex                       asdf:mise-plugins/mise-tinytex
titan                         ubi:titan-data/titan asdf:gabitchov/asdf-titan
tmux                          asdf:mise-plugins/mise-tmux
tokei                         ubi:XAMPPRocky/tokei asdf:gasuketsu/asdf-tokei
tomcat                        asdf:mise-plugins/mise-tomcat
tonnage                       ubi:elementalvoid/tonnage asdf:elementalvoid/asdf-tonnage
traefik                       ubi:traefik/traefik asdf:Dabolus/asdf-traefik
transifex                     ubi:transifex/cli[exe=tx] asdf:ORCID/asdf-transifex
trdsql                        aqua:noborus/trdsql asdf:johnlayton/asdf-trdsql
tree-sitter                   aqua:tree-sitter/tree-sitter asdf:ivanvc/asdf-tree-sitter
tridentctl                    aqua:NetApp/trident/tridentctl asdf:asdf-community/asdf-tridentctl
trivy                         aqua:aquasecurity/trivy asdf:zufardhiyaulhaq/asdf-trivy
tsuru                         ubi:tsuru/tsuru-client[exe=tsuru] asdf:virtualstaticvoid/asdf-tsuru
ttyd                          aqua:tsl0922/ttyd asdf:ivanvc/asdf-ttyd
tuist                         asdf:mise-plugins/mise-tuist
tusd                          ubi:tus/tusd
typos                         aqua:crate-ci/typos asdf:aschiavon91/asdf-typos
typst                         aqua:typst/typst asdf:stephane-klein/asdf-typst
uaa                           ubi:cloudfoundry/uaa-cli[exe=uaa] asdf:mise-plugins/tanzu-plug-in-for-asdf
uaa-cli                       ubi:cloudfoundry/uaa-cli[exe=uaa] asdf:mise-plugins/tanzu-plug-in-for-asdf
ubi                           aqua:houseabsolute/ubi ubi:houseabsolute/ubi
unison                        ubi:unisonweb/unison asdf:susurri/asdf-unison
upctl                         aqua:UpCloudLtd/upcloud-cli
updatecli                     aqua:updatecli/updatecli asdf:updatecli/asdf-updatecli
upt                           ubi:sigoden/upt asdf:ORCID/asdf-upt
upx                           aqua:upx/upx asdf:jimmidyson/asdf-upx
usage                         ubi:jdx/usage asdf:jdx/mise-usage
usql                          aqua:xo/usql asdf:itspngu/asdf-usql
uv                            aqua:astral-sh/uv asdf:asdf-community/asdf-uv
v                             asdf:mise-plugins/mise-v
vacuum                        aqua:daveshanley/vacuum
vale                          aqua:errata-ai/vale asdf:pdemagny/asdf-vale
vals                          aqua:helmfile/vals asdf:dex4er/asdf-vals
vault                         aqua:hashicorp/vault asdf:mise-plugins/mise-hashicorp
vcluster                      aqua:loft-sh/vcluster asdf:https://gitlab.com/wt0f/asdf-vcluster
velad                         ubi:kubevela/velad asdf:mise-plugins/mise-velad
velero                        aqua:vmware-tanzu/velero asdf:looztra/asdf-velero
vendir                        aqua:carvel-dev/vendir asdf:vmware-tanzu/asdf-carvel
venom                         aqua:ovh/venom asdf:aabouzaid/asdf-venom
vhs                           aqua:charmbracelet/vhs asdf:chessmango/asdf-vhs
viddy                         aqua:sachaos/viddy asdf:ryodocx/asdf-viddy
vim                           asdf:mise-plugins/mise-vim
virtualos                     asdf:mise-plugins/mise-virtualos
vivid                         ubi:sharkdp/vivid
vlang                         vfox:mise-plugins/vfox-vlang
vlt                           asdf:mise-plugins/mise-hashicorp
vultr                         ubi:vultr/vultr-cli asdf:ikuradon/asdf-vultr-cli
vultr-cli                     ubi:vultr/vultr-cli asdf:ikuradon/asdf-vultr-cli
wait-for-gh-rate-limit        ubi:jdx/wait-for-gh-rate-limit
wasi-sdk                      asdf:mise-plugins/mise-wasi-sdk
wasm3                         asdf:mise-plugins/mise-wasm3
wasm4                         ubi:aduros/wasm4[exe=w4] asdf:jtakakura/asdf-wasm4
wasmer                        aqua:wasmerio/wasmer asdf:tachyonicbytes/asdf-wasmer
wasmtime                      aqua:bytecodealliance/wasmtime asdf:tachyonicbytes/asdf-wasmtime
watchexec                     ubi:watchexec/watchexec asdf:nyrst/asdf-watchexec
waypoint                      aqua:hashicorp/waypoint asdf:mise-plugins/mise-hashicorp
weave-gitops                  ubi:weaveworks/weave-gitops[exe=gitops] asdf:deas/asdf-weave-gitops
websocat                      aqua:vi/websocat asdf:bdellegrazie/asdf-websocat
wren                          ubi:wren-lang/wren-cli[exe=wren_cli] asdf:jtakakura/asdf-wren-cli
wren-cli                      ubi:wren-lang/wren-cli[exe=wren_cli] asdf:jtakakura/asdf-wren-cli
wrk                           asdf:mise-plugins/mise-wrk
wtfutil                       aqua:wtfutil/wtf asdf:NeoHsu/asdf-wtfutil
xc                            aqua:joerdav/xc asdf:airtonix/asdf-xc
xcbeautify                    ubi:cpisciotta/xcbeautify asdf:mise-plugins/asdf-xcbeautify
xchtmlreport                  asdf:mise-plugins/mise-xchtmlreport
xcodegen                      asdf:mise-plugins/mise-xcodegen
xcresultparser                asdf:mise-plugins/mise-xcresultparser
xh                            aqua:ducaale/xh ubi:ducaale/xh asdf:NeoHsu/asdf-xh
yadm                          asdf:mise-plugins/mise-yadm
yamlfmt                       aqua:google/yamlfmt asdf:mise-plugins/asdf-yamlfmt
yamllint                      pipx:yamllint asdf:ericcornelissen/asdf-yamllint
yamlscript                    ubi:yaml/yamlscript[exe=ys,matching=ys-] asdf:mise-plugins/mise-yamlscript
yarn                          asdf:mise-plugins/mise-yarn
yay                           asdf:mise-plugins/mise-yay
yazi                          aqua:sxyazi/yazi
yj                            ubi:sclevine/yj asdf:ryodocx/asdf-yj
yor                           aqua:bridgecrewio/yor asdf:ordinaryexperts/asdf-yor
youtube-dl                    asdf:mise-plugins/mise-youtube-dl
yq                            aqua:mikefarah/yq ubi:mikefarah/yq asdf:sudermanjr/asdf-yq
yt-dlp                        ubi:yt-dlp/yt-dlp asdf:duhow/asdf-yt-dlp
ytt                           aqua:carvel-dev/ytt asdf:vmware-tanzu/asdf-carvel
zbctl                         asdf:mise-plugins/mise-zbctl
zellij                        ubi:zellij-org/zellij asdf:chessmango/asdf-zellij
zephyr                        ubi:MaybeJustJames/zephyr asdf:nsaunders/asdf-zephyr
zig                           core:zig
zigmod                        ubi:nektro/zigmod asdf:mise-plugins/asdf-zigmod
zls                           aqua:zigtools/zls ubi:zigtools/zls
zola                          ubi:getzola/zola asdf:salasrod/asdf-zola
zoxide                        ubi:ajeetdsouza/zoxide asdf:nyrst/asdf-zoxide
zprint                        asdf:mise-plugins/mise-zprint

【補足情報】asdfのアンインストール

.bashrc (または .zshrc )に追加した以下のasdfの設定を削除する。

ASDF_DATA_DIR="$HOME/.asdf"
export PATH="$ASDF_DATA_DIR/shims:$PATH"

さらに、以下のコマンドを実行すればasdfをアンインストールできる。

% brew uninstall asdf
% rm -rf $HOME/.asdf
$ rm -rf $HOME/.asdf

asdf:Python 3.12.x インストール時に 'Modules/_ssl.cpython-312-darwin.so': No such file or directory エラー

asdf で(pyenvでも) Python 3.12.xをインストールしようとしたら、以下のようなエラー出力に遭遇した。

% asdf install python 3.12.2
....    ....
....    ....

BUILD FAILED (OS X 13.4.1 using python-build 2.5.3-2-g2f4bdcdb)

Inspect or clean up the working tree at /var/folders/4c/wcry6r391s5cxyc66bnktgf80000gn/T/python-build.20250302164807.4616
Results logged to /var/folders/4c/wcry6r391s5cxyc66bnktgf80000gn/T/python-build.20250302164807.4616.log

Last 10 log lines:
/usr/local/bin/ginstall -c -m 755 Modules/termios.cpython-312-darwin.so /Users/LOGNAME/.asdf/installs/python/3.12.2/lib/python3.12/lib-dynload/termios.cpython-312-darwin.so
/usr/local/bin/ginstall -c -m 755 Modules/_posixshmem.cpython-312-darwin.so /Users/LOGNAME/.asdf/installs/python/3.12.2/lib/python3.12/lib-dynload/_posixshmem.cpython-312-darwin.so
/usr/local/bin/ginstall -c -m 755 Modules/_multiprocessing.cpython-312-darwin.so /Users/LOGNAME/.asdf/installs/python/3.12.2/lib/python3.12/lib-dynload/_multiprocessing.cpython-312-darwin.so
/usr/local/bin/ginstall -c -m 755 Modules/_ctypes.cpython-312-darwin.so /Users/LOGNAME/.asdf/installs/python/3.12.2/lib/python3.12/lib-dynload/_ctypes.cpython-312-darwin.so
/usr/local/bin/ginstall -c -m 755 Modules/_curses.cpython-312-darwin.so /Users/LOGNAME/.asdf/installs/python/3.12.2/lib/python3.12/lib-dynload/_curses.cpython-312-darwin.so
/usr/local/bin/ginstall -c -m 755 Modules/_curses_panel.cpython-312-darwin.so /Users/LOGNAME/.asdf/installs/python/3.12.2/lib/python3.12/lib-dynload/_curses_panel.cpython-312-darwin.so
/usr/local/bin/ginstall -c -m 755 Modules/_sqlite3.cpython-312-darwin.so /Users/LOGNAME/.asdf/installs/python/3.12.2/lib/python3.12/lib-dynload/_sqlite3.cpython-312-darwin.so
/usr/local/bin/ginstall -c -m 755 Modules/_ssl.cpython-312-darwin.so /Users/LOGNAME/.asdf/installs/python/3.12.2/lib/python3.12/lib-dynload/_ssl.cpython-312-darwin.so
ginstall: cannot stat 'Modules/_ssl.cpython-312-darwin.so': No such file or directory
make: *** [sharedinstall] Error 1
error installing version: failed to run install callback: exit status 1

Python 3.12.xのインストール自体は成功しているようだが、このエラーで示されている _ssl.cpython-312-darwin.so というモジュールは欠落してしまっているようだ。

インストールされているOpenSSLが1.x系で、そちらがビルド用ライブラリ参照先になっていると、このようなエラーになるようだ。

Macの場合は、Homebrewで下のように OpenSSL 3.x系をインストールして、

brew unlink openssl
brew install openssl@3
brew link openssl@3

さらに、.bashrczshなら.zshrc)に下のようなビルド用ライブラリ参照先を明示的に設定してやる。

export CPPFLAGS="-I$(brew --prefix)/include"
export LDFLAGS="-L$(brew --prefix)/lib"

上の操作を行った上で、一旦エラーが出力されたPython 3.12.xをアンイストールして、再度インストールを行うと解決できる。

asdf uninstall python 3.12.2
asdf install python 3.12.2

Ubuntu/Linuxでも、Python 3.12.xのインストール時に同様のエラーが出力されたら、ビルド用ライブラリ参照先としてOpenSSL 1.x系を無効にして3.x系を有効にすれば解決できるはずだ。

【参照リンク】

github.com

【Rust】別ターゲット用にプログラムをクロスコンパイルする

ここ最近、毎日Rustを使ってRaspberry Pi用プログラムを書いている。センサー・デバイスから取得した計測データをSQLiteデータベースに保存して、同時にWebSocket経由でサーバーへ転送するようなものだ。ターゲットはRaspberry Piだが、Rustプログラムの開発ホスト機としてMacを使っている。

前記事にRustのインストールと開発環境の構築手順を書いたが、

blog.ketus-ix.work

この記事の中で、下のようなRustコンポーネントの一覧を取得するコマンドを紹介した。

% rustup component list
cargo-x86_64-apple-darwin (installed)
clippy-x86_64-apple-darwin (installed)
llvm-bitcode-linker-x86_64-apple-darwin
llvm-tools-x86_64-apple-darwin
rls-x86_64-apple-darwin
rust-analysis-x86_64-apple-darwin
rust-analyzer-x86_64-apple-darwin
rust-docs-x86_64-apple-darwin (installed)
rust-src
rust-std-aarch64-apple-darwin
rust-std-aarch64-apple-ios
rust-std-aarch64-apple-ios-sim
rust-std-aarch64-linux-android
rust-std-aarch64-pc-windows-gnullvm
rust-std-aarch64-pc-windows-msvc
rust-std-aarch64-unknown-fuchsia
rust-std-aarch64-unknown-linux-gnu
rust-std-aarch64-unknown-linux-musl
rust-std-aarch64-unknown-linux-ohos
rust-std-aarch64-unknown-none
rust-std-aarch64-unknown-none-softfloat
rust-std-aarch64-unknown-uefi
rust-std-arm-linux-androideabi
rust-std-arm-unknown-linux-gnueabi
rust-std-arm-unknown-linux-gnueabihf
rust-std-arm-unknown-linux-musleabi
rust-std-arm-unknown-linux-musleabihf
rust-std-armebv7r-none-eabi
rust-std-armebv7r-none-eabihf
rust-std-armv5te-unknown-linux-gnueabi
rust-std-armv5te-unknown-linux-musleabi
rust-std-armv7-linux-androideabi
rust-std-armv7-unknown-linux-gnueabi
rust-std-armv7-unknown-linux-gnueabihf
rust-std-armv7-unknown-linux-musleabi
rust-std-armv7-unknown-linux-musleabihf
rust-std-armv7-unknown-linux-ohos
rust-std-armv7a-none-eabi
rust-std-armv7r-none-eabi
rust-std-armv7r-none-eabihf
rust-std-i586-pc-windows-msvc
rust-std-i586-unknown-linux-gnu
rust-std-i586-unknown-linux-musl
rust-std-i686-linux-android
rust-std-i686-pc-windows-gnu
rust-std-i686-pc-windows-gnullvm
rust-std-i686-pc-windows-msvc
rust-std-i686-unknown-freebsd
rust-std-i686-unknown-linux-gnu
rust-std-i686-unknown-linux-musl
rust-std-i686-unknown-uefi
rust-std-loongarch64-unknown-linux-gnu
rust-std-loongarch64-unknown-none
rust-std-loongarch64-unknown-none-softfloat
rust-std-nvptx64-nvidia-cuda
rust-std-powerpc-unknown-linux-gnu
rust-std-powerpc64-unknown-linux-gnu
rust-std-powerpc64le-unknown-linux-gnu
rust-std-riscv32i-unknown-none-elf
rust-std-riscv32im-unknown-none-elf
rust-std-riscv32imac-unknown-none-elf
rust-std-riscv32imafc-unknown-none-elf
rust-std-riscv32imc-unknown-none-elf
rust-std-riscv64gc-unknown-linux-gnu
rust-std-riscv64gc-unknown-none-elf
rust-std-riscv64imac-unknown-none-elf
rust-std-s390x-unknown-linux-gnu
rust-std-sparc64-unknown-linux-gnu
rust-std-sparcv9-sun-solaris
rust-std-thumbv6m-none-eabi
rust-std-thumbv7em-none-eabi
rust-std-thumbv7em-none-eabihf
rust-std-thumbv7m-none-eabi
rust-std-thumbv7neon-linux-androideabi
rust-std-thumbv7neon-unknown-linux-gnueabihf
rust-std-thumbv8m.base-none-eabi
rust-std-thumbv8m.main-none-eabi
rust-std-thumbv8m.main-none-eabihf
rust-std-wasm32-unknown-emscripten
rust-std-wasm32-unknown-unknown
rust-std-wasm32-wasi
rust-std-wasm32-wasip1
rust-std-wasm32-wasip1-threads
rust-std-x86_64-apple-darwin (installed)
rust-std-x86_64-apple-ios
rust-std-x86_64-fortanix-unknown-sgx
rust-std-x86_64-linux-android
rust-std-x86_64-pc-solaris
rust-std-x86_64-pc-windows-gnu
rust-std-x86_64-pc-windows-gnullvm
rust-std-x86_64-pc-windows-msvc
rust-std-x86_64-unknown-freebsd
rust-std-x86_64-unknown-fuchsia
rust-std-x86_64-unknown-illumos
rust-std-x86_64-unknown-linux-gnu
rust-std-x86_64-unknown-linux-gnux32
rust-std-x86_64-unknown-linux-musl
rust-std-x86_64-unknown-linux-ohos
rust-std-x86_64-unknown-netbsd
rust-std-x86_64-unknown-none
rust-std-x86_64-unknown-redox
rust-std-x86_64-unknown-uefi
rustc-x86_64-apple-darwin (installed)
rustc-dev-aarch64-apple-darwin
rustc-dev-aarch64-pc-windows-msvc
rustc-dev-aarch64-unknown-linux-gnu
rustc-dev-aarch64-unknown-linux-musl
rustc-dev-arm-unknown-linux-gnueabi
rustc-dev-arm-unknown-linux-gnueabihf
rustc-dev-armv7-unknown-linux-gnueabihf
rustc-dev-i686-pc-windows-gnu
rustc-dev-i686-pc-windows-msvc
rustc-dev-i686-unknown-linux-gnu
rustc-dev-loongarch64-unknown-linux-gnu
rustc-dev-powerpc-unknown-linux-gnu
rustc-dev-powerpc64-unknown-linux-gnu
rustc-dev-powerpc64le-unknown-linux-gnu
rustc-dev-riscv64gc-unknown-linux-gnu
rustc-dev-s390x-unknown-linux-gnu
rustc-dev-x86_64-apple-darwin
rustc-dev-x86_64-pc-windows-gnu
rustc-dev-x86_64-pc-windows-msvc
rustc-dev-x86_64-unknown-freebsd
rustc-dev-x86_64-unknown-illumos
rustc-dev-x86_64-unknown-linux-gnu
rustc-dev-x86_64-unknown-linux-musl
rustc-dev-x86_64-unknown-netbsd
rustc-docs-x86_64-unknown-linux-gnu
rustfmt-x86_64-apple-darwin (installed)

この出力情報から、コマンド "rustup" によって複数ターゲット用のクロスコンパイラをインストールできることが判る。

Rustでは公式サイトによってクロスコンパイラが配布されており、別ターゲットを対象としたクロスプラットフォーム開発環境が簡単に構築できるようになっている。これはRustの大きな利点であり、最近のプロジェクト(特に組み込み系)でRustが採用されるケースが増える要因となっている。

Rustを使うと、クロスコンパイル環境さえ構築すれば、Mac, WindowsLinux,組み込みLinux搭載機、Androidモバイル機、さらにOS無しマイコン環境さえも一つのプロジェクトで対応できるようになる。

本記事では、Rustによるクロスコンパイル環境の構築方法を紹介する。

ターゲット機としてRaspberry Pi OS 64-bit(Raspberry Pi 4用)を想定しているが、コンパイラやリンカの設定方法が変わるだけで、Linux搭載機がターゲットなら同じ手順でクロスコンパイル環境を構築できる。

cross パッケージによるクロスコンパイル

cross パッケージのインストール

% cargo install cross

プロジェクトのクロスビルド

% cd PROJECT_DIR
% cross build --target aarch64-unknown-linux-gnu

ビルドによって生成された実行可能ファイルはプロジェクト・ディレクリ内の以下のパスに置かれる。

  • オプションなし(または--debugオプション付き)で "cross build --target" コマンドを実行した場合〔Debugビルド〕

 target/aarch64-unknown-linux-gnu/debug/<project_name>

  • --releaseオプション付きで "cross build --target" コマンドを実行した場合〔Releaseビルド〕

 target/aarch64-unknown-linux-gnu/release/<project_name>

コマンド "cross build" はDockerコンテナを利用してプログラムのクロスコンパイルを行っており、Dockerがインストール済みで、"docker" コマンドが非root権限ユーザーによって実行できる状態であることが本コマンドを使える前提条件となる。

プロジェクト・プログラムの実行

cargo環境に cross パッケージを導入済みの場合、別ターゲット用にビルドしたプログラムを開発ホスト機上で実行することができる。

% cross run --target aarch64-unknown-linux-gnu

このコマンドはQEMUを使ってプログラムをエミュレート実行している。

ターゲット用リンカを使うクロスコンパイル

ターゲット用リンカのインストール

% brew tap messense/macos-cross-toolchains
% brew install aarch64-unknown-linux-gnu
$ sudo apt install gcc-aarch64-linux-gnu

ターゲット用ツールチェインのインストール

% rustup target add aarch64-unknown-linux-gnu

ターゲット用ビルド設定の作成

プロジェクト・ディレクトリ内に以下のような内容の.cargo/config.tomlというファイルを作成する。

% cd PROJECT_DIR
% mkdir .cargo
% vi .cargo/config.toml
[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-gcc"

プロジェクトのクロスビルド

上記の手順操作が済んでいる状態で、プロジェクト・ディレクトリ内で下のようなコマンドを実行すると、当該プログラムを指定ターゲット用にビルドすることができる。

% cargo build --target aarch64-unknown-linux-gnu

zigbuild パッケージによるクロスコンパイル

Zigというプログラミング言語が在るが、このZigにLLVMベース・ツールチェインが統合されたZig ccというものがある。

zig.guide

このZig ccをcargo環境で使えるようにした cargo-zigbuild というRustパッケージが存在する。

github.com

この cargo-zigbuild パッケージを利用すると、Rustのクロスコンパイル環境を構築できる。

zigbuild パッケージのインスール

% brew install zig
% cargo install cargo-zigbuild
$ snap install zig --classic --beta
$ cargo install cargo-zigbuild

プロジェクトのクロスビルド

% cd PROJECT_DIR
% cargo zigbuild --target aarch64-unknown-linux-gnu

【補足説明】

クロスビルドによって生成したRustプログラムの実行可能ファイルをターゲット機へ転送するには、SSH経由で行うのが良く利用される方法だろう。

scpを使う方法

% scp target/aarch64-unknown-linux-gnu/debug/hello_rust <remote_user>@<target_remote_host>://tmp/

rsyncを使う方法

% rsync -av -e ssh target/aarch64-unknown-linux-gnu/debug/hello_rust <remote_user>@<target_remote_host>://tmp/

転送したプログラムの動作確認は、ターゲット機のコンソールから直接実行するか、あるいは、以下のようにSSH経由でターゲット機にログインした上で転送済みの実行可能ファイルを起動すれば良い。

% ssh <remote_user>@<target_remote_host>
% cd /tmp
% ./hello_rust
Hello, world!

【参照リンク】

qiita.com

qiita.com

zenn.dev

Rustのインストールと開発環境の構築

本業仕事で新しいIoTプロジェクトに関わっている。このプロジェクトのターゲット機はRaspberry Piを搭載しており、小生はファームウェアの開発を行っているが、そのプログラミング言語としてRustを使っている。

本格的にRustを使ってソフトウェア開発を行うのがこれが初めてだ。ハード制御を行うファームウェアC/C++を使って開発するのが一般的だが(最近は組み込みもPythonやNode.jsを使って開発できないこともないが、速度的制約をクリアしなければならなかったり細かなハード制御が必要だったりすると、やはりC/C++の方が実現し易い)、Rustを使っても同様の目的が達成できるんじゃないかと思っていた。実際にRustによるLinux稼働ファームウェアの開発を進めていて、この選択は正解だったと実感している。

RustはC/C++よりプログラミング・コストが低く、発達したエコシステムにより豊富なライブラリが揃っており、それらを使うとハード寄りのディープな目的もほとんど達成できる。速度面でもC/C++に劣らず、細やかな非同期処理、スレッド制御、メモリ管理も可能だ。

最近登場している開発系ツールはRustで書かれているものが多い。Rustを使ってWeb開発もできるし、PythonやNode.jsより応答性能の高いものが作れる。Rust用機械学習ライブラリも登場しているし、Rustで書かれたリアルタイムOSやESP32などのマイコン開発用フレームワークも存在する。組み込み開発もいまはRustでやるのが最適解なのかもしれない。あらゆる分野でRustが使われるトレンドが起きているようだ。

今回のプロジェクトだけでなく、自己研究でのIoTやエッジ・組み込みLinux利用開発でも積極的にRustを使っていくつもりだ。

自分の備忘録として、MacUbuntu機へRustの開発環境を構築する手順を書き残しておく。

Rustのインストール

Rustのインストール方法として、公式サイトではrustupを使うことが推薦されている。

www.rust-lang.org

asdfを使ってRustをインストールすることもできるが、asdfによって導入できるのはrustc(Rustコンパイラ)だけで、rustupは使えない。rustupを使うと複数のバージョンのRustをインストールでき(asdfのような言語バージョン管理ツールの機能も兼ね備えている)、cargoというパッケージマネージャも一緒に導入できる。Rustでのパッケージ管理はこのcargoを使うことが前提となる。

現状、Rustのインストールはrustupを使って行うのが最良の方法と言えるだろう。

% brew install rustup-init
$ curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

Ubuntu/Linuxでは、本インストール・コマンドを実行すると後述の "rustup-init" コマンドも一緒に実行される。

Rustの初期設定

rustupをインストールしたら、最初に下のコマンドを実行して、Rust環境の初期設定を行っておく。

% rustup-init

Welcome to Rust!

This will download and install the official compiler for the Rust
programming language, and its package manager, Cargo.

Rustup metadata and toolchains will be installed into the Rustup
home directory, located at:

  /Users/LOGNAME/.rustup

This can be modified with the RUSTUP_HOME environment variable.

The Cargo home directory is located at:

  /Users/LOGNAME/.cargo

This can be modified with the CARGO_HOME environment variable.

The cargo, rustc, rustup and other commands will be added to
Cargo's bin directory, located at:

  /Users/LOGNAME/.cargo/bin

This path will then be added to your PATH environment variable by
modifying the profile files located at:

  /Users/LOGNAME/.profile
  /Users/LOGNAME/.zshenv

You can uninstall at any time with rustup self uninstall and
these changes will be reverted.

Current installation options:


   default host triple: x86_64-apple-darwin
     default toolchain: stable (default)
               profile: default
  modify PATH variable: yes

1) Proceed with standard installation (default - just press enter)
2) Customize installation
3) Cancel installation
>

info: profile set to 'default'
info: default host triple is x86_64-apple-darwin
info: syncing channel updates for 'stable-x86_64-apple-darwin'
info: latest update on 2024-06-13, rust version 1.79.0 (129f3b996 2024-06-10)
info: downloading component 'cargo'
  6.9 MiB /   6.9 MiB (100 %)   4.8 MiB/s in  1s ETA:  0s
info: downloading component 'clippy'
info: downloading component 'rust-docs'
 15.4 MiB /  15.4 MiB (100 %)   4.8 MiB/s in  3s ETA:  0s
info: downloading component 'rust-std'
 23.4 MiB /  23.4 MiB (100 %)   6.7 MiB/s in  3s ETA:  0s
info: downloading component 'rustc'
 55.5 MiB /  55.5 MiB (100 %)   5.1 MiB/s in  9s ETA:  0s
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
 15.4 MiB /  15.4 MiB (100 %)   2.5 MiB/s in  5s ETA:  0s
info: installing component 'rust-std'
 23.4 MiB /  23.4 MiB (100 %)   9.8 MiB/s in  2s ETA:  0s
info: installing component 'rustc'
 55.5 MiB /  55.5 MiB (100 %)  10.6 MiB/s in  5s ETA:  0s
info: installing component 'rustfmt'
info: default toolchain set to 'stable-x86_64-apple-darwin'

  stable-x86_64-apple-darwin installed - rustc 1.79.0 (129f3b996 2024-06-10)


Rust is installed now. Great!

To get started you may need to restart your current shell.
This would reload your PATH environment variable to include
Cargo's bin directory ($HOME/.cargo/bin).

To configure your current shell, you need to source
the corresponding env file under $HOME/.cargo.

This is usually done by running one of the following (note the leading DOT):
. "$HOME/.cargo/env"            # For sh/bash/zsh/ash/dash/pdksh
source "$HOME/.cargo/env.fish"  # For fish

※上はIntel Mac上での "rustup-init" コマンドの実行例。他のプラットホーム上では "x86_64-apple-darwin" などの表示が変わってくる。

"rustup-init" コマンドによる初期設定が済んだら、下のような記述を.zshrcbashの場合は.bashrc)に追加した上で、それを有効にする。

% vi ~/.zshrc
. "$HOME/.cargo/env"
% source ~/.zshrc

その上で、コマンド "rustc" と "cargo" が利用できることを確認しておく。

% rustc --version
rustc 1.79.0 (129f3b996 2024-06-10)
% cargo --version
cargo 1.79.0 (ffa9cf99a 2024-06-03)

rustupによってインストールしたRust環境のファイル群はディレクト$HOME/.cargoの中に格納されている。

補足情報

Macで "rustup-init" コマンドを実行したときに、下のような警告が表示されることがある。

% rustup-init
warning: it looks like you have an existing installation of Rust at:
warning: /usr/local/bin
warning: It is recommended that rustup be the primary Rust installation.
warning: Otherwise you may have confusion unless you are careful with your PATH
warning: If you are sure that you want both rustup and your already installed Rust
warning: then please reply `y' or `yes' or set RUSTUP_INIT_SKIP_PATH_CHECK to yes
warning: or pass `-y' to ignore all ignorable checks.
error: cannot install while Rust is installed

Continue? (y/N)

Homebrewによってすでにrustcパッケージが導入済みときに、この警告が表示される。

この場合は、以下のコマンドによってrustcパッケージが存在することを確認し、それをアンインストールしてから、 "rustup-init" コマンドを再度実行すれば良い。

% which rustc
/usr/local/bin/rustc
% brew info rust
==> rust: stable 1.79.0 (bottled), HEAD
Safe, concurrent, practical language
https://www.rust-lang.org/
Installed
/usr/local/Cellar/rust/1.78.0 (3,320 files, 294.3MB) *
  Poured from bottle using the formulae.brew.sh API on 2024-06-07 at 08:29:53
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/r/rust.rb
License: Apache-2.0 or MIT
==> Dependencies
Required: libgit2 ✔, libssh2 ✔, llvm ✘, openssl@3 ✘, pkg-config ✔
==> Requirements
Required: macOS >= 10.12 (or Linux) ✔
==> Options
--HEAD
    Install HEAD version
==> Caveats
zsh completions have been installed to:
  /usr/local/share/zsh/site-functions
==> Analytics
install: 36,888 (30 days), 122,724 (90 days), 431,118 (365 days)
install-on-request: 26,090 (30 days), 89,554 (90 days), 325,780 (365 days)
build-error: 346 (30 days)
% brew uninstall rust

Rustによるプロジェクト作成とビルド

Rustによるプロジェクト(プログラム)の作成とビルドができることを確認しておこう。

プロジェクトの作成

新しいRustプロジェクトの作成は、以下のような "cargo" コマンドを使って行える。

プロジェクト・ディレクトリを新規作成する場合

% cargo new hello_rust
   Creating binary (application) `hello_rust` package
note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

既存ディレクトリ内でプロジェクトを作成する場合

% mkdir hello_rust
% cd hello_rust
% cargo init
    Creating binary (application) package
note: see more `Cargo.toml` keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

Rustプロジェクトを作成すると、一緒にCargo.tomlというファイルも生成され、この中にプロジェクトの依存パッケージ情報が記述されている(Rustでは、パッケージを "Crate" と呼称する)。

プロジェクト・ソースの作成

コマンド "cargo new PROJECT_NAME" や "cargo init" によってプロジェクトを作成すると、プロジェクト・ディレクトリ内にsrcというディレクトリが生成されており、Rustプログラムのソースファイルはこのディレクトリの中に作成していくことが決まり事になっている。

また、下のような一つのソースファイルも自動的に生成される。

  • src/main.rs
fn main() {
    println!("Hello, world!");
}

プロジェクトのビルドと実行

プロジェクト・ディレクトリ内で下のコマンドを実行することで、そのプロジェクトのビルドが行える。

% cargo build
   Compiling hello_rust v0.1.0 (/Users/LOGNAME/hello_rust)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 2.18s

下のコマンドによって、プロジェクト・プログラムを起動・実行することができる。

% cargo run
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/hello_rust`
Hello, world!

コマンド "cargo run" はプロジェクトのビルドと実行を続けて行っている。

Rust開発環境の整備

Rustによるプログラム開発に有益なツールが多く在るが、その中から厳選してみた。それらのインストール方法を以下に記しておく。

追加コンポーネントのインストール

% rustup component add rls rust-analysis rust-src rust-analyzer

コンポーネントの機能は以下のとおり。

  • rls 旧版のRust Language Server(古いバージョンのRustで使われる)
  • rust-analysis Rust標準ライブラリのメタデータ
  • rust-src Rust標準ライブラリのソースコードのローカルコピー(rlsrust-analyzerなどで参照される)
  • rust-analyzer 新版のRust Language Server(最近のバージョンのRustでは、こちらが使われる)

以下のコンポーネントも有益だが、本記事執筆時点のRustの最新バージョンでは、これらは "rustup-init" コマンドによる初期設定時にインストール済みになっていた。

  • clippy Rust公式のリンター(変数名ルールなどの静的解析を行う)
  • rust-docs 公式Rustドキュメントのローカルコピー("rustup doc" コマンド実行時に、ローカルの公式ドキュメントを参照できるようになる)
  • rustfmt コード・フォーマッタ(ソースコードの可読性整形を行う)

インストール済みのRustコンポーネントは下のコマンドによって確認できる。

% rustup component list
cargo-x86_64-apple-darwin (installed)
clippy-x86_64-apple-darwin (installed)
llvm-bitcode-linker-x86_64-apple-darwin
llvm-tools-x86_64-apple-darwin
rls-x86_64-apple-darwin
rust-analysis-x86_64-apple-darwin
rust-analyzer-x86_64-apple-darwin
rust-docs-x86_64-apple-darwin (installed)
rust-src
rust-std-aarch64-apple-darwin
rust-std-aarch64-apple-ios
rust-std-aarch64-apple-ios-sim
rust-std-aarch64-linux-android
rust-std-aarch64-pc-windows-gnullvm
rust-std-aarch64-pc-windows-msvc
rust-std-aarch64-unknown-fuchsia
rust-std-aarch64-unknown-linux-gnu
rust-std-aarch64-unknown-linux-musl
rust-std-aarch64-unknown-linux-ohos
rust-std-aarch64-unknown-none
rust-std-aarch64-unknown-none-softfloat
rust-std-aarch64-unknown-uefi
rust-std-arm-linux-androideabi
rust-std-arm-unknown-linux-gnueabi
rust-std-arm-unknown-linux-gnueabihf
rust-std-arm-unknown-linux-musleabi
rust-std-arm-unknown-linux-musleabihf
rust-std-armebv7r-none-eabi
rust-std-armebv7r-none-eabihf
rust-std-armv5te-unknown-linux-gnueabi
rust-std-armv5te-unknown-linux-musleabi
rust-std-armv7-linux-androideabi
rust-std-armv7-unknown-linux-gnueabi
rust-std-armv7-unknown-linux-gnueabihf
rust-std-armv7-unknown-linux-musleabi
rust-std-armv7-unknown-linux-musleabihf
rust-std-armv7-unknown-linux-ohos
rust-std-armv7a-none-eabi
rust-std-armv7r-none-eabi
rust-std-armv7r-none-eabihf
rust-std-i586-pc-windows-msvc
rust-std-i586-unknown-linux-gnu
rust-std-i586-unknown-linux-musl
rust-std-i686-linux-android
rust-std-i686-pc-windows-gnu
rust-std-i686-pc-windows-gnullvm
rust-std-i686-pc-windows-msvc
rust-std-i686-unknown-freebsd
rust-std-i686-unknown-linux-gnu
rust-std-i686-unknown-linux-musl
rust-std-i686-unknown-uefi
rust-std-loongarch64-unknown-linux-gnu
rust-std-loongarch64-unknown-none
rust-std-loongarch64-unknown-none-softfloat
rust-std-nvptx64-nvidia-cuda
rust-std-powerpc-unknown-linux-gnu
rust-std-powerpc64-unknown-linux-gnu
rust-std-powerpc64le-unknown-linux-gnu
rust-std-riscv32i-unknown-none-elf
rust-std-riscv32im-unknown-none-elf
rust-std-riscv32imac-unknown-none-elf
rust-std-riscv32imafc-unknown-none-elf
rust-std-riscv32imc-unknown-none-elf
rust-std-riscv64gc-unknown-linux-gnu
rust-std-riscv64gc-unknown-none-elf
rust-std-riscv64imac-unknown-none-elf
rust-std-s390x-unknown-linux-gnu
rust-std-sparc64-unknown-linux-gnu
rust-std-sparcv9-sun-solaris
rust-std-thumbv6m-none-eabi
rust-std-thumbv7em-none-eabi
rust-std-thumbv7em-none-eabihf
rust-std-thumbv7m-none-eabi
rust-std-thumbv7neon-linux-androideabi
rust-std-thumbv7neon-unknown-linux-gnueabihf
rust-std-thumbv8m.base-none-eabi
rust-std-thumbv8m.main-none-eabi
rust-std-thumbv8m.main-none-eabihf
rust-std-wasm32-unknown-emscripten
rust-std-wasm32-unknown-unknown
rust-std-wasm32-wasi
rust-std-wasm32-wasip1
rust-std-wasm32-wasip1-threads
rust-std-x86_64-apple-darwin (installed)
rust-std-x86_64-apple-ios
rust-std-x86_64-fortanix-unknown-sgx
rust-std-x86_64-linux-android
rust-std-x86_64-pc-solaris
rust-std-x86_64-pc-windows-gnu
rust-std-x86_64-pc-windows-gnullvm
rust-std-x86_64-pc-windows-msvc
rust-std-x86_64-unknown-freebsd
rust-std-x86_64-unknown-fuchsia
rust-std-x86_64-unknown-illumos
rust-std-x86_64-unknown-linux-gnu
rust-std-x86_64-unknown-linux-gnux32
rust-std-x86_64-unknown-linux-musl
rust-std-x86_64-unknown-linux-ohos
rust-std-x86_64-unknown-netbsd
rust-std-x86_64-unknown-none
rust-std-x86_64-unknown-redox
rust-std-x86_64-unknown-uefi
rustc-x86_64-apple-darwin (installed)
rustc-dev-aarch64-apple-darwin
rustc-dev-aarch64-pc-windows-msvc
rustc-dev-aarch64-unknown-linux-gnu
rustc-dev-aarch64-unknown-linux-musl
rustc-dev-arm-unknown-linux-gnueabi
rustc-dev-arm-unknown-linux-gnueabihf
rustc-dev-armv7-unknown-linux-gnueabihf
rustc-dev-i686-pc-windows-gnu
rustc-dev-i686-pc-windows-msvc
rustc-dev-i686-unknown-linux-gnu
rustc-dev-loongarch64-unknown-linux-gnu
rustc-dev-powerpc-unknown-linux-gnu
rustc-dev-powerpc64-unknown-linux-gnu
rustc-dev-powerpc64le-unknown-linux-gnu
rustc-dev-riscv64gc-unknown-linux-gnu
rustc-dev-s390x-unknown-linux-gnu
rustc-dev-x86_64-apple-darwin
rustc-dev-x86_64-pc-windows-gnu
rustc-dev-x86_64-pc-windows-msvc
rustc-dev-x86_64-unknown-freebsd
rustc-dev-x86_64-unknown-illumos
rustc-dev-x86_64-unknown-linux-gnu
rustc-dev-x86_64-unknown-linux-musl
rustc-dev-x86_64-unknown-netbsd
rustc-docs-x86_64-unknown-linux-gnu
rustfmt-x86_64-apple-darwin (installed)

追加パッケージのインストール

% cargo install cargo-edit
% cargo install cargo-watch
$ sudo apt install -y libssl-dev
$ cargo install cargo-edit
$ cargo install cargo-watch
  • cargo-edit (Rustでのプロジェクトの依存パッケージ変更はCargo.tomlを編集することで行うが)Rustパッケージ(Crate)の追加/削除を "cargo add CRATE_NAME" や "cargo rm CRATE_NAME" というコマンドで行えるようになる
  • cargo-watch ソースファイルの変更を検知して、"cargo run" コマンドを自動的に実行してくれる

インストール済みのRustパッケージは下のコマンドによって確認できる。

% cargo install --list
cargo-edit v0.12.3:
    cargo-add
    cargo-rm
    cargo-set-version
    cargo-upgrade
cargo-watch v8.5.2:
    cargo-watch

Visual Studio Code拡張機能のインストール

VSCodeでのRustプログラム開発に有益な拡張機能として、rust-analyzerをインストールしておくことを薦める。

これは上述のコンポーネントrust-analyzerVSCode版だ。

少し前までRust(Rust言語対応ユーティリティ機能)とrust-analyzer(Language Support Server)という2つの拡張機能が存在しており、この両方をインストールすることが推薦されていたが、現在この2つはrust-analyzerの一つに統合されている。本記事執筆時点では、VSCodeのRust用拡張機能として最低限rust-analyzerだけをインストールしておけば良いだろう。

【追記】〔2024-07-23〕

VSCodeのRust用拡張機能として、CodeLLDBもインストールする必要があるのを書き忘れていた。

これはVSCode上でのRustソースコードデバッグ実行に使われるものだ。

小生のVSCode環境にはSwiftという拡張機能が導入済みで、このSwiftCodeLLDBに依存しており、すでにCodeLLDBがインストール済みだったので上のことに気づかなかった。

【追記】〔2024-07-24〕

備忘録として、cargoコマンドの使い方も書いておく。

新規プロジェクトの作成

cargo new PROJECT_NAME

本コマンドは通常パッケージ用プロジェクトを作成する。

コマンド "cargo new --bin PROJECT_NAME" によって、バイナリパッケージ用プロジェクトを作成できる。

既存ディレクトリ上でのプロジェクトの作成

cd PROJECT_DIR
cargo init

プロジェクトのビルド

cargo build

オプションなし(または--debugオプション付き)で本コマンドを実行すると、Debug用実行可能ファイルがビルドされる。コマンド "cargo build --relaese" だと、Relaese用実行可能ファイルがビルドされる。

コマンド "cargo build --example EXAMPLE_NAME" によって、examplesディレクトリ内の指定サンプルプログラムをビルドできる。

プロジェクトのビルドと実行

cargo run

コマンド "cargo run --example EXAMPLE_NAME" によって、examplesディレクトリ内の指定サンプルプログラムをビルド・実行できる。

プロジェクトのビルド可能確認

cargo check

本コマンドによってプロジェクトのビルドは行われず、コンパイル確認だけが行われる。

プロジェクトのビルド削除(クリーン)

cargo clean

パッケージ(Crate)のインストール

cargo add CRATE_NAME

cargo-editがインストールされている場合に使えるコマンド

パッケージ(Crate)のアンインストール

cargo rm CRATE_NAME

cargo-editがインストールされている場合に使えるコマンド

パッケージ(Crate)の検索

cargo search CRATE_NAME

Rust Crateの公式配布サイトcrates.ioから、指定した名前を含むCrateが検索される。

https://crates.io/crates.io

依存Crateの更新

cargo update

本コマンドによって、プロジェクトの全依存Crateが最新版へ更新される。

テストの実行

cargo test

ディレクトtests内にプロジェクトの単体テスト用ソースファイルが作成されている場合に、本コマンドによってそれらがビルド・実行される。

プロジェクト・ドキュメントの作成

cargo doc

プロジェクトのファイル群からドキュメントを生成する。

ソースファイル中に一定のルールに則って記述されたコメントが、本コマンドによるドキュメント情報収集の対象となる。

バイナリパッケージのインストール

cargo install PACKAGE_NAME

バイナリパッケージのアンインストール

cargo uninstall PACKAGE_NAME

【参照リンク】

qiita.com

zenn.dev

code.visualstudio.com

Flutterのインストールと開発環境の構築〔iOS/Androidアプリ編〕

前記事にFlutterのインストールと開発環境構築方法について書いたが、これに続いて、FlutterによるiOSおよびAndroidアプリ開発用の追加的な環境構築手順を書いていく。

blog.ketus-ix.work

スマホアプリ開発を再開するにあたって、当面の目標として、ONVIF仕様IPカメラ(監視・防犯カメラ)とMatter規格スマートデバイス用のアプリを作りたいと考えている。

www.onvif.org csa-iot.org

元組み込み屋だったこともあって、小生はやはりハードウェア/デバイス絡みの開発に興味を惹かれてしまう。スマホと連携できるデバイスやガジェットが増えているので、そういうものを利用するモバイルアプリを作りたい。

技術スキル維持と開発トレンド追随のためにも、今後もスマホアプリ開発は続けていくつもりだ。いままでは主にFlutterを使ってきたが、(フレームワーク設計思想がFlutterと似ている)React Nativeも使ってみたいと思っている。

必要なツールのインストール

CocoaPodsのインストール

前記事のコマンド "flutter doctor" の出力情報で指摘されていたとおり、Xcodeとの連携のためにCocoaPodsも必要になる。

CocoaPodsの公式サイトによると、下のコマンドによってインストールできる。

% sudo gem install cocoapods

このコマンドはMacにデフォルトで入っているRubygemRubyのパッケージ管理コマンド)を使ってCocoaPodsのインストールを行っているが、言語バージョン管理ツールを使っている場合はそちらを利用した方が良い。

  • anyenvを使っている場合
% anyenv install rbenv
% exec $SHELL -l
% rbenv install --list
% rbenv install 3.3.1
% rbenv rehash
% rbenv global 3.3.1
% cd
% which ruby
/Users/LOGNAME/.anyenv/envs/rbenv/shims/ruby
/usr/bin/ruby
% ruby --version
ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-darwin21]
% which gem
/Users/LOGNAME/.anyenv/envs/rbenv/shims/gem
/usr/bin/gem
% gem install cocoapods
% pod --version
1.15.2
  • asdfを使っている場合
% asdf plugin add ruby
% asdf install ruby latest
% asdf reshim
% asdf global ruby latest
% cd
% which ruby
/Users/LOGNAME/.asdf/shims/ruby
/usr/bin/ruby
% ruby --version
ruby 3.3.1 (2024-04-23 revision c56cd86388) [x86_64-darwin22]
% which gem
/Users/LOGNAME/.asdf/shims/gem
/usr/bin/gem
% gem install cocoapods
% pod --version
1.15.2

XcodeとCocoaPodsはMac上でのmacOSiOSアプリ開発に必要なものだ。これらのアプリはXcodeが使えるMacでしか開発することはできない。

Android Studioのインストール

Android StudioAndroid Studioの公式サイトから入手できる。

下のようなコマンドによって、Homebrewを使ってAndroid Studioをインストールすることもできる。

% brew install --cask android-studio

Android Studioをインストールしたら、一度起動して、表示されるガイド画面に従って操作を行い初期セットアップを終わらせおく。

Android SDK Command-line Toolsのインストール

Android Studio起動後のWelcome画面上のプルダウンメニュー [More Actions] > [SDK Manager] を選ぶ(あるいは、メニュー [Settings]を選択する)。

すると、下のような画面が開く。

この画面内の項目 [Languages & Frameworks] > [Android SDK] の [SDK Tools] タブ画面から、 [Android SDK Command-line Tools (lastest)] チェックボタンを有効にして、[OK] ボタンを押す 。

この操作によって、有効にしたコンポーネントの追加インストールが開始される。

Javaのインストール

Androidアプリの開発に使用されるので、JavaJava JRE)もインストールする必要がある。

本記事執筆時点の最新Stable版Flutter SDKでは、Javaバージョン11以上20未満の使用が推薦されているようだ。

下のようなコマンドによって、Homebrewを使ってJavaをインストールできる。

% brew install openjdk@17

SDKMANを使ってJavaをインストールする方法もある。この方法については下の記事を参照してほしい。

blog.ketus-ix.work

asdfを使っている場合は、下のコマンドによってasdfを使ってJavaをインストールできる。

% asdf plugin add java
% asdf install java temurin-jre-17.0.11+9
% asdf reshim
% asdf global java temurin-jre-17.0.11+9
% exec $SHELL -l
% cd
% which java
/Users/LOGNAME/.asdf/shims/java
/usr/bin/java
% java -version
openjdk version "17.0.11" 2024-04-16
OpenJDK Runtime Environment Temurin-17.0.11+9 (build 17.0.11+9)
OpenJDK 64-Bit Server VM Temurin-17.0.11+9 (build 17.0.11+9, mixed mode)

Flutter開発環境の状態確認

上記の手順操作がすべて済んだら、下のコマンドによってFlutter開発環境の状態を確認してみよう(FVMを使っている場合のコマンドは "fvm flutter doctor")。

% flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.19.6, on macOS 13.4.1 22F770820d darwin-x64, locale ja-JP)
[!] Android toolchain - develop for Android devices (Android SDK version 35.0.0)
    ! Some Android licenses not accepted. To resolve this, run: flutter doctor --android-licenses
[✓] Xcode - develop for iOS and macOS (Xcode 14.3.1)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2024.1)
[✓] VS Code (version 1.90.1)
[✓] Connected device (2 available)
[✓] Network resources

! Doctor found issues in 1 category.

前記事と本記事のここまでの手順操作がすべて済んでいれば、多分上のような表示になるんじゃないだろうか。

上の出力情報中で指定されている問題点 "Some Android licenses not accepted. " は、以下の操作によって解決できるだろう。

警告文中のアドバイスのとおり、下のコマンドを実行する(FVMを使用している場合のコマンドは "fvm flutter doctor --android-licenses")。

% flutter doctor --android-licenses

これによって、Android Studio内のコンポーネントのライセンス条文が順次表示され、その同意/拒否を求められるので、すべてに "y" とタイプする。

この操作が済めば、コマンド "flutter doctor" の実行結果は下のような出力表示になるはずだ。

% flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.19.6, on macOS 13.4.1 22F770820d darwin-x64, locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 35.0.0)
[✓] Xcode - develop for iOS and macOS (Xcode 14.3.1)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2024.1)
[✓] VS Code (version 1.90.1)
[✓] Connected device (2 available)
[✓] Network resources

• No issues found!

これで、 FlutterによるiOSAndroidアプリの開発環境はすべて整った。

VSCodeでいずれかのFlutterプロジェクト・ディレクトリを開くと、ターゲットデバイスとしてiOSAndroidの選択肢が増えていることが確認できるだろう。

なお、本記事執筆時点ではAndroidのターゲットデバイスは上のようになっているが、これは導入したAndroid Studioのリリースバージョンによって変化する。

iOSアプリのビルドと動作確認

Visual Studio Code使用

VSCodeでFlutterプロジェクトのディレクリを開き、ターゲットデバイスから [Start iOS Simulator] を選択する。

すると、iOSシュミレータが起動する。

この状態でVSCodeのメニュー [Run (実行)] > [Start Debugging (デバッグの開始)] または [Run Without Debugging (デバッグなしで実行)] を選ぶと、プロジェクトのビルドが行われ、ビルドが成功すれば、iOSシュミレータ上でアプリが起動する。

ターミナル使用

ターミナルから同じ操作を行うこともできる。

まず、下のコマンドによってiOSシュミレータを起動する。

% open -a Simulator

この状態で、Flutterプロジェクト・ディレクリ内で下のコマンドを実行すると、プロジェクトのビルドが行われ、ビルドが成功すれば、iOSエミュレータ上でアプリが起動する。

% cd FLUTTER_PROJECT_DIR
% flutter run

iOS仮想デバイスの追加

iOSシュミレータを使って、新しいiOS仮想デバイスを作成することができる。

iOSシュミレータのメニュー [File] > [New Simulator] を選ぶと、下のような画面が開く。

この画面のメニューからデバイス種別とiOSバージョンを選んで、[Create] ボタンを押せば、仮想デバイスが作成される。

作成されたデバイスはメニュー [File] > [Open Simulator] の項目として追加されているので、同メニュー項目を選べば、そのデバイスが起動する。

この状態でVSCodeのメニュー [Run (実行)] > [Start Debugging (デバッグの開始)] または [Run Without Debugging (デバッグなしで実行)] を選ぶと、開いているiOSバイス上でプロジェクト・アプリが起動する。

Androidアプリのビルドと動作確認

Visual Studio Code使用

VSCodeでFlutterプロジェクトのディレクリを開き、ターゲットデバイスからいずれかのAndroidバイス(本記事執筆時点では、 [Start Pixel Fold API 35 mobile emulator] か [Start Pixel Fold API 35 mobile emulator (cold boot)] )を選択する。

すると、Androidエミュレータが起動する。

この状態でVSCodeのメニュー [Run (実行)] > [Start Debugging (デバッグの開始)] または [Run Without Debugging (デバッグなしで実行)] を選ぶと、プロジェクトのビルドが行われ、ビルドが成功すれば、Androidエミュレータ上でアプリが起動する。

ターミナル使用

ターミナルから同じ操作を行うこともできる。

まず、下のコマンドによってAndroidエミュレータを起動する。

% flutter emulators --launch Pixel_Fold_API_35

この状態で、Flutterプロジェクト・ディレクリ内で下のコマンドを実行すると、プロジェクトのビルドが行われ、ビルドが成功すれば、Androidエミュレータ上でアプリが起動する。

% cd FLUTTER_PROJECT_DIR
% flutter run

Android仮想デバイスの追加

Android StudioのVirtual Device Mangerを使って、新しいAndroid仮想デバイスを作成することができる。

Android Studio起動後のWelcome画面上のプルダウンメニュー [More Actions] > [Virtual Device Manager] を選ぶ。

すると、下のようなVirtual Device Managerの画面が開く。

この画面の左上の [ ] ボタンを押すと、下のような画面が順次表示される。

各画面でデバイスAPIの種類を選択し、最後にデバイス名を入力をして [Finish] ボタンを押せば、新しい仮想デバイスが作成される。

Virtual Device Mangerによって作成したデバイスVSCode側にも反映される。

Virtual Device Mangerでデバイス名の左側の [ ] ボタンを押すか、VSCode側のコマンドパレット・メニューからデバイスを選択すると、Androidエミュレータでその仮想デバイスが起動する。

この状態でVSCodeのメニュー [Run (実行)] > [Start Debugging (デバッグの開始)] または [Run Without Debugging (デバッグなしで実行)] を選ぶと、開いているAndroidバイス上でプロジェクト・アプリが起動する。

  

経験則的な情報だが、GPUを搭載していないPC(CPU内蔵GPU Intel Graphicsのみ搭載機)ではAndroidエミュレータは極端に動作が遅くなり、実用に耐えられないほど反応が悪くなる。そういうPCでは実質的にAndroidアプリの開発はできないと思った方が良い。

 

Flutterコマンド

iOS/Androidアプリの開発において、利用する可能性の高いFlutterのコマンドを列記しておく。

プロジェクトの作成

% flutter create PROJECT_NAME
% mkdir FLUTTER_PROJECT_DIR
% cd FLUTTER_PROJECT_DIR
% flutter create .

プロジェクトのビルド

% flutter build TARGET_ENV

TARGET_ENV = web | macos | linux | windows | ios | android

プロジェクト・ビルドの削除

% flutter clean

パッケージ(ライブラリ)の更新

% cd FLUTTER_PROJECT_DIR
% flutter pub get

pubspec.yamlの編集後、本コマンドを実行することでプロジェクトが利用しているパッケージの更新が行える。

パッケージの追加

% flutter pub add PACKAGE

pubspec.yamlの内容も更新される。

パッケージの削除

% flutter pub remove PACKAGE

pubspec.yamlの内容も更新される。

パッケージ依存関係の表示

% flutter pub deps

ターゲットデバイス一覧の表示

% flutter devices

iOS/Androidエミュレータの場合は、これらが事前に起動している状態でなければデバイス情報は表示されない。

エミュレータ一覧の表示

% flutter emulators

エミュレータの起動

% flutter emulators --launch EMULATOR_NAME

Xcodeが導入済みで)iOSシュミレータと(Android Studioが導入済みで)Androidエミュレータが存在する状態では、コマンド "flutter emulators" の出力は以下のようになる。

% flutter emulators
3 available emulators:

apple_ios_simulator                                                                                              • iOS Simulator
• Apple  • ios
Pixel_Fold_API_35                                                                                                • Pixel Fold API 35
• Google • android

この場合、下のようなコマンドによってiOSシュミレータを起動できる。

% flutter emulators --launch apple_ios_simulator

また、下のようなコマンドによってAndroidエミュレータを起動できる。

% flutter emulators --launch Pixel_Fold_API_35

アプリの実行

% flutter run

すべてのターゲットデバイス向けにコマンド "flutter pub get" や "flutter pub build" 、アプリのインストールまでの一連の操作処理が実行される。

リリースモードでのアプリの実行

% flutter run --release

デバッグモードでのアプリの実行

% flutter run --debug

ビルド無しでアプリの実行

% flutter run --no-build

ターゲットデバイスを指定してアプリの実行

% flutter run -d DEVICE_ID

DEVICE_ID = コマンド "flutter devices" で表示されるデバイスIDを指定。

iOSシュミレータとAndoridエミュレータを起動している状態では、コマンド "flutter devices" の出力は以下のようになる。

% flutter devices
Found 4 connected devices:
  sdk gphone64 x86 64 (mobile) • emulator-5554                        • android-x64    • Android 15 (API 35) (emulator)
  iPhone 14 Pro Max (mobile)   • 42BB6078-C13C-4A30-A42F-E60DE8CFB18D • ios            • com.apple.CoreSimulator.SimRuntime.iOS-16-4 (simulator)
  macOS (desktop)              • macos                                • darwin-x64     • macOS 13.4.1 22F770820d darwin-x64
  Chrome (web)                 • chrome                               • web-javascript • Google Chrome 126.0.6478.63

No wireless devices were found.

この場合、下のようなコマンドによってプロジェクト・アプリをiOSシュミレータ上で起動できる。

% flutter run -d 42BB6078-C13C-4A30-A42F-E60DE8CFB18D

また、下のようなコマンドによってプロジェクト・アプリをAndroidエミュレータ上で起動できる。

% flutter run -d emulator-5554 

起動デバイススクリーンショットを取得

% flutter screenshot

コマンド "flutter screenshot --out FILE_PATH" によってスクリーンショット・ファイルの出力先パスを指定できる。

 

iOSシュミレータとAndroidエミュレータを使うことになるが、アプリ開発はほとんどこの環境で行うことができる。物理デバイス搭載の固有機能を利用するアプリでは実機での動作確認も必要となるが、実機を使った開発方法についてはまた別の記事で書くことになるだろう。

【参照リンク】

zenn.dev

https://book-reviews.blog/launch-the-flutter-application-on-iOS-and-Android-emulator/book-reviews.blog

Flutterのインストールと開発環境の構築〔基本編〕

近況報告になるが、去年末から本業仕事でIoT系プロジェクトに関わっていたが、最近それが一段落した。この仕事のターゲット機はESP32を搭載しているが、小生はそのファームウェアの開発を行った。また、AWS上で稼働するNestJSベースのWebアプリ・サーバープログラムの改造も手伝ったりした。こちらで得た技術知見もブログ記事に書いていこうと思っている。

本業に復帰する前の一昨年から去年前半まで(コロナ禍の最盛期)はIT開発は副業としてやっていたが、主に関わっていたのはスマホアプリ開発フレームワークプログラミング言語)はFlutter(Dart)を使っていた。Flutterを好んで使っていたのは、一つのプログラムコードでデスクトップ、Web、スマホアプリの全部に対応できるからだ。モダンなオブジェクト指向+宣言型の言語パラダイムも理解し易くて(小生の場合、使いこなしている自信レベルの習得に2ヶ月だった)、いまでもスマホアプリ開発用のフレームワーク・言語としてFlutter/Dartがベストの選択だと思っている。

一年近くブランクができてしまったので、再スタートのつもりで改めてスマホアプリ開発に取り組みたい。クリーンインストール新調したMacUbuntu機にFlutterによるスマホアプリ開発環境を構築したので、その作業内容を記事に書いていく。

小生がFlutterを使い始めたの頃はすでにSDKバージョン3.xはリリースされていたが、まだ2.xが主流だった。いまは3.xが主流になっており、色々と変わってしまっている点があるようだ。

Flutterのインストール

Flutter(Flutter SDK)は素のまま直接インストールすることもできるが、言語バージョン管理ツールを利用した方がプログラム毎のプロジェクト管理がやり易くなる。

Flutter用のバージョン管理ツールとして、FVM(Flutter Version Management)またはasdfが広く使われているようだ。

fvm.app

asdf-vm.com

FVMによるFlutterのインストール

FVMのインストール

% brew tap leoafarias/fvm
% brew install fvm
$ curl -fsSL https://fvm.app/install.sh | bash

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

% fvm releases
% fvm install 3.19.6
% fvm list
Cache directory:  /Users/LOGNAME/fvm/versions
Directory Size: 73.02 MB

┌─────────┬─────────┬─────────────────┬──────────────┬──────────────┬────────┐
│ Version │ Channel │ Flutter Version │ Dart Version │ Release Date │ Global │
├─────────┼─────────┼─────────────────┼──────────────┼──────────────┼────────┤
│ 3.19.6  │         │ Need setup      │              │              │        │
└─────────┴─────────┴─────────────────┴──────────────┴──────────────┴────────┘


本記事執筆時点のFlutter SDKの最新Stable版は3.19.6-stableなのでこれをインストールしているが、任意のバージョンを指定してインストールすることもできる。

グローバルなFlutterバージョンの設定

プロジェクトディレクトリ外でもFlutter SDKのコマンドが利用できるように、グローバルなFlutterのバージョンを設定しておくことを薦める。

% fvm global 3.19.6
% cd
% fvm flutter --version
Flutter 3.19.6 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 54e66469a9 (2 weeks ago) • 2024-04-17 13:08:03 -0700
Engine • revision c4cd48e186
Tools • Dart 3.3.4 • DevTools 2.31.1

asdfによるFlutterのインストール

asdfのインストール手順については下の記事を参照してほしい。

blog.ketus-ix.work

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

% asdf plugin add flutter
% asdf list all flutter
% asdf install flutter latest
% asdf reshim
% asdf list flutter
  3.19.6-stable

コマンド "asdf install flutter latest" はFluter SDKの最新Stable版をインストールする場合だが、下のようなコマンドによって指定したバージョンをインストールすることもできる。

% asdf install flutter 3.16.8-stable

補足情報

Homebrew環境のasdfでFlutter 3.0以降をインストールしようすると、下のようなエラーになることがある。

% asdf install flutter latest
/Users/LOGNAME/.asdf/plugins/flutter/bin/install: line 25: jq: command not found
/Users/LOGNAME/.asdf/plugins/flutter/bin/install: line 26: jq: command not found
/Users/LOGNAME/.asdf/plugins/flutter/bin/install: line 27: [: -gt: unary operator expected
Cannot find the download url for the version: 3.19.6-stable

この場合は、jqというパッケージをインストールすると解決できる。

% brew install jq

グローバルなFlutterバージョンの設定

プロジェクトディレクトリ外でもFlutter SDKのコマンドが利用できるように、グローバルなFlutterのバージョンを設定しておくことを薦める。

% asdf global flutter 3.19.6-stable
% cd
% flutter --version
Flutter 3.19.6 • channel stable • https://github.com/flutter/flutter.git
Framework • revision 54e66469a9 (2 weeks ago) • 2024-04-17 13:08:03 -0700
Engine • revision c4cd48e186
Tools • Dart 3.3.4 • DevTools 2.31.1

必要なツールのインストール

Google Chromeのインストール

FlutterによるWebアプリの動作確認に使われるので、Google Chromeが必要となる。Google Chromeの公式サイトから入手できる。

下のようなコマンドによって、Homebrewを使ってGoogle Chromeをインストールすることもできる。

% brew install --cask google-chrome

なお、Chrome派生の他のWebブラウザVivaldiなど)を使っている場合は、環境変数CHROME_EXECUTABLEにその実行ファイルのパスを指定しておけば、そちらが使われる。

Xcodeのインストール

macOSデスクトップ・アプリの開発はXcodeを使わないとできない。XcodeiOSアプリにも対応しているので、Xcodeをインストールすればこの両方を開発できる。

最新版のXcodeApp Storeから入手できる。ただし、最新版Xcodeはインストール可能なmacOSのバージョンがその時点の最新版に限定されている。

Xcode

Xcode

  • Apple
  • 開発ツール
  • 無料
apps.apple.com

最新版より古いバージョンはApple DeveloperのXcode公式サイトから入手できる。

developer.apple.com

あるいは、Xcodesというユーティリティアプリを使ってXcodeをインストールこともできる。Xcodesについては下の記事を参照してほしい。

blog.ketus-ix.work

XcodesによってXcodeをインストールした場合は、同アプリのファイル名は /Applications/Xcode-VERSION.appになってしまうので、対象バージョンのコンテキストメニューから [Xcode.appとしてシンボリックリンクを作成] を実行しておくと良いだろう。

Xcodeをインストールしたら、下のコマンドを実行しておくこと。

% sudo xcode-select --switch /Applications/Xcode.app/Contents/Developer

Flutter開発環境の状態確認

Flutter SDKにはFlutter開発環境の状態を調べてくれるコマンドがある。下のコマンドがそれだ(FVMを使っている場合のコマンドは "fvm flutter doctor")。

% flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.19.6, on macOS 12.7.4 21H1123 darwin-x64, locale ja-JP)
[✗] Android toolchain - develop for Android devices
    ✗ Unable to locate Android SDK.
      Install Android Studio from: https://developer.android.com/studio/index.html
      On first launch it will assist you in installing the Android SDK components.
      (or visit https://flutter.dev/docs/get-started/install/macos#android-setup for detailed instructions).
      If the Android SDK has been installed to a custom location, please use
      `flutter config --android-sdk` to update to that location.

[!] Xcode - develop for iOS and macOS (Xcode 14.2)
    ✗ CocoaPods not installed.
        CocoaPods is used to retrieve the iOS and macOS platform side's plugin code that responds to your plugin usage on the Dart side.
        Without CocoaPods, plugins will not work on iOS or macOS.
        For more info, see https://flutter.dev/platform-plugins
      To install see https://guides.cocoapods.org/using/getting-started.html#installation for instructions.
[✓] Chrome - develop for the web
[!] Android Studio (not installed)
[✓] VS Code (version 1.89.0)
[✓] Connected device (2 available)
[✓] Network resources

! Doctor found issues in 3 categories.

ここまでの手順操作が済んでいれば、多分上のような表示になるだろう。

問題として指摘されている "Android toolchain - Unable to locate Android SDK."、"Android Studio (not installed)" はAndroidアプリの開発に必要なコンポーネントなので、FlutterでAndroidアプリの開発を行わない場合は無視しても構わない。"Xcode - CocoaPods not installed." で指摘されているCocoaPodsはiOSアプリの開発に必要なもので、この状態でもmacOSデスクトップ・アプリの開発は行える。FlutterでiOSアプリの開発を行わない場合はこの指摘は無視しても構わない(これらのインストール方法については次の記事で説明する)。

Flutterプロジェクトの環境構築

新規プロジェクトの作成

FVMを使っている場合

% mkdir flutter_project
% cd flutter_project
% fvm use 3.19.6

No pubspec.yaml detected in this directory
✔ Would you like to continue? · yes                                                                                                                                                                                                                 
[WARN] Project is not a git repository. 
 But will set .gitignore as IDEs may use it,to determine what to index and display on searches,
You should add the fvm version directory ".fvm/" to .gitignore.
✔ Would you like to do that now? · yes                                                                                                                                                                                                              
✓ Added .fvm/ to .gitignore

✗ Could not resolve dependencies. (0.9s)

Expected to find project root in current working directory.

The error could indicate incompatible dependencies to the SDK.
✔ Would you like to continue pinning this version anyway? · yes                                                                                                                                                                                     
✓ Project now uses Flutter SDK : SDK Version : 3.19.6

% fvm flutter create .
Recreating project ....
  pubspec.yaml (created)
  README.md (created)
  lib/main.dart (created)
  test/widget_test.dart (created)
  windows/runner/flutter_window.cpp (created)
  windows/runner/utils.h (created)
  windows/runner/utils.cpp (created)
  windows/runner/runner.exe.manifest (created)
  windows/runner/CMakeLists.txt (created)
  windows/runner/win32_window.h (created)
  windows/runner/Runner.rc (created)
  windows/runner/win32_window.cpp (created)
  windows/runner/resources/app_icon.ico (created)
  windows/runner/main.cpp (created)
  windows/runner/resource.h (created)
  windows/runner/flutter_window.h (created)
  windows/flutter/CMakeLists.txt (created)
  windows/.gitignore (created)
  windows/CMakeLists.txt (created)
  ios/Runner.xcworkspace/contents.xcworkspacedata (created)
  ios/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (created)
  ios/Runner.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (created)
  ios/Runner/Info.plist (created)
  ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@2x.png (created)
  ios/Runner/Assets.xcassets/LaunchImage.imageset/README.md (created)
  ios/Runner/Assets.xcassets/LaunchImage.imageset/Contents.json (created)
  ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage@3x.png (created)
  ios/Runner/Assets.xcassets/LaunchImage.imageset/LaunchImage.png (created)
  ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@1x.png (created)
  ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@3x.png (created)
  ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@2x.png (created)
  ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@3x.png (created)
  ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-83.5x83.5@2x.png (created)
  ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-1024x1024@1x.png (created)
  ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@2x.png (created)
  ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@1x.png (created)
  ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@1x.png (created)
  ios/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json (created)
  ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-76x76@2x.png (created)
  ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-40x40@3x.png (created)
  ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-29x29@3x.png (created)
  ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@2x.png (created)
  ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-60x60@2x.png (created)
  ios/Runner/Assets.xcassets/AppIcon.appiconset/Icon-App-20x20@1x.png (created)
  ios/Runner/Base.lproj/LaunchScreen.storyboard (created)
  ios/Runner/Base.lproj/Main.storyboard (created)
  ios/Runner.xcodeproj/project.xcworkspace/contents.xcworkspacedata (created)
  ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (created)
  ios/Runner.xcodeproj/project.xcworkspace/xcshareddata/WorkspaceSettings.xcsettings (created)
  ios/Flutter/Debug.xcconfig (created)
  ios/Flutter/Release.xcconfig (created)
  ios/Flutter/AppFrameworkInfo.plist (created)
  ios/.gitignore (created)
  flutter_project.iml (created)
  web/favicon.png (created)
  web/index.html (created)
  web/manifest.json (created)
  web/icons/Icon-maskable-512.png (created)
  web/icons/Icon-192.png (created)
  web/icons/Icon-maskable-192.png (created)
  web/icons/Icon-512.png (created)
  macos/Runner.xcworkspace/contents.xcworkspacedata (created)
  macos/Runner.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (created)
  macos/RunnerTests/RunnerTests.swift (created)
  macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_32.png (created)
  macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_16.png (created)
  macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_256.png (created)
  macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_64.png (created)
  macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_512.png (created)
  macos/Runner/Assets.xcassets/AppIcon.appiconset/Contents.json (created)
  macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_128.png (created)
  macos/Runner/Assets.xcassets/AppIcon.appiconset/app_icon_1024.png (created)
  macos/Runner/DebugProfile.entitlements (created)
  macos/Runner/Base.lproj/MainMenu.xib (created)
  macos/Runner/MainFlutterWindow.swift (created)
  macos/Runner/Configs/Debug.xcconfig (created)
  macos/Runner/Configs/Release.xcconfig (created)
  macos/Runner/Configs/Warnings.xcconfig (created)
  macos/Runner/Configs/AppInfo.xcconfig (created)
  macos/Runner/AppDelegate.swift (created)
  macos/Runner/Info.plist (created)
  macos/Runner/Release.entitlements (created)
  macos/Runner.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (created)
  macos/Runner.xcodeproj/project.pbxproj (created)
  macos/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (created)
  macos/Flutter/Flutter-Debug.xcconfig (created)
  macos/Flutter/Flutter-Release.xcconfig (created)
  macos/.gitignore (created)
  android/app/src/profile/AndroidManifest.xml (created)
  android/app/src/main/res/mipmap-mdpi/ic_launcher.png (created)
  android/app/src/main/res/mipmap-hdpi/ic_launcher.png (created)
  android/app/src/main/res/drawable/launch_background.xml (created)
  android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (created)
  android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (created)
  android/app/src/main/res/values-night/styles.xml (created)
  android/app/src/main/res/values/styles.xml (created)
  android/app/src/main/res/drawable-v21/launch_background.xml (created)
  android/app/src/main/res/mipmap-xhdpi/ic_launcher.png (created)
  android/app/src/main/AndroidManifest.xml (created)
  android/app/src/debug/AndroidManifest.xml (created)
  android/settings.gradle (created)
  android/gradle/wrapper/gradle-wrapper.properties (created)
  android/gradle.properties (created)
  android/.gitignore (created)
  android/app/build.gradle (created)
  android/app/src/main/kotlin/com/example/flutter_project/MainActivity.kt (created)
  android/build.gradle (created)
  android/flutter_project_android.iml (created)
  ios/RunnerTests/RunnerTests.swift (created)
  ios/Runner/Runner-Bridging-Header.h (created)
  ios/Runner/AppDelegate.swift (created)
  ios/Runner.xcodeproj/project.pbxproj (created)
  ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme (created)
  analysis_options.yaml (created)
  .idea/runConfigurations/main_dart.xml (created)
  .idea/libraries/Dart_SDK.xml (created)
  .idea/libraries/KotlinJavaRuntime.xml (created)
  .idea/modules.xml (created)
  .idea/workspace.xml (created)
  linux/main.cc (created)
  linux/my_application.h (created)
  linux/my_application.cc (created)
  linux/flutter/CMakeLists.txt (created)
  linux/.gitignore (created)
  linux/CMakeLists.txt (created)
Resolving dependencies... (1.4s)
Got dependencies.
Wrote 128 files.

All done!
You can find general documentation for Flutter at: https://docs.flutter.dev/
Detailed API documentation is available at: https://api.flutter.dev/
If you prefer video documentation, consider: https://www.youtube.com/c/flutterdev

In order to run your application, type:

  $ cd .
  $ flutter run

Your application code is in ./lib/main.dart.

コマンド "fvm use 3.19.6" によって、指定バージョンのFlutter SDKがプロジェクトディレクトリ内の.fvmディレクトリへインストールされる。また、コマンド "fvm flutter create ." によってプロジェクトディレクトリ内にpubspec.yamlファイルが作成され、プロジェクトの基本構成ファイル一式(サンプルソースやビルド用ファイルなど)が追加される。

補足情報

FVMでインストールしたFlutterを使用する場合、Flutter SDK側のコマンド実行はすべて "fvm flutter ..." という形式になってしまう。

下のような記述を.bashrc.zshrcに追加しておくと、"fvm" を省略できるので便利だろう。

alias dart='fvm dart'
alias flutter='fvm flutter'

asdfを使っている場合

% mkdir flutter_project
% cd flutter_project
% asdf local flutter 3.19.6-stable
% flutter --version
% flutter create .

既存プロジェクトの使用

既存のFlutterプロジェクトにはpubspec.yamlというファイルが含まれており、これにプロジェクトが利用しているFlutter SDKのパッケージ情報が記載されている。

FVMを使っている場合

% cd FLUTTER_PROJECT_DIR
% fvm use 3.19.6
% fvm flutter --version
% fvm flutter pub get

asdfを使っている場合

% cd FLUTTER_PROJECT_DIR
% asdf local flutter 3.19.6-stable
% flutter --version
% flutter pub get

"flutter pub get" はFlutterの公式パッケージ配布サイトpub.devからパッケージを取得するコマンドで、このコマンドはpubspec.yamlの内容を参照しながらプロジェクトのすべての依存パッケージをインストールする。

pub.dev

Visual Studio CodeのFlutter環境設定

Flutterによるプログラム開発もVisual Studio Codeを使って行っていた。iOS/Androidアプリの開発ではXcodeAndroid Studioも併用していたが、これらはアプリのビルド設定の調整やシュミレータや実機ターゲットでのプログラムのデバッグ・動作確認の目的にしか使っていなかった。

VSCode上でのFlutter開発の準備

VSCodeを使ってFlutterプログラムの開発を行うにあたって、"Dart" と "Flutter" という2つの拡張機能を入れておく。

他にもFlutter開発向けの拡張機能が在るが、最初は最低限この2つを入れておけば良いだろう。

VSCodeでの新規プロジェクトの作成

FVMを使っている場合

VSCodeのメニュー [Manage (管理)](左下の歯車マーク) > [Settings (設定)] によって設定画面を開き、左上の [Open Settings (JSON)](書類マーク)ボタンを押す。

すると、下のような画面が開く。

このファイルの既存の内容に下のような記述を追加して、編集内容を保存する。

  • /Users/LOGNAME/Application Support/Code/User/setttings.json
  {
      "workbench.colorCustomizations": {},
      "telemetry.telemetryLevel": "off",
      "editor.minimap.enabled": false,
-     "workbench.startupEditor": "none"
+     "workbench.startupEditor": "none",
+     "dart.flutterSdkPath": "/Users/LOGNAME/fvm/versions/3.19.6"
  }

※"3.19.6" の部分は作成するプロジェクトで使用予定の(FVMでインストール済みの)Flutter SDKのバージョン、"LOGNAME" はログインユーザ名。

その後、VSCodeを再起動するか、コマンドパレット・メニュー "Developer: Reload Window" を実行する。

VSCodeが再起動したら、コマンドパレットに"Flutter" と入力し、メニューから "Flutter: New Project" を選択すると、さらにメニューが表示されるので、そのメニューから "Application"を選ぶ。

すると、ファイル選択ダイアログが開くので、プロジェクトの保存場所を選んでから、新しいプロジェクトの名前を入力する。

上記の手順に従ってVSCode上でFlutterのプロジェクトを作成すると、プロジェクトディレクトリが作成され、その中にpubspec.yamlとプロジェクトの基本構成ファイル一式が追加される。

続けて、メニュー [Terminal (ターミナル)] > [New Terminal (新しいターミナル)] によってターミナルパネルを開き、下のコマンドを実行する。

% fvm use 3.19.6

※"3.19.6" の部分は最初のsettings.json内で指定したバージョンと同一であること。

これによって、指定バージョンのFlutter SDKがプロジェクトディレクトリ内の.fvmディレクトリへインストールされ、同時に下のような内容の .vscode/settings.json ファイルも作成される。

  • .vscode/setttings.json
{
  "dart.flutterSdkPath": ".fvm/versions/3.19.6"
}

このファイルの内容を下のように編集した上で保存する。

  • .vscode/settings.json
  {
-   "dart.flutterSdkPath": ".fvm/versions/3.19.6"
+   "dart.flutterSdkPath": ".fvm/versions/3.19.6",
+   "search.exclude": {
+     "**/.fvm": true
+   },
+   "files.watcherExclude": {
+     "**/.fvm": true
+   }
  }

エクスプローラパネル内のファイル lib/main.dart を選択している状態で右下ステータスバー上の "{ }"("Dart" の左横)をクリックして、表示されるメニュー項目に "3.19.6 - Flutter SDK"("3.19.6" の部分は上のコマンド "fvm use VERSION" のバージョン文字列と一致)が存在することを確認する。存在している場合は、同項目右横のピン・マークを押す。

すると、ステータスバー上にそのバージョン番号が表示される。

この最後の操作はオプションだが、プロジェクトで使用しているFlutter SDKのバージョンが常に表示されている方が判り易くなる。

asdfを使っている場合

VSCodeのメニュー [Manage (管理)](左下の歯車マーク) > [Settings (設定)] によって設定画面を開き、左上の [Open Settings (JSON)](書類マーク)ボタンを押す。すると、/Users/LOGNAME/Application Support/Code/User/setttings.jsonというファイルが画面に表示される。

このファイルの既存の内容に下のような記述を追加して、編集内容を保存する。

  • /Users/LOGNAME/Application Support/Code/User/setttings.json
  {
      "workbench.colorCustomizations": {},
      "telemetry.telemetryLevel": "off",
      "editor.minimap.enabled": false,
-     "workbench.startupEditor": "none"
+     "workbench.startupEditor": "none",
+     "dart.flutterSdkPath": "/Users/LOGNAME/.asdf/installs/flutter/3.19.6-stable"
  }

※"3.19.6-stable" の部分は作成するプロジェクトで使用予定の(asdfでインストール済みの)Flutter SDKのバージョン、"LOGNAME" はログインユーザ名。

その後、VSCodeを再起動するか、コマンドパレット・メニュー "Developer: Reload Window" を実行する。

VSCodeが再起動したら、コマンドパレットに"Flutter" と入力し、メニューから "Flutter: New Project" を選択すると、さらにメニューが表示されるので、そのメニューから "Application"を選ぶ。

すると、ファイル選択ダイアログが開くので、プロジェクトの保存場所を選んでから、新しいプロジェクトの名前を入力する。

上記の手順に従ってVSCode上でFlutterのプロジェクトを作成すると、プロジェクトディレクトリが作成され、その中にpubspec.yamlとプロジェクトの基本構成ファイル一式が追加される。

続けて、メニュー [Terminal (ターミナル)] > [New Terminal (新しいターミナル)] によってターミナルパネルを開き、下のコマンドを実行する。

% asdf local flutter 3.19.6-stable

※"3.19.6-stable" の部分は最初のsettings.json内で指定したバージョンと同一であること。

さらに、下のような内容の .vscode/settings.json ファイルを作成する(本ファイルが存在しない場合は、コマンドパレット・メニュー "Prefereces: Open Workspace Settings (JSON)" によって作成できる)。

  • .vscode/setttings.json
{
  "dart.flutterSdkPath": "/Users/LOGNAME/.asdf/installs/flutter/3.19.6-stable"
}

※"3.19.6-stable" の部分はプロジェクトで使用するFlutter SDKのバージョン(上のコマンド "asdf local flutter VERSION" で指定したバージョン文字列)と一致していること。"LOGNAME" はログインユーザ名。

エクスプローラパネル内のファイル lib/main.dart を選択している状態で右下ステータスバー上の "{ }"("Dart" の左横)をクリックして、表示されるメニュー項目に "3.19.6 - Flutter SDK" ("3.19.6" の部分は上のコマンド "asdf local flutter VERSION" のバージョン番号と一致)が存在することを確認する。存在している場合は、同項目右横のピン・マークを押す。すると、ステータスバー上にそのバージョン番号が表示される。

この最後の操作はオプションだが、プロジェクトで使用しているFlutter SDKのバージョンが常に表示されている方が判り易くなる。

VSCodeでの既存プロジェクトの使用

FVMを使っている場合

VSCodeを起動して、既存プロジェクトのディレクトリを開く。

メニュー [Terminal (ターミナル)] > [New Terminal (新しいターミナル)] によってターミナルパネルを開き、下のコマンドを実行する。

% fvm use 3.19.6

※"3.19.6" の部分はプロジェクトで使用予定の(FVMでインストール済みの)Flutter SDKのバージョン。

これによって、指定バージョンのFlutter SDKがプロジェクトディレクトリ内の.fvmディレクトリへインストールされ、同時に下のような内容の .vscode/settings.json ファイルも作成される。

  • .vscode/setttings.json
{
  "dart.flutterSdkPath": ".fvm/versions/3.19.6"
}

.vscode/settings.json の内容を下のように編集する。

  • .vscode/settings.json
  {
-   "dart.flutterSdkPath": ".fvm/versions/3.19.6"
+   "dart.flutterSdkPath": ".fvm/versions/3.19.6",
+   "search.exclude": {
+     "**/.fvm": true
+   },
+   "files.watcherExclude": {
+     "**/.fvm": true
+   }
  }

エクスプローラパネル内のファイル lib/main.dart を選択している状態で右下ステータスバー上の "{ }"("Dart" の左横)をクリックして、表示されるメニュー項目に "3.19.6 - Flutter SDK" ("3.19.6" は上のコマンド "flutter use VERSION" のバージョン文字列と一致)が存在することを確認する。存在している場合は、同項目右横のピン・マークを押す。すると、ステータスバー上にそのバージョン番号が表示される。

この操作はオプションだが、プロジェクトで使用しているFlutter SDKのバージョンが常に表示されている方が判り易くなる。

コマンドパレットでメニュー "Flutter: Get Packages" を実行する。これによって、プロジェクトのすべての依存パッケージがインストールされる。

asdfを使っている場合

VSCodeを起動して、既存プロジェクトのディレクトリを開く。

メニュー [Terminal (ターミナル)] > [New Terminal (新しいターミナル)] によってターミナルパネルを開き、下のコマンドを実行する。

% asdf local flutter 3.19.6-stable

※"3.19.6-stable" の部分はプロジェクトで使用予定(asdfでインストール済みの)Flutter SDKのバージョン。

さらに、下のような内容のファイル .vscode/settings.jsonを作成する(本ファイルが存在しない場合は、コマンドパレット・メニュー "Prefereces: Open Workspace Settings (JSON)" によって作成できる)。

  • .vscode/setttings.json
{
  "dart.flutterSdkPath": "/Users/LOGNAME/.asdf/installs/flutter/3.19.6-stable"
}

※"3.19.6-stable" の部分は上のコマンド "asdf local flutter VERSION" で指定したバージョン文字列と一致していること。"LOGNAME" はログインユーザ名。

エクスプローラパネル内のファイル lib/main.dart を選択している状態で右下ステータスバー上の "{ }"("Dart" の左横)をクリックして、表示されるメニュー項目に "3.19.6 - Flutter SDK" ("3.19.6" の部分は上のコマンド "asdf local flutter VERSION" のバージョン番号と一致)が存在することを確認する。存在している場合は、同項目右横のピン・マークを押す。すると、ステータスバー上にそのバージョン番号が表示される。

この操作はオプションだが、プロジェクトで使用しているFlutter SDKのバージョンが常に表示されている方が判り易くなる。

コマンドパレットでメニュー "Flutter: Get Packages" を実行する。これによって、プロジェクトのすべての依存パッケージがインストールされる。

Flutterプロジェクトのビルドと動作確認

VSCodeでのFlutterプロジェクトのビルドと起動実行は簡単だ。

最初に、Flutterプロジェクトのディレクトリを開いている状態でステータスバー上のターゲットデバイス表示を押す。すると、下のようなメニューが開くので、プログラムの実行対象デバイスを選択する。

本記事の内容に従って手順操作を行っていれば、Flutterのターゲットデバイスとして上のように "Chrome" と "macOS" の2つしか表示されないはずだ。

ターゲットデバイスを選択すると、それがステータスバー上に表示される。

この状態でメニュー [Run (実行)] > [Start Debugging (デバッグの開始) F5] または [Run Without Debugging (デバッグなしで実行) ^ F5] を選ぶと、プロジェクトのビルドが行われ、ビルドが成功すれば、プログラムが起動する。

 

次の記事で、FlutterによるiOSAndroidアプリ開発環境の追加的な構築手順について書くつもりだ。

【参照リンク】

zenn.dev   

XcodesによるXcodeのインストール

Macを使ってmacOSiOS用プログラムを開発するにはXcodeが必要になる。Apple IDアカウントを作成してApple Developerサイトでユーザー登録をすれば、誰でもXcodeを入手することができる。

ただし、Xcodeはバージョン毎に使用可能なmacOSのバージョンが決まっており、最新版を入手すれば良いというものではない。自分が使っているmacOSのバージョンを調べて、それに合ったバージョンのXcodeを入手する必要がある。また、Xcodeはかなり大きなサイズのアプリなので、Apple Developerからダウンロードするのに時間がかかる。MacXcodeを導入する作業は結構面倒だったりする。

じつは、Xcodeのインストールをサクッとやれるアプリが存在する。(紛らわしい名前だが)Xcodesという奴だ。

github.com

Xcodesを見つけてから、小生はXcodeのインストールは常にこれを使って行っている。

本記事では、このXcodesについて紹介する。

コマンド版Xcodesのインストール

XcodesにはCLIコマンド版とGUIアプリ版が存在する。どちらもHomebrewを使ってインストールできる。

コマンド版Xcodesは下のコマンドによってインストールできる。

% brew install xcodes aria2

aria2が存在すると、これが利用されることでXcodesのダウンロード速度が大幅に向上するので、一緒にインストールしておくことを勧める。

コマンド版Xcodesの使用方法

Xcodesを使用するにはApple IDアカウントが必要になる。Xcodesを初めて使うときに、Apple IDアカウントのユーザー名とパスワードの入力を求められる。

コマンド版Xcodesの使い方は簡単で、多分以下の3つのコマンドくらいしか使わないだろう(他のコマンドについてはXcodesのサイトを参照してほしい)。

入手可能なXcodeバージョンの一覧表示

% xcodes list

指定バージョンのXcodeのインストール

% xcodes install VERSION

既存のXcodeバージョンのアンイストール

% xcodes uninstall VERSION

Xcodesによって取得したXcode/Applicationsフォルダ内に "Xcode-VERSION.app" というファイル名で追加される。

アプリ版Xcodesのインストール

アプリ版Xcodesは下のコマンドによってインストールできる。

% brew install --cask xcodes

アプリ版Xcodesの使用方法

/Applications/Xcodes.appを起動すると、下のような画面が表示される。

指定バージョンのXcodeのインストール

アプリ版Xcodesの使い方も簡単だ。取得したいXcodeのバージョンを選んでその右横の[インストール]ボタンを押せば、そのダウンロードとインストールが開始される。

Xcodesが動作中のmacOSバージョンに未対応のバージョンのXcodeをインストールしようとすると、下のような警告が表示されるが、この警告を無視して[インストール]を押せば、入手可能なすべてのバージョンのXcodeをインストールすることができる(Apple Developerから入手したXcodeはそのバージョンが未対応のmacOSバージョンにはインストールできない)。

既存のXcodeバージョンのアンイストール

インストール済みのXcodeを削除したい場合は、そのバージョンのコンテキストメニュー(右クリックが有効なら、右クリックによって表示されるメニュー)から[アンインストール]を選ぶと、それをアンイストールできる。