Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 10052] ファイルの概要

コミット

  • コミットハッシュ: e13635c1e0e6306a523d15ca25b62cefc978359d
  • 作成者: Mikio Hara mikioh.mikioh@gmail.com
  • 作成日: 2011年10月19日 10:54:45 +0900
  • コミットメッセージ: os/inotify: move to exp/inotify
  • レビュー: R=golang-dev, bradfitz
  • Code Review URL: https://golang.org/cl/5295044

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/e13635c1e0e6306a523d15ca25b62cefc978359d

元コミット内容

このコミットは、Go言語の標準ライブラリにおけるパッケージ再構成の一環として、Linux専用のinotifyパッケージをos/inotifyからexp/inotifyに移動させる変更を行いました。

主な変更内容:

  • src/pkg/os/inotify/ディレクトリ全体をsrc/pkg/exp/inotify/に移動
  • 4つのファイルを移動:
    • Makefile
    • inotify_linux.go
    • inotify_linux_test.go
    • およびメインのMakefileの更新

変更の背景

この変更は2011年のGo 1リリースに向けた大規模なパッケージ再構成の一環として行われました。当時、Go言語の標準ライブラリは大幅な整理が行われており、実験的または不安定なパッケージをexp/(experimental)ディレクトリに移動する方針が採られていました。

inotifyパッケージが実験的パッケージに移動された理由:

  1. プラットフォーム依存性: inotifyはLinux専用のAPIであり、クロスプラットフォーム対応のGoの哲学に完全に合致しない
  2. API の安定性: inotifyのGoバインディングAPIがまだ十分に成熟していなかった
  3. 使用頻度: 特定のプラットフォームでのみ使用される機能であり、標準ライブラリのコアに含める必要性が低い

前提知識の解説

inotifyとは

inotifyは、Linuxカーネルが提供するファイルシステムイベント通知メカニズムです。このAPIを使用することで、アプリケーションは以下のようなファイルシステムイベントを監視できます:

  • ファイルの作成、削除、変更
  • ディレクトリの作成、削除
  • ファイルの移動、リネーム
  • ファイルの読み取り、書き込み
  • ファイルの属性変更

Goの実験的パッケージ構造

Go言語では、以下のようなパッケージ階層が存在します:

  1. 標準ライブラリ: fmt, os, netなど、Go 1互換性が保証されるパッケージ
  2. 実験的パッケージ (exp/): 実験的で不安定なパッケージ
  3. 拡張パッケージ (golang.org/x/): 標準ライブラリの外部で開発されるパッケージ

Go 1以前のパッケージ構造

2011年当時、Goはまだ1.0リリース前であり、パッケージ構造が頻繁に変更されていました。パッケージは以下のような階層で管理されていました:

src/pkg/
├── os/
│   ├── inotify/    # ← この位置から移動
│   └── ...
├── exp/
│   ├── inotify/    # ← この位置に移動
│   └── ...
└── ...

技術的詳細

パッケージの移動プロセス

このコミットで実行された技術的な操作:

  1. ディレクトリ構造の変更:

    • src/pkg/os/inotify/src/pkg/exp/inotify/
  2. ビルドシステムの更新:

    • メインのMakefileでのパッケージ参照を更新
    • パッケージ固有のMakefileでのターゲット名を更新
  3. インポートパスの変更:

    • 従来: import "os/inotify"
    • 新規: import "exp/inotify"

ファイルシステムレベルの変更

# 移動されたファイル
src/pkg/os/inotify/Makefile              → src/pkg/exp/inotify/Makefile
src/pkg/os/inotify/inotify_linux.go      → src/pkg/exp/inotify/inotify_linux.go
src/pkg/os/inotify/inotify_linux_test.go → src/pkg/exp/inotify/inotify_linux_test.go

ビルドシステムの影響

Linux環境でのビルド時に、以下のような条件分岐が更新されました:

# 変更前
ifeq ($(GOOS),linux)
DIRS+=\
    os/inotify\
endif

# 変更後
ifeq ($(GOOS),linux)
DIRS+=\
    exp/inotify\
endif

コアとなるコードの変更箇所

1. メインMakefileの更新 (src/pkg/Makefile)

 ifeq ($(GOOS),linux)
 DIRS+=\
-	os/inotify\
+	exp/inotify\
 
 endif

2. パッケージMakefileの更新 (src/pkg/exp/inotify/Makefile)

 include ../../../Make.inc
 
-TARG=os/inotify
+TARG=exp/inotify
 
 GOFILES_linux=\
 	inotify_linux.go\

3. ファイルの移動

以下のファイルが物理的に移動されました:

  • inotify_linux.go: 実際のinotify APIラッパー実装
  • inotify_linux_test.go: テストファイル

コアとなるコードの解説

inotifyパッケージの機能

移動されたinotifyパッケージは、以下のような機能を提供していました:

  1. ウォッチャーの作成: ファイルシステムイベントの監視を開始
  2. イベントの受信: ファイルシステムで発生したイベントの取得
  3. フィルタリング: 監視対象のイベントタイプの指定
  4. リソース管理: ウォッチャーの適切な終了処理

典型的な使用パターン

// 移動前のインポート
import "os/inotify"

// 移動後のインポート
import "exp/inotify"

// 使用例
watcher, err := inotify.NewWatcher()
if err != nil {
    log.Fatal(err)
}
defer watcher.Close()

err = watcher.Watch("/path/to/watch")
if err != nil {
    log.Fatal(err)
}

for {
    select {
    case ev := <-watcher.Event:
        log.Printf("Event: %v", ev)
    case err := <-watcher.Error:
        log.Printf("Error: %v", err)
    }
}

パッケージの最終的な運命

このパッケージは後に以下のような経過をたどりました:

  1. 2011年: os/inotifyからexp/inotifyに移動(このコミット)
  2. 2012年頃: golang.org/x/exp/inotifyとして外部パッケージ化
  3. 現在: 非推奨となり、github.com/fsnotify/fsnotifyなどのサードパーティ製ライブラリが推奨

関連リンク

参考にした情報源リンク