1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

fvmからmiseに移行した話🐱

Posted at

要約

  • fvm、rbenv、nvmなどの複数のバージョン管理ツールをmiseに統一
  • mise.tomlでチーム内のツールバージョンを統一し、CI/CDとの連携も簡単に
  • 開発環境構築のハードルを大幅に下げることができた

はじめに

Flutterアプリ開発では複数のツールが必要になることが多く、以下のようなツールが一般的に使用されます:

  • Flutter本体
  • iOS開発のためのCocoaPods(Rubyが必要)
  • Firebaseとの連携でNode.js
  • その他のビルドツールやCLIツール

これらのツールでバージョンが異なると、様々な問題が発生します。

具体的な問題例:

  • Flutterのバージョンが異なると、ビルドに違いが出たり、フォーマットがずれる
  • CocoaPodsの場合、Rubyのバージョンが異なるとPodfile.lockのハッシュ値がずれる

意図しない差分が生まれることで、CI/CDの失敗やビルドエラーに繋がり、コードレビューの効率も低下させます。

従来は、fvm、nvm、rbenvなどの個別のバージョン管理ツールを使用していましたが、管理が煩雑になりがちでした。そこで、我々のチームではmiseを採用することにしました。

対象読者

  • Flutter開発で複数のバージョン管理ツールに悩んでいる方
  • チーム開発で環境の統一に課題を感じている方
  • miseに興味がある方

miseとは

miseは、プロジェクトごとに必要なツールのバージョンを単一の設定ファイルで管理・自動切り替えできるコマンドラインツールです。

asdfの後継として開発されており、より高速で使いやすく設計されています。

miseはRustで書かれています

miseのメリット

  • 統一管理: fvm、nvm、rbenvなどを個別にインストールする必要がない
  • 設定の一元化: mise.tomlファイルで全てのツールバージョンを管理
  • 環境の分離: ~/.local/share/miseで管理されるため、システム環境を汚さない
  • 豊富なプラグイン: 多様なツールに対応
  • 拡張機能: HooksやTasksで、チーム開発を加速

移行手順

1. 既存のfvm環境をクリーンアップ

# fvm関連を削除(プロジェクト直下)
rm .fvmrc
rm -rf .fvm

2. miseのインストール

# brewやwingetでインストール
brew install mise

# シェルに応じた設定を行う(例:zsh)
echo 'eval "$(mise activate zsh)"' >> ~/.zshrc
source ~/.zshrc

参考:

3. mise.tomlファイルの作成

プロジェクトルートにmise.tomlを作成します。我々のプロジェクトでは以下のように設定しました:

[tools]
flutter = { version = "3.35.1" }
ruby = { version = "3.4.4", os = ["macos"] }
node = { version = "22.19.0" }

"npm:firebase-tools" = "14.15.0"
"npm:cspell" = "9.2.0"

[hooks]
postinstall = [
    "echo 🔧 Running post-install hooks...",
    "gem install cocoapods -v 1.16.2 && echo '✅ Cocoapods installed successfully!'",
    "dart pub global activate flutterfire_cli && echo '✅ FlutterFire CLI installed successfully!'",
    "dart pub get && echo '✅ Flutter dependencies fetched successfully!'",
]

[tasks]

# ----- lint -----
[tasks."lint:spell"]
description = "Spell check via cspell"
run = "cspell --no-progress --dot --gitignore '**/*'"

[tasks."lint:analyze"]
description = "Dart analyze (fatal-infos)"
run = "dart analyze --fatal-infos clients/"

[tasks.lint]
description = "Run all linters"
depends = ["lint:spell", "lint:analyze"]

# その他、プロジェクト固有のタスクを定義

postinstallはmiseで用意されているフックの一つで、mise installコマンド実行後に自動で実行されます。これにより、ツールのインストール後に必要なセットアップを自動化できます。

また、toolsセクションでも、postinstallを書くことができます:

ruby = { version = "3.4.4", os = ["macos"], postinstall = "gem install cocoapods -v 1.16.2" }

ただし、これは初回インストール時にしか実行されないため、確実に実行されるhooksのpostinstallにまとめています。

CocoaPodsのインストールについて

gem:cocoapodsとしてインストールする方法もありますが、flutterfire configureでエラーになるため、postinstallでgem経由でインストールしています。

これは、Rubyがmiseで管理されたパッケージを見つけられないためです。

パスの違い:

gem installで入れた場合:

❯ which pod
~/.local/share/mise/installs/ruby/3.4.4/bin/pod

gem:xxxで入れた場合:

❯ which pod
~/.local/share/mise/installs/gem-cocoapods/1.16.2/bin/pod

gem:xxxで入れた場合、ツールとしては使用できますが、Rubyから見えないため、flutterfire configureでエラーになります。

4. ツールのインストール

# プロジェクトの信頼
mise trust

# Hooksの機能は現状実験的機能のため、以下のコマンドで有効化
mise settings experimental=true

# mise.tomlに記載されたツールをインストール
mise install

# インストール後、現在のバージョンを確認
mise current

5. 既存ツールのクリーンアップ(Optional)

fvm、rbenv、nvmなどの既存のバージョン管理ツールをアンインストールします。

既存のツールをアンインストールする前に、mise環境が正常に動作することを確認してください

実際に使ってみた感想

現在のところ、とても満足しています。特に以下の点が良かったです。

管理の簡素化

複数のバージョン管理ツールを覚える必要がなく、miseコマンド一つで全て管理できるようになりました。

チーム内での統一

mise.tomlをリポジトリに含めることで、チームメンバー全員が同じバージョンの環境で開発できます。

CI/CDとの連携

GitHub Actionsでも同じmise.tomlを参照できるため、ローカル環境とCI環境の差異を最小限に抑えられます。

- name: Install mise
  uses: jdx/mise-action@v2
  with:
    experimental: true
    cache: true
    install: true

セットアップの自動化

hooksやtasksを使用することで、ツールのインストール後に自動でセットアップが実行され、新しいメンバーの環境構築時間を大幅に短縮できました。また、何か問題があった場合も、tasksの実行で解決できることが多くなりました。

Dockerとの比較

ホストマシンの性能をフルに使用できるため、特にFlutterのようなフレームワークの場合は、非常に有用だと感じています。

まとめ

fvmからmiseに移行することで、以下のメリットを得ることができました:

  • 複数のバージョン管理ツールの統一
  • チーム内での環境統一
  • CI/CDとの連携簡素化
  • 新規メンバーの環境構築時間短縮

特にFlutter開発のような複数の言語・ツールが必要なプロジェクトや、フロントエンドとバックエンドが混在するプロジェクトでは、miseの恩恵を大きく受けることができると感じています。チーム開発での環境統一に課題を感じている方は、ぜひmiseの導入を検討してみてください。

参考リンク

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?