[インデックス 12752] ファイルの概要
このコミットは、Go言語のディストリビューションツール (misc/dist/bindist.go
) に、Windows向けMSIインストーラーの作成時に使用するカスタムの installer.wxs
ファイルを指定するための -wxs
フラグを追加するものです。これにより、Goの公式ディストリビューションプロセスにおいて、インストーラーのカスタマイズ性が向上します。
コミット
commit bfdc45a456d5931e670f299ab7b4f68ecf570bff
Author: Andrew Gerrand <adg@golang.org>
Date: Mon Mar 26 17:32:20 2012 +1100
misc/dist: add -wxs flag to provide custom installer.wxs file
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5908055
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/bfdc45a456d5931e670f299ab7b4f68ecf570bff
元コミット内容
misc/dist: add -wxs flag to provide custom installer.wxs file
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/5908055
変更の背景
Go言語のディストリビューションプロセスでは、Windowsユーザー向けにMSIインストーラーが提供されています。このインストーラーは、WiX Toolsetというツールキットを使用して installer.wxs
というXMLファイルから生成されます。
従来のプロセスでは、misc/dist/windows/installer.wxs
という固定のパスにあるファイルがインストーラー生成に使用されていました。しかし、Goのディストリビューションをビルドする際に、特定の要件やカスタマイズされた設定を持つインストーラーを作成したい場合、この固定パスでは柔軟性がありませんでした。
このコミットは、bindist.go
ツールに -wxs
という新しいコマンドラインフラグを追加することで、ユーザーが任意のパスにある installer.wxs
ファイルを指定できるようにし、インストーラー生成プロセスのカスタマイズ性を向上させることを目的としています。これにより、Goの公式ビルドプロセスや、サードパーティによるGoディストリビューションのビルドにおいて、より多様なインストーラー要件に対応できるようになります。
前提知識の解説
MSIインストーラー
MSI (Microsoft Software Installer) は、Microsoft Windowsオペレーティングシステムで使用されるインストールパッケージの形式です。.msi
拡張子を持つファイルで、ソフトウェアのインストール、メンテナンス、削除に関する情報を含んでいます。Windows Installerサービスによって処理され、ソフトウェアの展開と管理を標準化します。
WiX Toolset (Windows Installer XML Toolset)
WiX Toolsetは、Windows Installer (MSI) パッケージをXMLソースコードからビルドするためのオープンソースのツールセットです。開発者は、インストーラーの構造、ファイル、レジストリエントリ、ショートカットなどをXML形式で記述し、WiX Toolsetのコンパイラ (candle.exe
) とリンカー (light.exe
) を使用してMSIファイルを生成します。
WXSファイル
WXS (WiX Source) ファイルは、WiX Toolsetで使用されるXML形式のソースファイルです。このファイルには、MSIインストーラーのすべての定義が含まれています。例えば、インストールされるファイル、ディレクトリ構造、レジストリ設定、ユーザーインターフェースの要素などが記述されます。Product
、Package
、Directory
、Component
、File
、Feature
などの要素が主要な構成要素となります。
Go言語の flag
パッケージ
Go言語の標準ライブラリには、コマンドライン引数を解析するための flag
パッケージが含まれています。このパッケージを使用すると、プログラムの起動時にユーザーが指定できるオプション(フラグ)を簡単に定義できます。例えば、flag.String
関数は文字列型のフラグを定義し、その値を変数にバインドします。
技術的詳細
このコミットの技術的詳細の核心は、Go言語のディストリビューションビルドスクリプトである misc/dist/bindist.go
に、新しいコマンドラインフラグ -wxs
を追加し、そのフラグの値に基づいてMSIインストーラーのWXSソースファイルのパスを動的に変更する点にあります。
-
フラグの定義:
bindist.go
のvar
ブロック内に、wxsFile
という新しいグローバル変数がflag.String
を使って定義されています。var ( // ... 既存のフラグ定義 ... wxsFile = flag.String("wxs", "", "path to custom installer.wxs") // ... )
"wxs"
: コマンドラインで指定するフラグ名です。例えば、go run bindist.go -wxs /path/to/my_installer.wxs
のように使用されます。""
:wxsFile
フラグのデフォルト値です。何も指定されない場合は空文字列になります。"path to custom installer.wxs"
: このフラグの簡単な説明です。
-
WXSファイルパスの動的な設定:
Build
構造体のDo
メソッド内で、Windows向けMSIインストーラーを作成するロジックの箇所に、追加されたフラグの値をチェックする条件分岐が導入されています。func (b *Build) Do() error { // ... 既存のロジック ... // Create MSI installer. win := filepath.Join(b.root, "misc/dist/windows") installer := filepath.Join(win, "installer.wxs") if *wxsFile != "" { installer = *wxsFile } // ... MSIインストーラー生成の残りのロジック ... }
- まず、デフォルトの
installer.wxs
のパス (misc/dist/windows/installer.wxs
) がinstaller
変数に設定されます。 - 次に、
if *wxsFile != ""
という条件で、ユーザーが-wxs
フラグに値を指定したかどうかをチェックします。*wxsFile
は、flag.String
で定義されたポインタから実際の文字列値を取得しています。 - もし
wxsFile
フラグが空文字列でなければ(つまり、ユーザーがカスタムパスを指定した場合)、installer
変数の値はユーザーが指定したパス (*wxsFile
) で上書きされます。 - これにより、その後のMSIインストーラー生成プロセスでは、この
installer
変数に格納されたパスのWXSファイルが使用されることになります。
- まず、デフォルトの
この変更により、Goのディストリビューションビルド時に、標準の installer.wxs
ではなく、特定の要件に合わせたカスタムのWXSファイルを使用してインストーラーを生成することが可能になります。これは、例えば、特定の企業環境向けのGoインストーラーにカスタムのライセンス条項を含めたり、特定のディレクトリ構造にインストールさせたりする際に非常に有用です。
コアとなるコードの変更箇所
diff --git a/misc/dist/bindist.go b/misc/dist/bindist.go
index b03fd706db..115049aa68 100644
--- a/misc/dist/bindist.go
+++ b/misc/dist/bindist.go
@@ -33,6 +33,7 @@ var (
repo = flag.String("repo", "https://code.google.com/p/go", "repo URL")
verbose = flag.Bool("v", false, "verbose output")
upload = flag.Bool("upload", true, "upload resulting files to Google Code")
+ wxsFile = flag.String("wxs", "", "path to custom installer.wxs")
username, password string // for Google Code upload
)
@@ -248,6 +249,9 @@ func (b *Build) Do() error {
// Create MSI installer.
win := filepath.Join(b.root, "misc/dist/windows")
installer := filepath.Join(win, "installer.wxs")
+ if *wxsFile != "" {
+ installer = *wxsFile
+ }
appfiles := filepath.Join(work, "AppFiles.wxs")
msi := filepath.Join(work, "installer.msi")
// Gather files.
コアとなるコードの解説
上記の差分は、misc/dist/bindist.go
ファイルに対する2つの主要な変更を示しています。
-
新しいフラグの追加:
+ wxsFile = flag.String("wxs", "", "path to custom installer.wxs")
この行は、Goの
flag
パッケージを使用して、wxsFile
という名前の新しいコマンドラインフラグを定義しています。"wxs"
: コマンドラインでこのオプションを指定する際に使用する名前です。""
: このフラグのデフォルト値です。ユーザーが-wxs
オプションを指定しない場合、wxsFile
の値は空文字列になります。"path to custom installer.wxs"
: このフラグが何をするのかを説明する短いヘルプメッセージです。 この定義により、bindist.go
を実行する際に-wxs <path>
の形式でカスタムWXSファイルのパスを渡せるようになります。
-
WXSファイルパスの条件付き上書き:
+ if *wxsFile != "" { + installer = *wxsFile + }
このコードブロックは、MSIインストーラーを生成する部分に挿入されています。
installer := filepath.Join(win, "installer.wxs")
: まず、installer
変数には、GoディストリビューションのデフォルトのWXSファイルパス(misc/dist/windows/installer.wxs
)が設定されます。if *wxsFile != ""
: ここで、新しく定義されたwxsFile
フラグにユーザーが何らかの値を指定したかどうかをチェックします。*wxsFile
は、flag.String
が返すポインタの参照外しを行い、フラグの実際の文字列値を取得しています。installer = *wxsFile
: もしwxsFile
フラグが空でなければ(つまり、カスタムパスが指定された場合)、installer
変数の値は、ユーザーが-wxs
フラグで指定したパスに上書きされます。
この変更により、bindist.go
は、デフォルトのWXSファイルを使用するか、ユーザーが指定したカスタムWXSファイルを使用するかを動的に決定できるようになり、GoのWindowsインストーラービルドプロセスの柔軟性が大幅に向上します。
関連リンク
- Go言語の公式ウェブサイト: https://golang.org/
- WiX Toolset 公式ウェブサイト: https://wixtoolset.org/
- Go言語の
flag
パッケージドキュメント: https://pkg.go.dev/flag
参考にした情報源リンク
- Web search results for "WXS file MSI installer Go distribution WiX Toolset" (Google Search)
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEMPO0vZjjZNxWin1mJgLsyMxdI3f7Q25hxdGjOTWRzN-3-jr4OeUQVKRG9OzcFKSKbPQYgQPyCKjZV7EaOKTUnetCuS5_cupkgRxSAobijZQxboWAgKnn5IVWRNQSVu1poiI2VJOKWLhOHaa1mlPHCDXxT5PDNIFbqsrSTcvJQfsG_watq5bhKDkc3er3ZM1Vrig==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQHHjg9g2k7gXLRhbc2wmgK6p7KPmjSIDe8E7mNKdu4A23cwZkeUGEcaqdncd_WvbRjWageobfOHK7xJ9Mv_l5_tYyrbeTAxzURwYEnQmiXYVnOpE7dK1848KEB22kUaeU=
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQH3LRXG4hZERcTJ856z9xeKwr-jipUyviRGVE9R9S4YJdHvzSNPyBzAvpSa6u_IWcYhaoyMd0awxe_5TOZQQWnN04eMy6Y4kSoVwueTRmWmzRjAXwpQxN5drH026L-vUJUdVSOt8UnhOCGb2v0OAcCyJlv-iE0nzlVIYHSQ0om6COFVvfjOSVYdQeZ0l-2U8ARoBA==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEFjmyyVo5f7rSZQCjSl8eXjFT7FzPwqQpmnKeoNUp6RnE30VJvWC148EC0-PCqpQSGZYJqk2cJvSOOxke37aQujtvJjT0qeexTYUGLW4KcRMDT17sXx5PE-LlqcvtT6iGgfJpPIxdbk6nkGfV3PteDgNjCtw==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQGCxfAQguTWR4oYFUDGnfd4XwQtPQJznQaF5u2ewAIfj3rj9xkm9vxgxklRr0nnZJL3Fg1diTWm2W9X1GhuyPpk4oN_lu5U_4E7lJF4Fb4QbB-ESvPMHihfGPNJL0==
- https://vertexaisearch.cloud.google.com/grounding-api-redirect/AUZIYQEYStRZauIJ_rYS5OoZZrVplJ9ZTXNNxbcjeg7gYoxpSUQKTZs_cvS7Hx2h7jT8Ouh9NZsc45CFoOAh2PzgGlrmW3b0NXSMFYMoXopsiAx6BAHVhOiPRCf28H7B26JnQeyi8olWNQGijR4mYj3y6KAUiudDYLaYJS_Ipc=