[インデックス 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パッケージが実験的パッケージに移動された理由:
- プラットフォーム依存性: inotifyはLinux専用のAPIであり、クロスプラットフォーム対応のGoの哲学に完全に合致しない
- API の安定性: inotifyのGoバインディングAPIがまだ十分に成熟していなかった
- 使用頻度: 特定のプラットフォームでのみ使用される機能であり、標準ライブラリのコアに含める必要性が低い
前提知識の解説
inotifyとは
inotifyは、Linuxカーネルが提供するファイルシステムイベント通知メカニズムです。このAPIを使用することで、アプリケーションは以下のようなファイルシステムイベントを監視できます:
- ファイルの作成、削除、変更
- ディレクトリの作成、削除
- ファイルの移動、リネーム
- ファイルの読み取り、書き込み
- ファイルの属性変更
Goの実験的パッケージ構造
Go言語では、以下のようなパッケージ階層が存在します:
- 標準ライブラリ:
fmt
,os
,net
など、Go 1互換性が保証されるパッケージ - 実験的パッケージ (
exp/
): 実験的で不安定なパッケージ - 拡張パッケージ (
golang.org/x/
): 標準ライブラリの外部で開発されるパッケージ
Go 1以前のパッケージ構造
2011年当時、Goはまだ1.0リリース前であり、パッケージ構造が頻繁に変更されていました。パッケージは以下のような階層で管理されていました:
src/pkg/
├── os/
│ ├── inotify/ # ← この位置から移動
│ └── ...
├── exp/
│ ├── inotify/ # ← この位置に移動
│ └── ...
└── ...
技術的詳細
パッケージの移動プロセス
このコミットで実行された技術的な操作:
-
ディレクトリ構造の変更:
src/pkg/os/inotify/
→src/pkg/exp/inotify/
-
ビルドシステムの更新:
- メインの
Makefile
でのパッケージ参照を更新 - パッケージ固有の
Makefile
でのターゲット名を更新
- メインの
-
インポートパスの変更:
- 従来:
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パッケージは、以下のような機能を提供していました:
- ウォッチャーの作成: ファイルシステムイベントの監視を開始
- イベントの受信: ファイルシステムで発生したイベントの取得
- フィルタリング: 監視対象のイベントタイプの指定
- リソース管理: ウォッチャーの適切な終了処理
典型的な使用パターン
// 移動前のインポート
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)
}
}
パッケージの最終的な運命
このパッケージは後に以下のような経過をたどりました:
- 2011年:
os/inotify
からexp/inotify
に移動(このコミット) - 2012年頃:
golang.org/x/exp/inotify
として外部パッケージ化 - 現在: 非推奨となり、
github.com/fsnotify/fsnotify
などのサードパーティ製ライブラリが推奨
関連リンク
- Go 1リリースノート
- Go パッケージ再構成の歴史
- Linux inotify(7) マニュアル
- fsnotify/fsnotify - 現在推奨されるファイルシステム監視ライブラリ
- golang.org/x/exp - Go実験的パッケージ