[インデックス 12224] ファイルの概要
このコミットは、Go言語の公式インストール手順に関するドキュメントファイル doc/install.html の更新です。具体的には、FreeBSDおよびLinux環境でGoをアップグレードする際に、既存のGoバージョンを事前に削除する必要があることを明示的に指示する内容が追加されています。
コミット
- コミットハッシュ:
e10dc82ce09f49438d1d43fd630d18d6ee242512 - 作者: Andrew Gerrand adg@golang.org
- コミット日時: 2012年2月27日 月曜日 14:16:56 +1100
- コミットメッセージ:
doc: instruct freebsd/linux users to rm the old version first R=golang-dev, r CC=golang-dev https://golang.org/cl/5701052
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/e10dc82ce09f49438d1d43fd630d18d6ee242512
元コミット内容
doc: instruct freebsd/linux users to rm the old version first
このコミットは、FreeBSDおよびLinuxユーザーに対して、Goの新しいバージョンをインストールする前に古いバージョンを削除するよう指示するドキュメントの変更です。
変更の背景
Go言語のインストールは、通常、アーカイブファイルを特定のディレクトリ(慣例的に /usr/local/go)に展開することで行われます。しかし、既存のGoインストールがある環境で新しいバージョンを単に上書き展開しようとすると、古いバージョンのファイルが残存したり、新しいバージョンと古いバージョンのファイルが混在したりする可能性があります。これにより、予期せぬ動作、コンパイルエラー、またはランタイムエラーが発生する原因となります。
このコミットが行われた2012年2月時点では、Goはまだ初期の成長段階にあり、多くのユーザーが頻繁に新しいバージョンへのアップグレードを行っていました。このような状況下で、クリーンなアップグレードパスを確保し、ユーザーが遭遇する可能性のある一般的な問題を未然に防ぐために、公式ドキュメントに明確な指示を追加する必要性が生じました。特に、Goのバイナリは静的リンクされることが多いですが、それでも古いライブラリやツールが残存することで問題が発生する可能性はあります。この変更は、ユーザーエクスペリエンスの向上と、サポートコストの削減を目的としています。
前提知識の解説
- Go言語のインストール: Go言語は、通常、公式ウェブサイトから提供されるバイナリアーカイブ(
.tar.gzファイルなど)をダウンロードし、それを特定のディレクトリ(例:/usr/local)に展開することでインストールされます。展開後、Goの実行ファイルへのパス(例:/usr/local/go/bin)をシステムのPATH環境変数に追加することで、どこからでもgoコマンドを実行できるようになります。 /usr/local/go: これはGo言語の公式なインストールガイドで推奨されるデフォルトのインストールパスです。多くのUnix系システムでは、/usr/localはシステム全体で利用可能なソフトウェアをインストールするための標準的な場所として使われます。rm -rコマンド: Unix/Linuxシステムにおけるrmコマンドはファイルを削除するために使用されます。-rオプション(または--recursive)は、ディレクトリとその内容を再帰的に削除するために必要です。このコマンドは非常に強力であり、誤って実行すると重要なファイルを失う可能性があるため、使用には注意が必要です。tar -xzfコマンド:tarはアーカイブファイル(.tar)を操作するためのコマンドです。-xは展開(extract)、-zはgzip圧縮されたファイル(.gz)を扱う、-fはファイル名を指定する、という意味です。tar -C /usr/local -xzf go.release.go1.tar.gzは、go.release.go1.tar.gzというファイルを/usr/localディレクトリに展開することを意味します。これにより、通常は/usr/local/goというディレクトリが作成され、その中にGoのインストールファイルが配置されます。sudoコマンド:sudo(superuser do)は、許可されたユーザーが、セキュリティポリシーで定義されているように、別のユーザー(通常はスーパーユーザー、つまりroot)としてコマンドを実行できるようにするプログラムです。/usr/localのようなシステムディレクトリにファイルを書き込んだり削除したりするには、通常root権限が必要です。PATH環境変数:PATH環境変数は、オペレーティングシステムが実行可能ファイルを探すディレクトリのリストです。goコマンドなどをどこからでも実行できるようにするためには、Goのバイナリが置かれているディレクトリ(例:/usr/local/go/bin)をPATHに追加する必要があります。- アップグレードの課題: ソフトウェアのアップグレードにおいて、古いバージョンを完全に削除せずに新しいバージョンをインストールすると、設定ファイル、ライブラリ、または実行可能ファイルの古いバージョンが残存し、新しいバージョンと競合する「ゴミ」が残ることがよくあります。これは特に、ファイル名が変更されたり、ディレクトリ構造が変更されたりした場合に顕著です。
技術的詳細
このコミットは、Goのインストール手順を記述したHTMLドキュメント doc/install.html を修正しています。変更の核心は、FreeBSDおよびLinuxユーザーがGoをアップグレードする際に、既存のGoインストールディレクトリ /usr/local/go を完全に削除する手順を明示的に追加した点にあります。
以前のドキュメントでは、単に新しいアーカイブを /usr/local に展開するよう指示していましたが、これは既存のインストールを上書きするだけでした。しかし、Goのバージョンアップでは、ファイル構成の変更や、古いバージョンで存在したが新しいバージョンでは不要になったファイルなどが生じる可能性があります。これらの残存ファイルが、新しいGo環境の動作に悪影響を及ぼすことを避けるため、クリーンな状態からインストールし直すことが最善のアプローチと判断されました。
追加されたrm -r /usr/local/goコマンドは、Goのインストールディレクトリ全体を再帰的に削除します。これにより、古いGoバージョンに関連するすべてのファイルが確実に消去され、新しいGoバージョンが完全にクリーンな環境にインストールされることが保証されます。
また、tarコマンドとrmコマンドの両方がroot権限またはsudoを必要とする可能性があるという注意書きが、より適切な位置に移動され、両方のコマンドに適用されるように修正されています。これは、ユーザーが権限不足でコマンド実行に失敗するのを防ぐための、実用的な改善です。
この変更は、Goのインストールプロセスにおける堅牢性を高め、ユーザーが直面する可能性のある一般的なインストール関連の問題を減らすことに貢献しています。ドキュメントの明確化は、ソフトウェアの使いやすさと安定性にとって非常に重要です。
コアとなるコードの変更箇所
doc/install.html ファイルにおいて、以下の変更が行われました。
--- a/doc/install.html
+++ b/doc/install.html
@@ -68,16 +68,26 @@ export PATH=$PATH:$GOROOT/bin
<h3 id="freebsd_linux">FreeBSD and Linux</h3>
+<p>
+On FreeBSD and Linux, if you are upgrading from an older version of Go you must
+first remove the existing version from <code>/usr/local/go</code>:
+</p>
+
+<pre>
+rm -r /usr/local/go
+</pre>
+
<p>
Extract the archive into <code>/usr/local</code>, creating a Go tree in
-<code>/usr/local/go</code> (typically this must be run as root or through
-<code>sudo</code>):
+<code>/usr/local/go</code>:
</p>
<pre>
tar -C /usr/local -xzf go.release.go1.tar.gz
</pre>
+<p>(Typically these commands must be run as root or through <code>sudo</code>.)</p>
+
<p>
Add <code>/usr/local/go/bin</code> to the <code>PATH</code> environment
variable. You can do this by adding this line to your <code>/etc/profile</code>
コアとなるコードの解説
この変更は、doc/install.html のFreeBSDおよびLinuxセクションに、Goのアップグレードに関する重要な指示を追加しています。
-
新しい段落の追加:
<p> On FreeBSD and Linux, if you are upgrading from an older version of Go you must first remove the existing version from <code>/usr/local/go</code>: </p>この段落は、Goの古いバージョンからアップグレードする際に、まず既存の
/usr/local/goディレクトリを削除する必要があることを明確に述べています。これにより、ユーザーはアップグレードプロセスを開始する前に、この重要なステップを見落とすことがなくなります。 -
rm -rコマンドの追加:<pre> rm -r /usr/local/go </pre>preタグで囲まれたこのコードブロックは、実際に実行すべきコマンドrm -r /usr/local/goを示しています。preタグは整形済みテキストを表示するために使用され、コマンドラインの例に適しています。これにより、ユーザーはコマンドを正確にコピー&ペーストできます。 -
sudoに関する注意書きの移動と修正:-<code>/usr/local/go</code> (typically this must be run as root or through -<code>sudo</code>): +<code>/usr/local/go</code>:<p>(Typically these commands must be run as root or through <code>sudo</code>.)</p>以前は
tarコマンドの直後にあった「通常、これらのコマンドはrootまたはsudoで実行する必要がある」という注意書きが削除され、代わりにtarコマンドブロックの後に独立した段落として追加されました。これにより、この注意書きがrm -rコマンドとtarコマンドの両方に適用されることが明確になります。これは、両方の操作がシステムディレクトリへの書き込み/削除を伴うため、適切な権限が必要となることをユーザーに伝える上でより正確な表現です。
これらの変更は、Goのインストール手順をより堅牢で分かりやすいものにし、特にアップグレード時の潜在的な問題を回避するための重要なガイダンスを提供します。
関連リンク
- Go言語公式ウェブサイト: https://go.dev/
- Go言語インストールガイド (現在のバージョン): https://go.dev/doc/install
- このコミットのGerrit Code Reviewリンク: https://golang.org/cl/5701052
参考にした情報源リンク
- Go言語の公式ドキュメント (現在のインストールガイド): https://go.dev/doc/install
- Unix/Linux
rmコマンドのマニュアルページ (概念): https://man7.org/linux/man-pages/man1/rm.1.html - Unix/Linux
tarコマンドのマニュアルページ (概念): https://man7.org/linux/man-pages/man1/tar.1.html - Unix/Linux
sudoコマンドのマニュアルページ (概念): https://man7.org/linux/man-pages/man8/sudo.8.html PATH環境変数に関する一般的な情報 (例: Wikipedia): https://ja.wikipedia.org/wiki/PATH/usr/localに関する一般的な情報 (例: Filesystem Hierarchy Standard): https://ja.wikipedia.org/wiki/Filesystem_Hierarchy_Standard- Go言語のリリースノートや変更履歴 (当時の状況を理解するため): https://go.dev/doc/devel/release (当時の具体的なリリースノートは、Go 1のリリース前後の情報が参考になる)
- Go言語のGerrit Code Reviewシステムに関する情報: https://go.dev/doc/contribute (GerritのCLリンクの背景を理解するため)
- Go言語のインストールに関する一般的なトラブルシューティング記事やフォーラムの議論 (当時のユーザーが直面していた問題を推測するため)