ビルドツール完全ガイド

## 目次
- [汎用ビルドツール](#汎用ビルドツール)
  - [Make](#make)
  - [CMake](#cmake)
  - [Ninja](#ninja)
  - [Bazel](#bazel)
  - [Buck](#buck)
- [言語固有のビルドツール](#言語固有のビルドツール)
  - [JavaScript/Node.js系](#javascriptnodejs系)
    - [npm](#npm)
    - [Yarn](#yarn)
    - [pnpm](#pnpm)
    - [Webpack](#webpack)
    - [Vite](#vite)
    - [Gulp](#gulp)
    - [Grunt](#grunt)
  - [Java系](#java系)
    - [Maven](#maven)
    - [Gradle](#gradle)
    - [Ant](#ant)
  - [.NET系](#net系)
    - [MSBuild](#msbuild)
    - [dotnet CLI](#dotnet-cli)
  - [Python系](#python系)
    - [setuptools](#setuptools)
    - [pip](#pip)
    - [Poetry](#poetry)
  - [Rust系](#rust系)
    - [Cargo](#cargo)
  - [Go系](#go系)
    - [Go Build](#go-build)
- [CI/CD自動化ツール](#cicd自動化ツール)
  - [Jenkins](#jenkins)
  - [GitHub Actions](#github-actions)
  - [GitLab CI/CD](#gitlab-cicd)
  - [CircleCI](#circleci)

---

## 汎用ビルドツール

### Make

Makeは最も古くからある汎用ビルドツールの一つで、特にC/C++プロジェクトで広く使われています。

#### 主要コマンド

```bash
# 基本的なビルド実行（デフォルトターゲット）
make

# 特定のターゲットをビルド
make target_name

# クリーンビルド（通常は生成物を削除するターゲット）
make clean

# 並列ビルド（8つのジョブを同時実行）
make -j8

# ドライラン（実際のコマンドを実行せず表示のみ）
make -n

# デバッグ情報を表示
make --debug

# 特定のMakefileを使用
make -f specific_makefile
```

#### よくあるはまりポイント

- インデントはタブ文字を使用する必要があり、スペースでは機能しない
- 依存関係の誤った定義によるビルドスキップ
- シェルコマンドは別々の独立したシェルで実行される（環境変数等の状態は継承されない）
- マルチコアビルドでの競合状態
- 条件分岐が直感的でない

### CMake

CMakeはビルドシステムジェネレータで、異なるプラットフォームやIDEのためのビルドファイルを生成します。

#### 主要コマンド

```bash
# ビルドディレクトリの作成と初期設定
mkdir build && cd build
cmake ..

# 特定のジェネレータを指定してCMakeを実行
cmake -G "Unix Makefiles" ..
cmake -G "Visual Studio 16 2019" ..
cmake -G "Xcode" ..

# ビルド設定を指定
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake -DCMAKE_BUILD_TYPE=Debug ..

# ビルド実行
cmake --build .

# 特定のターゲットをビルド
cmake --build . --target target_name

# インストール
cmake --install .
cmake --build . --target install

# クリーン
cmake --build . --target clean

# CMakeキャッシュを削除してリセット
rm -rf CMakeCache.txt CMakeFiles/
```

#### よくあるはまりポイント

- CMakeのバージョン間の非互換性
- プロジェクトやライブラリの検出に関する問題
- 変数スコープの理解不足
- ソースディレクトリとビルドディレクトリの混同
- クロスコンパイル設定の複雑さ

### Ninja

Ninjaは高速ビルドのために設計された、低レベルなビルドシステムです。

#### 主要コマンド

```bash
# ビルド実行
ninja

# 特定のターゲットをビルド
ninja target_name

# クリーンビルド
ninja clean

# 再ビルド
ninja -t clean && ninja

# 依存関係の表示
ninja -t deps

# ターゲット一覧の表示
ninja -t targets

# 詳細な出力
ninja -v
```

#### よくあるはまりポイント

- 通常は直接使うよりもCMakeなどから生成して使う
- 構文が厳格でエラーメッセージが簡素
- 大規模プロジェクトでのメモリ使用量
- デバッグ情報が限られている

### Bazel

Googleによるスケーラブルでクロスプラットフォームなビルドシステムです。

#### 主要コマンド

```bash
# プロジェクトのビルド
bazel build //path/to:target

# 全てのターゲットをビルド
bazel build //...

# テスト実行
bazel test //path/to:test_target

# 全てのテストを実行
bazel test //...

# アプリケーション実行
bazel run //path/to:binary

# クリーン
bazel clean

# 完全クリーン（キャッシュも含む）
bazel clean --expunge

# 依存関係の可視化
bazel query --noimplicit_deps "deps(//path/to:target)" --output graph
```

#### よくあるはまりポイント

- 初期の学習曲線が急
- WORKSPACE設定とリポジトリルールの複雑さ
- Sandboxingによる問題（特に外部リソースへのアクセス）
- キャッシュの不適切な使用によるビルドの再現性問題
- ビルドパスとターゲット仕様の理解

### Buck

Facebookによる高速で再現性のあるビルドシステムです。

#### 主要コマンド

```bash
# ターゲットのビルド
buck build //path/to:target

# 複数ターゲットのビルド
buck build //path/to:target1 //path/to:target2

# テスト実行
buck test //path/to:test

# アプリケーション実行
buck run //path/to:binary

# クリーン
buck clean

# キャッシュの無効化
buck clean --cache

# ターゲットの依存関係可視化
buck query "deps(//path/to:target)"
```

#### よくあるはまりポイント

- セルの概念とマルチリポジトリ設定の複雑さ
- 設定ファイル（BUCK）の構文エラー
- パッケージとエイリアスルールの理解
- キャッシュと増分ビルドの問題
- 複数プラットフォーム向けビルドの設定

---

## 言語固有のビルドツール

### JavaScript/Node.js系

#### npm

Node.jsのデフォルトパッケージマネージャです。

##### 主要コマンド

```bash
# プロジェクト初期化
npm init
npm init -y  # デフォルト値ですべて承認

# パッケージインストール
npm install package_name
npm i package_name  # 短縮形

# 開発依存関係としてインストール
npm install package_name --save-dev
npm i -D package_name  # 短縮形

# グローバルインストール
npm install -g package_name

# package.jsonの依存関係をすべてインストール
npm install
npm i

# パッケージの更新
npm update
npm update package_name

# package.jsonのスクリプト実行
npm run script_name
npm start  # npm run startの短縮形
npm test   # npm run testの短縮形

# アウトデートパッケージの確認
npm outdated

# パッケージの削除
npm uninstall package_name
npm remove package_name  # 別名

# npmキャッシュのクリア
npm cache clean --force

# package-lock.jsonの再生成
npm i --package-lock-only
```

##### よくあるはまりポイント

- package-lock.jsonの競合
- 異なるnpmバージョン間の非互換性
- ライブラリバージョン間の依存関係の衝突
- グローバルvsローカルインストールの混同
- 権限問題（特にLinux/MacOSでのグローバルインストール）

#### Yarn

Facebookによる代替NPMクライアントです。

##### 主要コマンド

```bash
# プロジェクト初期化
yarn init
yarn init -y  # デフォルト値ですべて承認

# パッケージインストール
yarn add package_name

# 開発依存関係としてインストール
yarn add package_name --dev
yarn add -D package_name  # 短縮形

# グローバルインストール
yarn global add package_name

# package.jsonの依存関係をすべてインストール
yarn
yarn install

# パッケージの更新
yarn upgrade
yarn upgrade package_name

# package.jsonのスクリプト実行
yarn run script_name
yarn start  # yarn run startの短縮形
yarn test   # yarn run testの短縮形

# アウトデートパッケージの確認
yarn outdated

# パッケージの削除
yarn remove package_name

# キャッシュのクリア
yarn cache clean
```

##### よくあるはまりポイント

- npmとyarnの混合使用によるロックファイルの不整合
- Yarn 1.xとYarn 2.x+（Berry）の大きな違い
- workspacesの設定ミス
- resolutionsフィールドの正しい使用方法
- オフラインモードでの問題

#### pnpm

ディスク容量を節約するパッケージマネージャです。

##### 主要コマンド

```bash
# プロジェクト初期化
pnpm init

# パッケージインストール
pnpm add package_name

# 開発依存関係としてインストール
pnpm add -D package_name

# グローバルインストール
pnpm add -g package_name

# package.jsonの依存関係をすべてインストール
pnpm install

# パッケージの更新
pnpm update
pnpm update package_name

# package.jsonのスクリプト実行
pnpm run script_name
pnpm start
pnpm test

# パッケージの削除
pnpm remove package_name

# キャッシュのクリア
pnpm store prune
```

##### よくあるはまりポイント

- シンボリックリンクとハードリンクに関連する問題
- npmやyarnからの移行時の互換性
- フラットな依存関係構造ではなく厳格な依存関係ツリーを使用
- 一部のツールやフレームワークとの互換性問題
- workspacesの設定と理解

#### Webpack

モジュールバンドラーで、Webアプリケーションのアセットをバンドルします。

##### 主要コマンド

```bash
# 開発モードでビルド
npx webpack --mode=development

# 本番モードでビルド
npx webpack --mode=production

# 設定ファイルを指定してビルド
npx webpack --config webpack.specific.config.js

# 開発サーバーの起動
npx webpack serve

# ウォッチモードでビルド（変更を監視）
npx webpack --watch

# バンドルの分析
npx webpack --analyze
```

##### よくあるはまりポイント

- ローダーとプラグインの区別と適切な設定
- コード分割とチャンキングの最適化
- 大きなバンドルサイズと長いビルド時間
- 開発環境と本番環境の設定差分管理
- ソースマップの適切な設定
- 複雑な設定ファイルの管理

#### Vite

次世代フロントエンド開発ツールで、非常に高速な開発体験を提供します。

##### 主要コマンド

```bash
# プロジェクト作成
npm create vite@latest my-app
npm create vite@latest my-app -- --template react

# 開発サーバー起動
npm run dev

# プロジェクトビルド
npm run build

# ビルド結果のプレビュー
npm run preview

# 依存関係の最適化
npx vite optimize
```

##### よくあるはまりポイント

- Webpackからの移行時の設定の違い
- 開発環境と本番環境での動作の違い
- レガシーブラウザ対応の設定
- プラグイン設定のミス
- 特定フレームワークとの統合時の問題

#### Gulp

ストリームベースのタスクランナーです。

##### 主要コマンド

```bash
# デフォルトタスク実行
npx gulp

# 特定のタスク実行
npx gulp task_name

# 複数タスクの逐次実行
npx gulp task1 task2

# タスク一覧表示
npx gulp --tasks

# 詳細情報表示
npx gulp --verbose
```

##### よくあるはまりポイント

- Node.jsストリームの理解不足
- 古いGulp 3.xとGulp 4.xのタスク定義の違い
- 非同期タスクの正しい終了処理
- プラグインのバージョン互換性
- エラーハンドリングの不備

#### Grunt

設定ベースのタスクランナーです。

##### 主要コマンド

```bash
# デフォルトタスク実行
npx grunt

# 特定のタスク実行
npx grunt task_name

# 複数タスクの実行
npx grunt task1 task2

# 詳細情報表示
npx grunt --verbose

# 特定の設定ファイルを使用
npx grunt --gruntfile specific-gruntfile.js
```

##### よくあるはまりポイント

- 冗長な設定ファイルの管理
- タスク間のデータ受け渡し
- エラーハンドリングの複雑さ
- パフォーマンスの問題（ディスクI/Oの多用）
- ファイルパスの正規表現理解

### Java系

#### Maven

Javaプロジェクト管理とビルドツールです。

##### 主要コマンド

```bash
# プロジェクトビルド
mvn clean install

# テスト実行
mvn test

# テストスキップしてビルド
mvn clean install -DskipTests

# 特定フェーズを実行
mvn compile
mvn package

# 依存関係ツリーの表示
mvn dependency:tree

# プロジェクト作成
mvn archetype:generate

# ローカルリポジトリの依存関係を強制更新
mvn clean install -U

# 特定のプロファイルを有効化
mvn clean install -P profile_name

# Mavenラッパーの生成
mvn wrapper:wrapper
```

##### よくあるはまりポイント

- 複雑なpom.xml構造の管理
- 依存関係の衝突解決
- スコープ（compile, test, provided, runtime）の理解不足
- マルチモジュールプロジェクトの管理
- プラグインのバージョン指定がないことによる予期せぬ動作

#### Gradle

柔軟でパワフルなJVM言語向けビルドツールです。

##### 主要コマンド

```bash
# プロジェクトビルド
./gradlew build

# テスト実行
./gradlew test

# クリーンビルド
./gradlew clean build

# 特定のタスク実行
./gradlew taskName

# タスク一覧表示
./gradlew tasks

# 依存関係の表示
./gradlew dependencies

# プロジェクト情報の表示
./gradlew projects

# デーモンの停止
./gradlew --stop

# 特定のプロジェクトのタスク実行（マルチプロジェクト）
./gradlew :subproject:taskName

# デバッグモード
./gradlew taskName --debug
```

##### よくあるはまりポイント

- Groovy DSLとKotlin DSLの混同
- タスク依存関係と実行順序の理解不足
- configurationとtaskの違いの理解
- Gradle Daemonの問題
- キャッシュとインクリメンタルビルドの仕組み理解
- Mavenとの互換性問題

#### Ant

XMLベースの古いJavaビルドツールです。

##### 主要コマンド

```bash
# デフォルトターゲット実行
ant

# 特定のターゲット実行
ant target_name

# ビルドファイルを指定
ant -f specific-build.xml

# プロパティを設定
ant -Dproperty=value

# 詳細表示
ant -verbose

# デバッグモード
ant -debug
```

##### よくあるはまりポイント

- XMLの冗長性と可読性の低さ
- 依存関係管理機能の欠如（Ivy併用が必要）
- タスク間のデータ共有の複雑さ
- プロジェクト構造の標準化がない
- エラーメッセージの不明瞭さ

### .NET系

#### MSBuild

Microsoft .NETアプリケーションのビルドプラットフォームです。

##### 主要コマンド

```bash
# プロジェクトのビルド
msbuild Project.csproj

# ソリューションのビルド
msbuild Solution.sln

# リリースビルド
msbuild Project.csproj /p:Configuration=Release

# 特定ターゲットの実行
msbuild Project.csproj /t:Target

# 複数ターゲットの実行
msbuild Project.csproj /t:Clean;Build

# 詳細表示
msbuild Project.csproj /v:detailed

# プロパティの設定
msbuild Project.csproj /p:Property=Value

# 最大CPUカウント使用
msbuild Project.csproj /m
```

##### よくあるはまりポイント

- 複雑なXML構造の理解と管理
- カスタムターゲットとタスクの実装の複雑さ
- プロパティとアイテムの違いの理解
- ビルド順序の制御の難しさ
- 条件付きビルドロジックの複雑な構文

#### dotnet CLI

.NET Coreアプリケーションのビルドとランタイム管理ツールです。

##### 主要コマンド

```bash
# プロジェクト作成
dotnet new console
dotnet new webapi
dotnet new classlib

# プロジェクトビルド
dotnet build

# プロジェクト実行
dotnet run

# テスト実行
dotnet test

# パッケージ発行
dotnet publish

# NuGetパッケージの追加
dotnet add package PackageName

# プロジェクト参照の追加
dotnet add reference ../OtherProject/OtherProject.csproj

# ソリューションにプロジェクトを追加
dotnet sln add Project/Project.csproj

# NuGetパッケージの復元
dotnet restore

# クリーン
dotnet clean
```

##### よくあるはまりポイント

- .NET Frameworkと.NET Core/.NET 5+の違いの理解
- グローバルツールとローカルツールの混同
- ターゲットフレームワークバージョンの理解不足
- パッケージ参照とプロジェクト参照の管理
- 異なるランタイム環境での動作の違い

### Python系

#### setuptools

Pythonのパッケージング標準ライブラリです。

##### 主要コマンド

```bash
# パッケージのインストール
pip install .

# 開発モードでのインストール
pip install -e .

# ソースディストリビューションの作成
python setup.py sdist

# ホイールの作成
python setup.py bdist_wheel

# egg形式の作成
python setup.py bdist_egg

# クリーン
python setup.py clean
```

##### よくあるはまりポイント

- setup.pyとPyproject.toml、setup.cfgの関係理解
- パッケージデータファイルの含め方
- 依存関係の適切な指定方法
- 開発依存関係と実行時依存関係の区別
- エントリーポイントの正しい定義

#### pip

Pythonパッケージのインストールと管理ツールです。

##### 主要コマンド

```bash
# パッケージインストール
pip install package_name

# 特定バージョンのインストール
pip install package_name==1.0.0

# 要件ファイルからインストール
pip install -r requirements.txt

# パッケージのアップグレード
pip install --upgrade package_name

# パッケージのアンインストール
pip uninstall package_name

# インストール済みパッケージ一覧
pip list

# アウトデートパッケージの確認
pip list --outdated

# パッケージの詳細情報
pip show package_name

# ホイールのインストール
pip install some_package-1.0-py3-none-any.whl

# キャッシュのクリア
pip cache purge
```

##### よくあるはまりポイント

- 仮想環境外でのグローバルインストール
- 依存関係の衝突解決の複雑さ
- バージョン指定の書式ミス
- システム依存パッケージのビルド失敗
- プロキシ/ネットワーク関連問題

#### Poetry

モダンなPythonの依存関係管理とパッケージングツールです。

##### 主要コマンド

```bash
# プロジェクト初期化
poetry init

# パッケージインストール
poetry add package_name

# 開発依存関係のインストール
poetry add --dev package_name

# 全依存関係のインストール
poetry install

# 依存関係のアップデート
poetry update

# パッケージの削除
poetry remove package_name

# スクリプト実行
poetry run python script.py

# 仮想環境のシェルを開く
poetry shell

# ビルド（wheel & sdist）
poetry build

# 発行
poetry publish
```

##### よくあるはまりポイント

- pipとの併用による混乱
- 複雑な依存関係解決の遅さ
- pyproject.tomlの正しい構成
- 既存プロジェクトへの移行の複雑さ
- 仮想環境管理の理解

### Rust系

#### Cargo

Rustの公式パッケージマネージャとビルドツールです。

##### 主要コマンド

```bash
# 新規プロジェクト作成
cargo new project_name
cargo init  # 既存ディレクトリ内で初期化

# ビルド
cargo build
cargo build --release  # 最適化ビルド

# 実行
cargo run
cargo run --release

# テスト実行
cargo test

# ドキュメント生成
cargo doc
cargo doc --open  # 生成して開く

# 依存関係の更新確認
cargo update

# コード整形
cargo fmt

# リントチェック
cargo clippy

# クレートの公開
cargo publish

# クリーン
cargo clean
```

##### よくあるはまりポイント

- 依存関係のバージョン指定の書式
- features（機能フラグ）の理解と指定
- クロスコンパイル設定
- ワークスペースの適切な構成
- 条件付きコンパイルの設定
- ビルドスクリプトの複雑さ

### Go系

#### Go Build

Go言語の標準ビルドツールです。

##### 主要コマンド

```bash
# ビルド
go build
go build ./...  # すべてのパッケージをビルド

# 実行
go run main.go
go run .

# テスト実行
go test
go test ./...  # すべてのパッケージをテスト
go test -v  # 詳細表示

# パッケージのインストール
go install

# 依存関係の取得
go get package_name
go get -u package_name  # 更新も含む

# モジュール初期化
go mod init module_name

# 依存関係の整理
go mod tidy

# モジュール情報の表示
go list -m all

# クロスコンパイル
GOOS=linux GOARCH=amd64 go build
```

##### よくあるはまりポイント

- GOPATHとGO111MODULEの理解
- プライベートリポジトリからの依存関係取得
- バージョン選択アルゴリズムの理解
- クロスコンパイルでのCGO関連問題
- ビルドタグと条件付きコンパイル
- ベンダリングの管理

---

## CI/CD自動化ツール

### Jenkins

拡張性の高いオープンソースの自動化サーバーです。

#### 主要コマンド

```bash
# Jenkinsファイルの検証
curl --user username:password -X POST -F "jenkinsfile=<Jenkinsfile" http://jenkins-url/pipeline-model-converter/validate

# ジョブのビルド実行
curl -X POST http://jenkins-url/job/job_name/build

# パラメータ付きジョブの実行
curl -X POST http://jenkins-url/job/job_name/buildWithParameters?PARAM=value

# ジョブのステータス取得
curl http://jenkins-url/job/job_name/lastBuild/api/json

# Jenkins CLIの利用
java -jar jenkins-cli.jar -s http://jenkins-url/ command
```

#### よくあるはまりポイント

- 権限と認証の複雑な設定
- プラグイン互換性と更新問題
- パイプラインスクリプトの複雑さ
- マスタ/エージェントの設定と管理
- リソース消費の最適化
- 並行ビルドでの競合状態

### GitHub Actions

GitHubリポジトリに統合されたCI/CDプラットフォームです。

#### 主要構成

```yaml
# 基本的なワークフロー
name: CI
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: ステップ名
        run: echo "コマンド実行"

# マトリックスビルド
jobs:
  test:
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest]
        node: [14, 16, 18]

# 環境変数の設定
env:
  GLOBAL_VAR: value
jobs:
  build:
    env:
      JOB_VAR: value

# シークレットの使用
steps:
  - name: シークレットを使用
    env:
      SECRET_KEY: ${{ secrets.SECRET_NAME }}

# アーティファクトの保存
steps:
  - uses: actions/upload-artifact@v3
    with:
      name: artifact-name
      path: path/to/artifact

# キャッシュの利用
steps:
  - uses: actions/cache@v3
    with:
      path: path/to/cache
      key: ${{ runner.os }}-key
```

#### よくあるはまりポイント

- ワークフローYAML構文エラー
- 実行環境の違いによる問題（Linux vs Windows vs macOS）
- シークレット管理とセキュリティ設定
- ジョブ間でのデータ共有の複雑さ
- アクション権限の設定ミス
- レート制限と実行時間制限の理解

### GitLab CI/CD

GitLabに組み込まれたCI/CDシステムです。

#### 主要構成

```yaml
# 基本的なパイプライン
stages:
  - build
  - test
  - deploy

build-job:
  stage: build
  script:
    - echo "ビルド実行"

# キャッシュの設定
cache:
  key: ${CI_COMMIT_REF_SLUG}
  paths:
    - node_modules/

# アーティファクトの設定
job:
  artifacts:
    paths:
      - build/
    expire_in: 1 week

# 環境変数
variables:
  VARIABLE_NAME: "value"

# 条件付き実行
job:
  rules:
    - if: $CI_COMMIT_BRANCH == "main"
  
# マトリックスビルド
job:
  parallel:
    matrix:
      - PYTHON_VERSION: ["3.8", "3.9", "3.10"]
```

#### よくあるはまりポイント

- YAMLの構文エラーと空白の扱い
- 変数スコープの理解（グローバルvsジョブレベル）
- ランナー設定と管理
- キャッシュ戦略の最適化
- 複雑なルールと条件式の評価
- ジョブ依存関係の正しい定義

### CircleCI

クラウドベースのCI/CDサービスです。

#### 主要構成

```yaml
# 基本設定
version: 2.1
jobs:
  build:
    docker:
      - image: cimg/base:2022.06
    steps:
      - checkout
      - run: echo "ビルド実行"

# ワークフロー定義
workflows:
  version: 2
  build_and_test:
    jobs:
      - build
      - test:
          requires:
            - build

# オーブの使用
orbs:
  node: circleci/node@5.0.0

# キャッシュの設定
steps:
  - restore_cache:
      keys:
        - v1-dependencies-{{ checksum "package.json" }}
  - save_cache:
      paths:
        - node_modules
      key: v1-dependencies-{{ checksum "package.json" }}

# 並列テスト
steps:
  - run:
      command: |
        circleci tests glob "test/**/*.js" | circleci tests split --split-by=timings
      parallelism: 4
```

#### よくあるはまりポイント

- コンテキストとシークレット管理
- 複数ジョブ間のデータ共有
- 正しいDockerイメージの選択
- ワークフロー設計と依存関係の設定
- パフォーマンスとクレジット最適化
- オーブとカスタムコマンドの適切な使用