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

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

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 するのがよさそう