Windowsでワンラインインストールするためには、コマンドプロンプトやPowershellを使う必要があります。今回はPowershellを使ったワンラインインストールの方法を紹介します。
方針
- Powershellでもwgetというエイリアスでファイルダウンロードができるのでそれを使う
- Windowsでtar.gzの解凍は面倒なので、標準で圧縮/解凍コマンドレットが用意されているzipを使う
- ファイルの解凍場所、実行ファイルの設置場所はAPPDATA環境変数の配下
スクリプト
全容はこんな感じです。Set-PSDebug -strict
$name = "oauth"
$bin_name = "oauth"
$version = "0.1.0"
$github_user = "tzmfreedom"
If ($Env:PROCESSOR_ARCHITECTURE -match "64") {
$arch = "amd64"
} Else {
$arch = "386"
}
$archive_file = "${name}-${version}-windows-${arch}.zip"
$url = "https://github.com/${github_user}/${name}/releases/download/v${version}/${archive_file}"
$dest_dir = "$Env:APPDATA\${name}"
wget $url -OutFile "${dest_dir}\tmp.zip"
Expand-Archive -Path "${dest_dir}\tmp.zip" -DestinationPath "${dest_dir}\tmp" -Force
if (!(Test-Path -path "${dest_dir}\bin")) { New-Item "${dest_dir}\bin" -Type Directory }
mv "${dest_dir}\tmp\${bin_name}" "${dest_dir}\bin\${bin_name}.exe" -Force
rm "${dest_dir}\tmp.zip" -Force
rm "${dest_dir}\tmp" -Force -Recurse
# ensure added to path in registry
$reg_path = [Environment]::GetEnvironmentVariable("PATH", "User")
If ($reg_path -notcontains $dest_dir) {
[Environment]::SetEnvironmentVariable("PATH", $reg_path + ";" + $dest_dir, "User")
}
# ensure added to path for current session
If ($Env:Path -notcontains $dest_dir) {
$Env:Path += ";" + $dest_dir
}
Write-Host "${bin_name} installed. Run '${bin_name} help' to try it out."
流れとしては以下の通り。
- $Env:PROCESSOR_ARCHITECTUREでOSのアーキテクチャを判別
- wgetでアーキテクチャに応じたバイナリを取得しAPP_DATA配下のディレクトリに設置
- Expand-Archiveで解凍
- 実行ファイルを適切な場所(APPDATA/${name}/bin)に移動
- 不要なファイル、ディレクトリを削除
- PATHに追加
(New-Object Net.WebClient).DownloadString('{url}') | iex
Set-PSDebug -strict
の記述をするとbashでいうところのset -u
を定義したように、未定義変数を参照したときにエラーになります。環境変数APPDATAはユーザ毎のアプリのデータ、設定ファイルを置く場所です。WindowsにはLinuxの/usr/local/binにあたるディレクトリが特に無いので、APPDATA配下を各ユーザのバイナリ置き場として使っています。
今回はzip形式のスクリプトとなっていますが、CLIの場合、zip形式ではなくバイナリを直接アップロード/ダウンロードした方がインストールスクリプトの記述は簡単になります(ただし、ファイルサイズは大きくなります)