Upgrade to Pro — share decks privately, control downloads, hide ads and more …

tool ディレクティブを導入してみた感想

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

tool ディレクティブを導入してみた感想

Avatar for Sugar Sato

Sugar Sato

August 19, 2025
Tweet

More Decks by Sugar Sato

Other Decks in Programming

Transcript

  1. © YAMASHITA , LTD. All rights reserved. 自己紹介 • 2025年7月

    ヤマシタ入社 • HC (ホームケア)領域の基幹システム内製化 o フルサイクルエンジニア o 採用 • Go / Serverless • 植物 o アガベ o ビカクシダ • 猫 o Lambda ( 3歳) Sugar Sato (@satoIsSugar) 2
  2. © YAMASHITA, LTD. All rights reserved. 会社概要と現状 事業領域 ⚫ 業界最大規模

    ⚫ 30年の歴史・全国78拠点以上 ⚫ 大手で唯一の年中無休対応 【福祉用具レンタル・販売】 ⚫ 全国6拠点8工場体制で トラブルや災害時にも、安定供給を実現 ⚫ 契約継続率 99.9% 【リネンサプライ】 3
  3. © YAMASHITA , LTD. All rights reserved. HCシステム構成概要図 4 内勤アプリ

    外勤アプリ 営業向け 配送向け 事務向け SC向け 内勤アプリ用BFF 外勤アプリ用BFF 顧客基盤 (CRM) 社員情報基盤 請求・受注基盤 SCM基盤 MDM (マスターデータ管理) 顧客基盤 (CRM)DB 社員情報基盤DB (EntraID) 請求・受注基盤 DB SCM基盤DB DWH/データレイク (Fabric, notion) MCP ダッシュボード (Fabric/PowerB I) 外部システムI/F (API・サービス) ケアプラン連携 介護保険請求 利用者アプリ 利用者アプリBFF MCP/API 外部AIエージェント フロント層 BFF層 基幹Sys層 (API層) DB層 エンドユーザー Copilot(テキスト・音声・AI Agent) 凡例)点線 ... 直接参照もあるが、 補完的な利用 Copilot(テキスト・ 音声・AI Agent) (個別アプ リ) Power Platform / Dify MCP/API MCP/API MCP/API
  4. © YAMASHITA , LTD. All rights reserved. 7 目次 Index

    01 tool directive とは 02 導入するモチベーション 03 導入プロセス 04 課題感 05 まとめ
  5. © YAMASHITA , LTD. All rights reserved. tool directive とは

    > A tool directive adds a package as a dependency of the current module. • go 1.24 から導入 • go.mod に追記するディレクティブ • 使いかた ogo get –tool github.com/golangci/golangci-lint/v2/cmd/golangci- lint ogo tool golangci-lint • 保存先 ogo tool → $GOCACHE ▪ go tool コマンドでツールを実行できるようにする ogo install tool → $GOBIN 9
  6. © YAMASHITA , LTD. All rights reserved. 導入するモチベーション • バージョン管理の分散化

    o Makefile や GHA でバージョンが固定されている(go install) o go.mod で一元管理されていない ▪ dependabot による自動更新検知の恩恵を受けられない • 環境差分の発生 o 開発者のローカル環境にグローバルにインストールされる o プロジェクト間でバージョンの競合が発生する可能性がある 12
  7. © YAMASHITA , LTD. All rights reserved. 導入するモチベーション • 再現性の低下

    o 新規メンバーや CI 環境でのセットアップ ▪ 同じバージョンのツールがインストールされることを "保証しにくい" • 依存関係の不透明性 o プロジェクトが依存するツールとそのバージョンが一箇所で確認できない o go.mod にまとめて一元管理したい 13
  8. © YAMASHITA , LTD. All rights reserved. 導入プロセス 15 1.

    使用しているツールの洗い出し o go install 2. cli 使用箇所洗い出し 3. go get -tool 4. cli 使用箇所の変更 上記の作業を繰り返して、ツールをひとつづつマイグレーションしていく
  9. © YAMASHITA , LTD. All rights reserved. 導入プロセス - 修正版

    20 1. 使用しているツールの洗い出し o go install 2. cli 使用箇所洗い出し 3. workspace 作成 4. tool 用の ディレクトリと専用の go.mod ファイル作成 o ディレクトリ配下で go get -tool をする 5. cli 使用箇所の変更 上記の作業を繰り返して、ツールを1つづつマイグレーションしていく
  10. © YAMASHITA , LTD. All rights reserved. 課題感 25 •

    go install / go tool install を完全に排除するのが厳しそう o 例).vscode/settings.json で golangci-lint を扱うケース • go work / go.work.sum の扱い方 o Git の管理にいれるかどうか o "一般的" に go.work はコミットしない • 厳密なバージョン管理は難しそう ogolangci-lint は tool directive は非推奨としている
  11. © YAMASHITA , LTD. All rights reserved. 課題感 - go

    install / go tool install の排除 26 • 例) .vscode/settings.json で golangci-lint を扱うケース o vimmer なので自分ごとではないが、メンバーが使う環境も同様にメンテしたい気持ち o 下記の設定ができない o 対応 ▪ 対象のファイルには変更(go tool)は加えない ▪ go install tool を使ってもらう運用で回避
  12. © YAMASHITA , LTD. All rights reserved. 課題感 - go

    work / go.work.sum の扱い方 27 • Git の管理(go.work)をどうするか o "一般的" には好ましくない。 o 理由 ▪ > 親ディレクトリにある開発者自身の go.work ファイルを上書きするかもしれない ▪ CI にモジュールの依存関係の間違ったバージョンを選択させ、テストさせるかもしれない o 一方で許可するパターンもある ▪ リポジトリ内のモジュールが、外部モジュールとは一緒に開発されていない ▪ 且つ、排他的に開発されている場合 ▪ 今回のケースはこれなので go.work はコミットする! • go mod download などをすると go.work.sum の変更差分が出る o 開発環境や CI 環境でしか使わないので go.work.sum は ignore する!
  13. © YAMASHITA , LTD. All rights reserved. 課題感 - 厳密なバージョン管理は難しそう

    28 golangci-lint は tool directive は非推奨 • 理由 • ローカル環境依存 ▪ 利用する Go バージョンに依存してビルドされる ▪ 環境ごとに挙動が異なる可能性アリ • 依存関係の予期せぬアップデート ▪ go get -u を使うと依存ライブラリがアップデートされ未検証のバイナリが生成される • 他ツールやプロジェクトへの影響 ▪ tools パターンや tool コマンドでは、あるツールの依存関係が 別のツールやプロジェクトに影響を与えることがある
  14. © YAMASHITA , LTD. All rights reserved. 課題感 - 厳密なバージョン管理は難しそう

    29 golangci-lint は tool directive は非推奨 • 理由 • Go モジュールハッシュの不整合 ▪ 依存関係のタグが予期せず再生成され、ハッシュの不一致が発生するケースがある • go.mod の replace が非推移的 ▪ golangci-lint で置換設定をしても、利用者側には適用されずに 意図せずパッチ版を使う可能性アリ • main ブランチからのインストールを許容 ▪ main は安定版ではなく動作保証ができない • インストール速度が遅い ▪ バイナリに比べてビルド時間がかかる
  15. © YAMASHITA , LTD. All rights reserved. 課題感 - 厳密なバージョン管理は難しそう

    30 golangci-lint は tool directive は非推奨 • 今回のケース • 専用の go.mod を用意しているので "Method 2: dedicated module" のパターンで構築する • 提供元と違うバージョン使ってて問題が出た時 ▪ 頭の片隅に tool ディレクティブを使っている箇所が原因かもと思い出す • 厳密にやるなら別のツールを検討する • aqua • asdf のプラグイン等々
  16. © YAMASHITA , LTD. All rights reserved. まとめ 32 tool

    directive は便利なのでどんどん使っていきたい • ただし、厳密にバージョン管理して動作させたい場合には注意が必要 o プロジェクトの依存関係が変更される可能性がある o 変更されたバイナリはテストしていない o aqua とかを使った方が幸せになれそう • workspace を使った管理をするのが良さそう o golangci-lint も tool を使いたいなら個別の go.mod ファイルを指定してねと o go.work.sum は git ignore するのがよさそう