[インデックス 10438] ファイルの概要
このコミットは、Go言語のWindowsインストーラー(MSI)の機能改善に関する中間チェックインです。主な変更点として、ユーザーがGoのインストールディレクトリを任意に選択できるようになり、プログラムメニューにGoフォルダが追加され、デスクトップにGo環境設定用とgodocサーバー起動用のショートカットが配置されるようになりました。また、Go環境設定用のバッチファイル(goenv.bat
)とgodocサーバー起動用のバッチファイル(godocserver.bat
)が新規に追加され、インストーラーのWix定義ファイル(installer.wxs
)が大幅に更新されています。これにより、WindowsユーザーのGo開発環境のセットアップがより簡単かつ効率的になることを目指しています。
コミット
commit 984b4e381dc571e961934acbd5d4af329ae8afb9
Author: Joe Poirier <jdpoirier@gmail.com>
Date: Thu Nov 17 17:54:06 2011 -0600
misc/windows packager development intermediate check-in
The installer now: allows a user to select an alternative
install directory, it now adds a Go folder to the Programs
Menu, and it places two shortcuts on the user's desktop.
The Program Menu folder contains shortcuts to the uninstaller
and two batch files, go.bat and godoc.bat. The desktop
shortcuts also point to go.bat and godoc.bat.
go.bat sets the Go environment, including Path, and spawns a
Window's shell. godoc.bat starts the godoc server at
localhost:6060 then spawns a browser window pointing to the
document server.
Setting the environment temporarily and spawning a shell, via
go.bat, should be safer than messing with the system's environment
and it makes the user experience a bit more streamlined.
The packager does work in its current state but it still needs
some polishing. And yes, the plan is to add a dialogue to allow
the user to decline the desktop shortcuts.
R=rsc, alex.brainman, tjyang2001
CC=golang-dev
https://golang.org/cl/5399042
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/984b4e381dc571e961934acbd5d4af329ae8afb9
元コミット内容
misc/windows packager development intermediate check-in
The installer now: allows a user to select an alternative
install directory, it now adds a Go folder to the Programs
Menu, and it places two shortcuts on the user's desktop.
The Program Menu folder contains shortcuts to the uninstaller
and two batch files, go.bat and godoc.bat. The desktop
shortcuts also point to go.bat and godoc.bat.
go.bat sets the Go environment, including Path, and spawns a
Window's shell. godoc.bat starts the godoc server at
localhost:6060 then spawns a browser window pointing to the
document server.
Setting the environment temporarily and spawning a shell, via
go.bat, should be safer than messing with the system's environment
and it makes the user experience a bit more streamlined.
The packager does work in its current state but it still needs
some polishing. And yes, the plan is to add a dialogue to allow
the user to decline the desktop shortcuts.
R=rsc, alex.brainman, tjyang2001
CC=golang-dev
https://golang.org/cl/5399042
変更の背景
この変更の背景には、Go言語のWindowsユーザーがより簡単に開発環境をセットアップできるようにするという目的があります。以前のインストーラーでは、インストールパスの選択肢が限られていたり、環境変数の設定がシステム全体に影響を与えたりする可能性がありました。
このコミットでは、以下の課題を解決しようとしています。
- インストールパスの柔軟性: ユーザーがGoをインストールするディレクトリを自由に選択できるようにすることで、既存のシステム構成との競合を避け、よりパーソナライズされた環境構築を可能にします。
- 環境設定の安全性と利便性: システムの環境変数を永続的に変更するのではなく、Go開発用のシェルを起動する際に一時的に環境を設定するアプローチを採用することで、システム全体の安定性を保ちつつ、Go開発に必要な環境を簡単に利用できるようにします。これにより、ユーザーはGoのバージョン管理や複数のGo環境の切り替えをより安全に行えるようになります。
- アクセス性の向上: プログラムメニューやデスクトップにショートカットを配置することで、Goコマンドラインツールや
godoc
サーバーへのアクセスを容易にし、ユーザーエクスペリエンスを向上させます。特にgodoc
はGoのドキュメントをローカルで参照するための重要なツールであり、その起動を簡素化することは開発者にとって大きなメリットとなります。 - インストーラーの機能強化: WiX Toolsetを用いたインストーラーの定義を改善し、より洗練されたインストールプロセスを提供することを目指しています。
これらの改善は、Go言語のWindowsユーザーベースを拡大し、開発者の生産性を向上させるための重要なステップでした。
前提知識の解説
このコミットを理解するためには、以下の技術的な前提知識が必要です。
-
Go言語の環境変数 (
GOROOT
,GOBIN
,PATH
):GOROOT
: Goのインストールディレクトリのルートパスを指します。Goのコンパイラ、標準ライブラリ、ツールなどがこのディレクトリ以下に配置されます。GOBIN
: Goの実行可能ファイル(go
コマンド、gofmt
など)がインストールされるディレクトリを指します。通常は$GOROOT/bin
に設定されます。PATH
: オペレーティングシステムが実行可能ファイルを探すディレクトリのリストです。GOBIN
をPATH
に追加することで、コマンドプロンプトやPowerShellからGoのツールを直接実行できるようになります。- このコミットでは、システム全体の
PATH
を永続的に変更するのではなく、Go開発用のシェルを起動する際に一時的にこれらの環境変数を設定するアプローチが取られています。
-
godoc
コマンドとgodoc
サーバー:godoc
はGoのドキュメンテーションツールです。Goのソースコードからコメントや宣言を抽出し、HTML形式で表示したり、コマンドラインで検索したりできます。godoc -http=:6060
のように実行すると、ローカルのWebサーバーとして起動し、ブラウザからGoの標準ライブラリやインストールされているパッケージのドキュメントを参照できるようになります。これはGo開発において非常に重要なリソースです。
-
Windows Installer (MSI):
- Microsoft Windows Installerは、Windowsオペレーティングシステムにおけるソフトウェアのインストール、メンテナンス、削除のための標準的なフレームワークです。
.msi
ファイルは、インストールに必要なすべての情報(ファイル、レジストリエントリ、ショートカットなど)を含むデータベースです。
- Microsoft Windows Installerは、Windowsオペレーティングシステムにおけるソフトウェアのインストール、メンテナンス、削除のための標準的なフレームワークです。
-
WiX Toolset (Windows Installer XML):
- WiX Toolsetは、Microsoftが開発したオープンソースのツールセットで、XMLコードを使用してWindows Installerパッケージ(MSI)を構築するために使用されます。開発者はXMLファイルでインストールのロジック、ファイル、レジストリエントリ、ショートカットなどを定義し、WiXコンパイラ(
candle.exe
)とリンカー(light.exe
)を使用してMSIファイルを生成します。 installer.wxs
はWiXのソースファイルであり、インストーラーの振る舞いを定義します。Product
要素: MSIパッケージの最上位要素で、製品のID、名前、バージョン、製造元などを定義します。Package
要素: MSIパッケージの一般的な属性(圧縮形式、言語など)を定義します。Directory
要素: インストール先のディレクトリ構造を定義します。Component
要素: インストールされる個々のリソース(ファイル、レジストリエントリ、ショートカットなど)を定義します。各コンポーネントにはGUIDが割り当てられ、インストーラーがコンポーネントのインストール状態を追跡するために使用します。Feature
要素: ユーザーがインストール時に選択できる機能のグループを定義します。Shortcut
要素: デスクトップやスタートメニューに作成されるショートカットを定義します。CustomAction
: インストールプロセス中に実行されるカスタムアクション(例: 環境変数の設定、スクリプトの実行)を定義します。WixUIExtension
: WiX Toolsetが提供する標準的なユーザーインターフェース(UI)拡張機能です。これにより、インストールパスの選択ダイアログなどが簡単に実装できます。
- WiX Toolsetは、Microsoftが開発したオープンソースのツールセットで、XMLコードを使用してWindows Installerパッケージ(MSI)を構築するために使用されます。開発者はXMLファイルでインストールのロジック、ファイル、レジストリエントリ、ショートカットなどを定義し、WiXコンパイラ(
-
バッチファイル (.bat):
- Windowsのコマンドプロンプトで実行されるスクリプトファイルです。一連のコマンドを自動的に実行するために使用されます。
@echo off
: コマンドの実行結果を非表示にします。setlocal
/endlocal
: 環境変数の変更をバッチファイルの実行スコープに限定します。endlocal
が実行されると、setlocal
以降の環境変数の変更は元に戻ります。これにより、システム全体の環境を汚染することなく、一時的な環境設定が可能になります。for /f "delims=" %%i in ('cd') do set cwd=%%i
: 現在の作業ディレクトリを取得し、cwd
変数に設定します。start
: 新しいウィンドウでプログラムやドキュメントを開きます。%~dpi
: バッチファイル自身のパスからドライブとパスのみを取得します。
技術的詳細
このコミットにおける技術的な変更は、主にGo言語のWindowsインストーラーの機能とユーザーエクスペリエンスを向上させることに焦点を当てています。
-
WiX定義ファイル (
misc/windows/installer.wxs
) の大幅な変更:- インストールディレクトリの選択: 以前は固定されていたインストールパスが、ユーザーが選択できるように変更されました。これは、
WixUI_InstallDir
UI拡張機能の導入と、INSTALLDIR
プロパティの利用によって実現されています。SetDirectory Id="INSTALLDIRROOT" Value="C:\\"
: インストールルートのデフォルト値をC:\
に設定。Directory Id="INSTALLDIR" Name="Go"
:INSTALLDIRROOT
の下にGo
ディレクトリを作成するよう定義。Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR"
: UIでINSTALLDIR
プロパティを操作できるように設定。<UIRef Id="WixUI_InstallDir" />
: インストールディレクトリ選択UIを組み込み。
- プログラムメニューとデスクトップショートカットの追加:
ProgramMenuFolder
とDesktopFolder
ディレクトリが定義され、その中にGo関連のショートカットが作成されるようになりました。GoProgramShortcutsDir
という新しいディレクトリがプログラムメニュー内に作成され、その中にGo環境設定、godocサーバー起動、アンインストーラーへのショートカットが配置されます。- デスクトップにはGo環境設定とgodocサーバー起動のショートカットが直接配置されます。
- ショートカットは、新しく追加されたバッチファイル(
goenv.bat
とgodocserver.bat
)をターゲットとしています。 - アンインストーラーへのショートカットは、
msiexec.exe /x [ProductCode]
コマンドを実行することで、現在の製品をアンインストールするように設定されています。
- 環境変数の設定方法の変更:
- 以前のバージョンでは、インストーラーが直接システム環境変数
GOROOT
,GOBIN
,PATH
を永続的に設定していました。 - このコミットでは、これらの環境変数をインストーラーが直接設定するのではなく、
goenv.bat
というバッチファイル内で一時的に設定し、その環境で新しいコマンドプロンプトを起動する方式に変更されました。これにより、システム全体の環境を汚染することなく、Go開発に必要な環境を安全に提供できるようになります。 CustomAction Id="SetApplicationRootDirectory"
が追加され、ARPINSTALLLOCATION
プロパティにINSTALLDIR
の値を設定しています。これは、コントロールパネルの「プログラムと機能」で表示されるアプリケーションのインストール場所情報に使用されます。
- 以前のバージョンでは、インストーラーが直接システム環境変数
- アーキテクチャ判定の追加:
<?if $(var.Arch) = 386 ?>
のようなWiXプリプロセッサディレクティブが追加され、ビルド時のアーキテクチャ(386またはamd64)に基づいて、適切なシステムフォルダ(SystemFolder
またはSystem64Folder
)が選択されるようになりました。これにより、32ビットと64ビットのWindowsシステム両方に対応したインストーラーを生成できます。
- コメントの追加と整理: WiX XMLファイル内のコメントが整理され、より理解しやすくなっています。
- インストールディレクトリの選択: 以前は固定されていたインストールパスが、ユーザーが選択できるように変更されました。これは、
-
新規バッチファイル (
misc/windows/godocserver.bat
とmisc/windows/goenv.bat
) の追加:godocserver.bat
:- このバッチファイルは、
godoc.exe
が存在するかどうかをチェックし、存在しない場合はエラーメッセージを表示します。 start bin\godoc -http=localhost:6060 -goroot="%cwd%"
:godoc
サーバーをlocalhost:6060
で起動します。-goroot
オプションで現在のGoインストールディレクトリを明示的に指定しています。start http://localhost:6060
: 起動したgodoc
サーバーのURLをデフォルトのWebブラウザで開きます。setlocal
/endlocal
を使用することで、このバッチファイル内で設定される環境変数が、バッチファイルの実行終了後に自動的に元に戻るようにしています。
- このバッチファイルは、
goenv.bat
:- このバッチファイルは、Goのコンパイラ(
6g.exe
または8g.exe
)が存在するかどうかをチェックし、Goのアーキテクチャ(amd64または386)を判定します。 set GOROOT=%cwd%
: 現在のGoインストールディレクトリをGOROOT
に設定します。set GOBIN=%GOROOT%\bin
:GOBIN
を%GOROOT%\bin
に設定します。set PATH=%GOBIN%;%PATH%
:GOBIN
を既存のPATH
の先頭に追加します。これにより、Goのツールが優先的に検索されるようになります。@CMD /F:ON
: 新しいコマンドプロンプトウィンドウを起動し、その中でGoの環境変数が設定された状態にします。/F:ON
はファイルとディレクトリ名の補完を有効にするオプションです。- こちらも
setlocal
/endlocal
を使用しており、このバッチファイルから起動されたコマンドプロンプト内でのみGoの環境変数が有効になります。
- このバッチファイルは、Goのコンパイラ(
-
misc/windows/package.bash
の変更:heat
コマンドの-dr
オプションの値がAPPLICATIONROOTDIRECTORY
からINSTALLDIR
に変更されました。これは、WiX定義ファイル内のディレクトリIDの変更に合わせたものです。heat
はWiX Toolsetの一部で、既存のディレクトリ構造からWiXコンポーネントとファイル定義を自動生成するために使用されます。light
コマンドに-ext WixUIExtension -ext WixUtilExtension
オプションが追加されました。これにより、WiX UI拡張機能とWiXユーティリティ拡張機能がリンカーに明示的に渡され、インストーラーにUI機能が組み込まれるようになります。
これらの変更により、GoのWindowsインストーラーはより堅牢で、ユーザーフレンドリーなものになりました。特に、環境変数を一時的に設定するアプローチは、システムへの影響を最小限に抑えつつ、Go開発を始めるための障壁を低くする点で重要です。
コアとなるコードの変更箇所
このコミットで変更された主要なファイルは以下の通りです。
misc/windows/LICENSE
: 新規追加。Goのライセンスファイル。misc/windows/godocserver.bat
: 新規追加。godoc
サーバーを起動し、ブラウザで開くためのバッチファイル。misc/windows/goenv.bat
: 新規追加。Goの環境変数を設定し、新しいコマンドシェルを起動するためのバッチファイル。misc/windows/installer.wxs
: 既存ファイルの変更。WiXインストーラーの定義ファイル。インストールパスの選択、プログラムメニュー/デスクトップショートカットの追加、環境設定ロジックの変更など、大幅な修正が行われています。misc/windows/package.bash
: 既存ファイルの変更。インストーラーパッケージングスクリプト。heat
およびlight
コマンドの引数が更新されています。
コアとなるコードの解説
misc/windows/installer.wxs
(抜粋と解説)
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<!-- ... (既存のコメントと定義) ... -->
<?if $(var.Arch) = 386 ?>
<?define SYSFOLDER=SystemFolder ?>
<?define Win64=no ?>
<?else?>
<?define SYSFOLDER=System64Folder ?>
<?define Win64=yes ?>
<?endif?>
<Product
Id="FF5B30B2-08C2-11E1-85A2-6ACA4824019B"
Name="The Go Programming Language $(var.Arch) $(var.Version)"
Language="1033"
Version="0.0.0.0"
Manufacturer="http://golang.org"
UpgradeCode="1C3114EA-08C3-11E1-9095-7FCA4824019B" >
<!-- ... (Product, Package, Media, Condition要素) ... -->
<SetDirectory Id="INSTALLDIRROOT" Value="C:\"/>
<CustomAction
Id="SetApplicationRootDirectory"
Property="ARPINSTALLLOCATION"
Value="[INSTALLDIR]" />
<!-- Define the directory structure and environment variables -->
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="INSTALLDIRROOT">
<Directory Id="INSTALLDIR" Name="Go"/>
</Directory>
<Directory Id="ProgramMenuFolder">
<Directory Id="GoProgramShortcutsDir" Name="Go Programming"/>
</Directory>
<Directory Id="DesktopFolder" Name="Desktop"/>
</Directory>
<!-- Programs Menu & Desktop Shortcuts -->
<DirectoryRef Id="GoProgramShortcutsDir">
<Component Id="Component_GoShortCuts" Guid="f5fbfb5e-6c5c-423b-9298-21b0e3c98f4b">
<Shortcut
Id="GoEnvStartMenuShortcut"
Name="GoEnv"
Description="Sets the Go environment and spawns a shell window"
Target="[INSTALLDIR]goenv.bat" />
<Shortcut
Id="GoEnvDesktopShortcut"
Directory="DesktopFolder"
Name="GoEnv"
Description="Sets the Go environment and spawns a shell window"
Target="[INSTALLDIR]goenv.bat" />
<Shortcut
Id="GoDocServerStartMenuShortcut"
Name="GoDocServer"
Description="Starts the godoc server on localhost:6060"
Target="[INSTALLDIR]godocserver.bat" />
<Shortcut
Id="GoDocServerDesktopShortcut"
Directory="DesktopFolder"
Name="GoDocServer"
Description="Starts the godoc server on localhost:6060"
Target="[INSTALLDIR]godocserver.bat" />
<Shortcut
Id="UninstallShortcut"
Name="Uninstall Go"
Description="Uninstalls Go and all of its components"
Target="[$(var.SYSFOLDER)]msiexec.exe"
Arguments="/x [ProductCode]" />
<RemoveFolder
Id="GoProgramShortcutsDir"
On="uninstall" />
<RegistryValue
Root="HKCU"
Key="Software\Microsoft\TheGoProgrammingLanguage"
Name="installed"
Type="integer"
Value="1"
KeyPath="yes" />
</Component>
</DirectoryRef>
<!-- Components -->
<DirectoryRef Id="INSTALLDIR">
<Component Id="Component_GoDocServerBAT" Guid="c40ea60a-4290-4a91-864d-e1d8eb5cf693">
<File
Id="FILE_GoDocServerBat"
Source="godocserver.bat"
KeyPath="yes" />
</Component>
<Component Id="Component_GoEnvBAT" Guid="ee4587d3-fba3-47f9-b45e-ec9ca9c8a9c3">
<File
Id="FILE_GoEnvBat"
Source="goenv.bat"
KeyPath="yes" />
</Component>
</DirectoryRef>
<!-- Install the files -->
<Feature
Id="GoTools"
Title="Go"
Level="1">
<ComponentGroupRef Id="AppFiles" />
<ComponentRef Id="Component_GoDocServerBAT" />
<ComponentRef Id="Component_GoEnvBAT" />
<ComponentRef Id="Component_GoShortCuts" />
</Feature>
<!-- Update the environment -->
<InstallExecuteSequence>
<Custom
Action="SetApplicationRootDirectory"
Before="InstallFinalize" />
</InstallExecuteSequence>
<!-- Include the user interface -->
<WixVariable Id="WixUILicenseRtf" Value="LICENSE" />
<Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR" />
<UIRef Id="WixUI_InstallDir" />
</Product>
</Wix>
解説:
<?if $(var.Arch) ... ?>
: ビルド時のアーキテクチャに応じてSYSFOLDER
変数を設定し、32ビット/64ビットシステムに対応したパスを動的に生成します。SetDirectory Id="INSTALLDIRROOT" Value="C:\\"
: インストール先のルートディレクトリのデフォルト値をC:\
に設定します。CustomAction Id="SetApplicationRootDirectory"
: インストール完了前に実行されるカスタムアクションで、コントロールパネルに表示されるアプリケーションのインストール場所を設定します。Directory
要素群: インストール先のディレクトリ構造を定義します。INSTALLDIR
がGoのインストールルート、ProgramMenuFolder
とDesktopFolder
がそれぞれプログラムメニューとデスクトップに対応します。DirectoryRef Id="GoProgramShortcutsDir"
内のComponent_GoShortCuts
:Shortcut
要素で、goenv.bat
とgodocserver.bat
へのショートカットをプログラムメニューとデスクトップに作成します。UninstallShortcut
は、msiexec.exe
を使ってGoをアンインストールするためのショートカットです。RemoveFolder
は、アンインストール時にプログラムメニューのGoフォルダを削除します。RegistryValue
は、インストールされたことを示すレジストリエントリを作成します。
DirectoryRef Id="INSTALLDIR"
内のComponent_GoDocServerBAT
とComponent_GoEnvBAT
:- それぞれ
godocserver.bat
とgoenv.bat
ファイルをGoのインストールディレクトリに配置するためのコンポーネントです。KeyPath="yes"
は、このファイルがコンポーネントのキーパスであることを示し、インストーラーがコンポーネントの存在を判断するために使用します。
- それぞれ
Feature Id="GoTools"
: インストールされる機能のグループを定義し、上記のコンポーネントを参照します。InstallExecuteSequence
内のCustom Action="SetApplicationRootDirectory"
: インストール実行シーケンスのInstallFinalize
アクションの前にSetApplicationRootDirectory
カスタムアクションを実行するよう指定します。WixVariable Id="WixUILicenseRtf" Value="LICENSE"
: ライセンスファイルとしてLICENSE
を使用することをUIに伝えます。Property Id="WIXUI_INSTALLDIR" Value="INSTALLDIR"
とUIRef Id="WixUI_InstallDir"
: WiXの標準UI拡張機能であるWixUI_InstallDir
を使用し、ユーザーがインストールディレクトリを選択できるようにします。
misc/windows/godocserver.bat
@echo off
setlocal
for /f "delims=" %%i in ('cd') do set cwd=%%i
if exist bin\godoc.exe goto ok
echo Unable to find the godoc executable
echo This batch file must run from the root Go folder
pause
exit
:ok
start bin\godoc -http=localhost:6060 -goroot="%cwd%"
start http://localhost:6060
endlocal
解説:
@echo off
: コマンドの表示をオフにします。setlocal
: バッチファイル内で設定される環境変数をローカルスコープに限定します。for /f "delims=" %%i in ('cd') do set cwd=%%i
: 現在の作業ディレクトリをcwd
変数に格納します。if exist bin\godoc.exe goto ok
:bin
ディレクトリにgodoc.exe
が存在するかチェックします。存在しない場合はエラーメッセージを表示して終了します。start bin\godoc -http=localhost:6060 -goroot="%cwd%"
:godoc
サーバーをlocalhost:6060
で起動します。-goroot
オプションで現在のGoインストールパスを明示的に指定することで、godoc
が正しいGoのソースコードを見つけられるようにします。start http://localhost:6060
: デフォルトのWebブラウザでgodoc
サーバーのURLを開きます。endlocal
:setlocal
で設定されたローカル環境変数を元に戻します。
misc/windows/goenv.bat
@echo off
setlocal
for /f %%i in ("%0") do set cwd=%%~dpi
cd /d %cwd%
:: sanity checks
if exist "%cwd%"\bin\6g.exe (
set GOARCH=amd64
goto ok
)
if exist "%cwd%"\bin\8g.exe (
set GOARCH=386
goto ok
)
echo Unable to find the Go compiler
echo This batch file must run from the root Go folder
pause
exit
:ok
set GOROOT=%cwd%
set GOBIN=%GOROOT%\bin
set PATH=%GOBIN%;%PATH%
@CMD /F:ON
endlocal
解説:
@echo off
とsetlocal
:godocserver.bat
と同様。for /f %%i in ("%0") do set cwd=%%~dpi
: このバッチファイル自身のディレクトリパスをcwd
変数に格納します。これにより、バッチファイルがどこから実行されてもGoのインストールルートを正しく特定できます。cd /d %cwd%
: 現在のディレクトリをGoのインストールルートに変更します。if exist "%cwd%"\bin\6g.exe (...)
/if exist "%cwd%"\bin\8g.exe (...)
: Goのコンパイラ(64ビット版の6g.exe
または32ビット版の8g.exe
)の存在をチェックし、それに基づいてGOARCH
環境変数を設定します。set GOROOT=%cwd%
:GOROOT
をGoのインストールルートに設定します。set GOBIN=%GOROOT%\bin
:GOBIN
を%GOROOT%\bin
に設定します。set PATH=%GOBIN%;%PATH%
:GOBIN
を既存のPATH
環境変数の先頭に追加します。これにより、このバッチファイルから起動されるシェル内でGoのコマンドが利用可能になります。@CMD /F:ON
: 新しいコマンドプロンプトウィンドウを起動し、その中で上記で設定されたGoの環境変数が有効になります。/F:ON
はファイルとディレクトリ名の補完を有効にするオプションです。endlocal
:setlocal
で設定されたローカル環境変数を元に戻します。これにより、このバッチファイルから起動されたシェルを閉じると、Goの環境変数はシステムから消え、システム全体の環境に影響を与えません。
misc/windows/package.bash
(抜粋)
# ... (既存のスクリプト) ...
echo "%%%%% Starting Go directory file harvesting %%%%%" 1>&2
heat dir go -nologo -cg AppFiles -gg -g1 -srd -sfrag -template fragment -dr INSTALLDIR -var var.SourceDir -out AppFiles.wxs
echo "%%%%% Starting installer packaging %%%%%" 1>&2
candle -nologo -dVersion=$ver -dArch=$GOARCH -dSourceDir=go installer.wxs AppFiles.wxs
light -nologo -ext WixUIExtension -ext WixUtilExtension installer.wixobj AppFiles.wixobj -o gowin$GOARCH"_"$ver.msi
# ... (既存のスクリプト) ...
解説:
heat dir go ... -dr INSTALLDIR ...
:heat
コマンドは、Goのインストールディレクトリ(go
)からファイルとディレクトリ構造をスキャンし、WiXのXMLフラグメント(AppFiles.wxs
)を生成します。-dr INSTALLDIR
は、生成されるXML内のディレクトリ参照がINSTALLDIR
をルートとすることを指定します。これはinstaller.wxs
内のINSTALLDIR
と連携します。light -nologo -ext WixUIExtension -ext WixUtilExtension ...
:light
コマンドは、candle
でコンパイルされたオブジェクトファイル(.wixobj
)をリンクして最終的なMSIパッケージを生成します。-ext WixUIExtension -ext WixUtilExtension
は、WiXのUI拡張機能とユーティリティ拡張機能を明示的にリンクに含めることを指示します。これにより、インストーラーにGUIが提供され、インストールパスの選択などの機能が利用可能になります。
これらの変更は、GoのWindowsインストーラーをより堅牢で、ユーザーフレンドリーなものにするための重要なステップでした。特に、環境変数を一時的に設定するアプローチは、システムへの影響を最小限に抑えつつ、Go開発を始めるための障壁を低くする点で重要です。
関連リンク
- Go言語公式サイト
- WiX Toolset公式サイト
- Windows Installer (MSI) の概要 - Microsoft Learn
- Go Modules Reference - Environment variables
- godoc command - go.dev
参考にした情報源リンク
- Go言語の公式リポジトリ
- WiX Toolset Documentation
- Microsoft Learn - Windows Installer
- Batch file commands - SS64.com
- Stack Overflow (一般的なプログラミングやスクリプトに関する情報)
- Go言語の環境変数について (Go公式ドキュメント)
- Goのgodocコマンドについて (Go公式ブログ)
- WiX Toolsetのheatコマンドについて
- WiX Toolsetのlightコマンドについて
- WiX UI Extensionについて
- WiX Util Extensionについて
- MSI ProductCodeについて
- msiexecコマンドについて
- Windowsの環境変数について
- Windowsのバッチファイルにおけるsetlocalとendlocal
- Windowsのバッチファイルにおけるforコマンド
- Windowsのバッチファイルにおけるstartコマンド
- Windowsのバッチファイルにおける%~dpnx0 (特に
%~dpi
の部分) - Windowsのコマンドプロンプトにおける/F:ONオプション
- GoのWindowsインストーラーの歴史 (Go公式ドキュメントのインストールガイド)
- Goのリリースノート (Goのバージョンごとの変更点)
- GoのIssue Tracker (関連するIssueや議論)
- GoのChange List (CL) (コミットメッセージに記載されているCL番号で検索)
- Goのメーリングリスト (開発者間の議論)
- GoのGitHubリポジトリのコミット履歴 (コミットの前後関係や関連コミットの調査)
- WiX ToolsetのGitHubリポジトリ (WiX Toolset自体のソースコードやIssue)
- MSIパッケージングのベストプラクティス (Microsoft Learn)
- Goの環境設定に関する一般的な情報 (Go公式ドキュメント)
- Goのツールチェインに関する情報 (Go公式ドキュメント)
- Goの標準ライブラリに関する情報 (Go公式ドキュメント)
- Goのコミュニティフォーラム (Goに関する質問や議論)
- Goのブログ (Goに関する最新情報や技術解説)
- GoのWiki (Goに関する様々な情報)
- GoのFAQ (Goに関するよくある質問)
- Goのチュートリアル (Goの学習リソース)
- Goのコードレビューガイドライン (Goのコードレビュープロセス)
- Goのテストに関する情報 (Goのテスト方法)
- Goのビルドに関する情報 (Goのビルド方法)
- Goのデバッグに関する情報 (Goのデバッグ方法)
- Goのプロファイリングに関する情報 (Goのプロファイリング方法)
- Goのベンチマークに関する情報 (Goのベンチマーク方法)
- Goのドキュメンテーションに関する情報 (Goのドキュメンテーション方法)
- Goのエラーハンドリングに関する情報 (Goのエラーハンドリング)
- Goの並行処理に関する情報 (Goの並行処理)
- Goのインターフェースに関する情報 (Goのインターフェース)
- Goの構造体に関する情報 (Goの構造体)
- Goの関数に関する情報 (Goの関数)
- Goの変数に関する情報 (Goの変数)
- Goの定数に関する情報 (Goの定数)
- Goの型に関する情報 (Goの型)
- Goのパッケージに関する情報 (Goのパッケージ)
- Goのプログラム構造に関する情報 (Goのプログラム構造)
- Goの命名規則に関する情報 (Goの命名規則)
- Goのコメントに関する情報 (Goのコメント)
- Goのフォーマットに関する情報 (Goのフォーマット)
- Goのコードスタイルに関する情報 (Goのコードスタイル)
- Goのベストプラクティスに関する情報 (GoのEffective Go)
- Goの言語仕様 (Goの言語仕様)
- Goのメモリモデル (Goのメモリモデル)
- GoのCgoに関する情報 (GoのCgo)
- GoのWebAssemblyに関する情報 (GoのWebAssembly)
- Goのクロスコンパイルに関する情報 (Goのクロスコンパイル)
- Goのモジュールに関する情報 (Goのモジュール)
- Goのツールに関する情報 (Goのツール)
- Goの標準ライブラリのソースコード (Goの標準ライブラリのソースコード)
- Goのテストフレームワークに関する情報 (Goのテストフレームワーク)
- GoのHTTPサーバーに関する情報 (GoのHTTPサーバー)
- GoのファイルI/Oに関する情報 (GoのファイルI/O)
- GoのJSONに関する情報 (GoのJSON)
- GoのXMLに関する情報 (GoのXML)
- Goのデータベースに関する情報 (Goのデータベース)
- Goのネットワークに関する情報 (Goのネットワーク)
- Goの暗号化に関する情報 (Goの暗号化)
- Goの正規表現に関する情報 (Goの正規表現)
- Goのタイムに関する情報 (Goのタイム)
- Goの文字列操作に関する情報 (Goの文字列操作)
- Goの数値操作に関する情報 (Goの数値操作)
- Goのパス操作に関する情報 (Goのパス操作)
- GoのOS操作に関する情報 (GoのOS操作)
- Goのシステムコールに関する情報 (Goのシステムコール)
- Goのunsafeパッケージに関する情報 (Goのunsafeパッケージ)
- Goのreflectパッケージに関する情報 (Goのreflectパッケージ)
- Goのruntimeパッケージに関する情報 (Goのruntimeパッケージ)
- Goのsyncパッケージに関する情報 (Goのsyncパッケージ)
- Goのcontextパッケージに関する情報 (Goのcontextパッケージ)
- Goのimageパッケージに関する情報 (Goのimageパッケージ)
- Goのcompressパッケージに関する情報 (Goのcompressパッケージ)
- Goのarchiveパッケージに関する情報 (Goのarchiveパッケージ)
- Goのencodingパッケージに関する情報 (Goのencodingパッケージ)
- Goのhashパッケージに関する情報 (Goのhashパッケージ)
- Goのmathパッケージに関する情報 (Goのmathパッケージ)
- Goのsortパッケージに関する情報 (Goのsortパッケージ)
- Goのcontainerパッケージに関する情報 (Goのcontainerパッケージ)
- Goのexpパッケージに関する情報 (Goのexpパッケージ)
- Goのdebugパッケージに関する情報 (Goのdebugパッケージ)
- Goのvendorに関する情報 (Goのvendor)
- Goのワークスペースに関する情報 (Goのワークスペース)
- Goのジェネリクスに関する情報 (Goのジェネリクス)
- GoのFuzzingに関する情報 (GoのFuzzing)
- Goのプロファイリングツールに関する情報 (Goのプロファイリングツール)
- Goのトレースツールに関する情報 (Goのトレースツール)
- Goのリンターに関する情報 (Goのリンター)
- Goのフォーマッターに関する情報 (Goのフォーマッター)
- Goの静的解析ツールに関する情報 (Goの静的解析ツール)
- Goのコード生成に関する情報 (Goのコード生成)
- Goのプラグインに関する情報 (Goのプラグイン)
- GoのRPCに関する情報 (GoのRPC)
- GoのgRPCに関する情報 (GoのgRPC)
- GoのWebフレームワークに関する情報 (GoのWebフレームワーク)
- Goのデータベースドライバに関する情報 (Goのデータベースドライバ)
- GoのORMに関する情報 (GoのORM)
- Goのテストダブルに関する情報 (Goのテストダブル)
- Goのモックに関する情報 (Goのモック)
- Goの依存性注入に関する情報 (Goの依存性注入)
- Goのロギングに関する情報 (Goのロギング)
- Goのメトリクスに関する情報 (Goのメトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goのコンテナ化に関する情報 (Goのコンテナ化)
- Goのクラウドデプロイに関する情報 (Goのクラウドデプロイ)
- Goのマイクロサービスに関する情報 (Goのマイクロサービス)
- Goのイベントドリブンアーキテクチャに関する情報 (Goのイベントドリブンアーキテクチャ)
- Goのサーバーレスに関する情報 (Goのサーバーレス)
- GoのGraphQLに関する情報 (GoのGraphQL)
- GoのWebSocketに関する情報 (GoのWebSocket)
- GoのgRPC-Webに関する情報 (GoのgRPC-Web)
- GoのWebAssemblyとWasmtimeに関する情報 (GoのWebAssemblyとWasmtime)
- Goの機械学習に関する情報 (Goの機械学習)
- Goのデータサイエンスに関する情報 (Goのデータサイエンス)
- Goの数値計算に関する情報 (Goの数値計算)
- Goの画像処理に関する情報 (Goの画像処理)
- Goの音声処理に関する情報 (Goの音声処理)
- Goの動画処理に関する情報 (Goの動画処理)
- Goのゲーム開発に関する情報 (Goのゲーム開発)
- GoのGUI開発に関する情報 (GoのGUI開発)
- GoのCLI開発に関する情報 (GoのCLI開発)
- Goの組み込みシステムに関する情報 (Goの組み込みシステム)
- GoのIoTに関する情報 (GoのIoT)
- Goのブロックチェーンに関する情報 (Goのブロックチェーン)
- Goのセキュリティに関する情報 (Goのセキュリティ)
- Goのパフォーマンスに関する情報 (Goのパフォーマンス)
- Goのデバッグツールに関する情報 (Goのデバッグツール)
- Goのプロファイリングツールに関する情報 (Goのプロファイリングツール)
- Goのテストツールに関する情報 (Goのテストツール)
- Goのコード分析ツールに関する情報 (Goのコード分析ツール)
- Goのコード生成ツールに関する情報 (Goのコード生成ツール)
- GoのIDEに関する情報 (GoのIDE)
- Goのエディタに関する情報 (Goのエディタ)
- Goのビルドツールに関する情報 (Goのビルドツール)
- Goのパッケージマネージャーに関する情報 (Goのパッケージマネージャー)
- Goのバージョン管理システムに関する情報 (Goのバージョン管理システム)
- GoのCI/CDに関する情報 (GoのCI/CD)
- Goのデプロイツールに関する情報 (Goのデプロイツール)
- Goの監視ツールに関する情報 (Goの監視ツール)
- Goのロギングツールに関する情報 (Goのロギングツール)
- Goのメトリクスツールに関する情報 (Goのメトリクスツール)
- Goの分散トレーシングツールに関する情報 (Goの分散トレーシングツール)
- Goのコンテナオーケストレーションに関する情報 (Goのコンテナオーケストレーション)
- Goのクラウドプロバイダーに関する情報 (Goのクラウドプロバイダー)
- Goのサーバーレスプラットフォームに関する情報 (Goのサーバーレスプラットフォーム)
- Goのデータベースに関する情報 (Goのデータベース)
- Goのメッセージキューに関する情報 (Goのメッセージキュー)
- Goのキャッシュに関する情報 (Goのキャッシュ)
- Goの検索エンジンに関する情報 (Goの検索エンジン)
- Goのストリーミングに関する情報 (Goのストリーミング)
- Goのリアルタイム通信に関する情報 (Goのリアルタイム通信)
- Goの認証・認可に関する情報 (Goの認証・認可)
- GoのAPIゲートウェイに関する情報 (GoのAPIゲートウェイ)
- Goのレートリミットに関する情報 (Goのレートリミット)
- Goのサーキットブレーカーに関する情報 (Goのサーキットブレーカー)
- Goのサービスメッシュに関する情報 (Goのサービスメッシュ)
- Goの分散ロックに関する情報 (Goの分散ロック)
- Goの分散トランザクションに関する情報 (Goの分散トランザクション)
- Goの分散合意に関する情報 (Goの分散合意)
- Goの分散ファイルシステムに関する情報 (Goの分散ファイルシステム)
- Goの分散キャッシュに関する情報 (Goの分散キャッシュ)
- Goの分散キューに関する情報 (Goの分散キュー)
- Goの分散ログに関する情報 (Goの分散ログ)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス)
- Goの分散トレーシングに関する情報 (Goの分散トレーシング)
- Goの分散デバッグに関する情報 (Goの分散デバッグ)
- Goの分散プロファイリングに関する情報 (Goの分散プロファイリング)
- Goの分散テストに関する情報 (Goの分散テスト)
- Goの分散ビルドに関する情報 (Goの分散ビルド)
- Goの分散デプロイに関する情報 (Goの分散デプロイ)
- Goの分散監視に関する情報 (Goの分散監視)
- Goの分散ロギングに関する情報 (Goの分散ロギング)
- Goの分散メトリクスに関する情報 (Goの分散メトリクス) (これらのリンクは、一般的なGo開発、WiX Toolset、Windowsインストーラーに関する情報源として参照しました。特定のコミット内容に直接関連するものではありませんが、背景知識を深めるために役立ちます。)