Scoopを使った環境構築

## Scoop とは
ScoopはWindows用のパッケージ管理ツールです。
Scoopを導入することでUbuntuの `apt` 、RHLE/CentOSの `yum` 、macの `brew`のようなことができるようになります。 

https://github.com/lukesampson/scoop

Windowsにおけるツール類のインストール作業コストはかなり高いのですが、Scoopを入れることにより、各種モジュールをコマンド一発でインストールすることが可能になります。
その際には依存モジュールも自動的にインストールしてくれます。

例えば`Git`(Git for Windows)をScoopでインストールする場合、 `scoop install git` の一文だけで完了します。
公式サイトを探してインストーラをダウンロードしてきたり、インストールオプションをダイアログで選択する手間が省け、再現性のある環境構築が可能です。

また、Scoopでインストールされるモジュールは、個人フォルダ内に配置されるため管理者権限が不要だったり、アンインストールも(基本的には)モジュールの配置フォルダを消すだけなので、環境を比較的綺麗に維持できます。
一応バージョンコントロールも出来ますが、ちょっと癖があります。


## 必要要件
ScoopをインストールするにはPowerShell 5と.Net Framework 4.5以上が必要になります。
Windows 10を使っている限りは、この要件を満たしています。
なお、インストール用のスクリプトをダウンロードしてくるため、インターネットへの接続が必要になります。


## Scoopのインストール
Scoopをインストールするには上記の要件を満たした上で、PowerShellをから下記のコマンドを実行します。

```powershell
Set-ExecutionPolicy RemoteSigned -scope CurrentUser
invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
```
ポリシー変更のために以下のメッセージが表示されるので `Y` を押してください。

```output
Execution Policy Change
The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose you to the security risks described in the
about_Execution_Policies help topic at https:/go.microsoft.com/fwlink/?LinkID=135170.
Do you want to change the execution policy?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): Y
```

以下のようなメッセージが出たら、インストールは完了です。

```output
Initializing...
Downloading scoop...
Extracting...
Creating shim...
Downloading main bucket...
Extracting...
Adding ~\scoop\shims to your path.
'lastupdate' has been set to '2020-08-19T11:27:12.6461118+09:00'
Scoop was installed successfully!
Type 'scoop help' for instructions.
```


## Scoopを使ったGitのインストール
Scoopを利用して、インストール作業を行ってみます。
今後の作業で必要になるので、手始めに `Git` をインストールしておきます。
Scoopでは基本的に `scoop install` でモジュールのインストールを行います。
`Git` をインストールするには以下のコマンドを実行してください。

```powershell
scoop install git
```

下記のような表示が出て、インストールが実行されます。

```
Installing '7zip' (19.00) [64bit]
7z1900-x64.msi (1.7 MB) [===================================================================================================================================] 100%
Checking hash of 7z1900-x64.msi ... ok.
Extracting 7z1900-x64.msi ... done.
Linking ~\scoop\apps\7zip\current => ~\scoop\apps\7zip\19.00
Creating shim for '7z'.
Creating shortcut for 7-Zip (7zFM.exe)
'7zip' (19.00) was installed successfully!
Installing 'git' (2.28.0.windows.1) [64bit]
PortableGit-2.28.0-64-bit.7z.exe (44.7 MB) [================================================================================================================] 100%
Checking hash of PortableGit-2.28.0-64-bit.7z.exe ... ok.
Extracting dl.7z ... done.
Linking ~\scoop\apps\git\current => ~\scoop\apps\git\2.28.0.windows.1
Creating shim for 'git'.
Creating shim for 'gitk'.
Creating shim for 'git-gui'.
Creating shim for 'tig'.
Creating shim for 'git-bash'.
Creating shortcut for Git Bash (git-bash.exe)
Creating shortcut for Git GUI (git-gui.exe)
Running post-install script...
'git' (2.28.0.windows.1) was installed successfully!
```

`Git`をインストールする過程で依存モジュールとして `7zip` もインストールされます。
(`7zip` は圧縮解凍ソフトとしては非常に強力ですのでオススメです)

なお、Scoopでインストールされたモジュールはデフォルトでは `%userprofile%\scoop\apps` に配置されます。
また、`%userprofile%\scoop\shims` にPATHが通されており、ここに実行用のスクリプトが配置されています。
GUIのあるようなものは下図のようにWindowsメニューの`Scoop Apps`内にショートカットが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/454012/0b956bd2-df57-f284-9704-6f8f34c493fd.png)


## ダウンロードの高速化 (マルチセッション対応)
`aria2` をインストールすると、Scoopにおけるファイルのダウンロードがマルチセッションになり、効率的にダウンロードできるようになります。
導入しておくことをおすすめします。

```powershell
scoop install aria2
```

以下のような表示が出ればインストール完了です。
aria2は自動的に有効化され、以降の操作で利用されます。

```
Installing 'aria2' (1.35.0-1) [64bit]
aria2-1.35.0-win-64bit-build1.zip (2.1 MB) [==================================================================] 100%
Checking hash of aria2-1.35.0-win-64bit-build1.zip ... ok.
Extracting aria2-1.35.0-win-64bit-build1.zip ... done.
Linking ~\scoop\apps\aria2\current => ~\scoop\apps\aria2\1.35.0-1
Creating shim for 'aria2c'.
'aria2' (1.35.0-1) was installed successfully!
```


## bucketの追加と Google Chromeのインストール
私がWindows環境を立ち上げて一番最初に行うことは `Google Chrome` をインストールすることです。
これをScoopを使ってやってみます。
Google Chromeは `scoop install` でインストール可能ですが、そのままではインストールすることができません。
Scoopには `bucket` という概念があり、今までインストールした `Git` や `aria2` などの基本コマンドは `main` というbucketに含まれてています。
main bucketに含まれているモジュールはデフォルトでインストール可能です。


まずはGoogle Chromeがどのbucketに含まれているかを探します。
以下のコマンドを実行することで、モジュールを検索します。

```powershell
scoop search googlechrome
```

コマンドを実行すると以下のように表示されます。

```output
Results from other known buckets...
(add them using 'scoop bucket add <name>')

'extras' bucket:
    bucket/googlechrome-beta
    bucket/googlechrome-canary
    bucket/googlechrome-dev
    bucket/googlechrome-portable
    bucket/googlechrome
```

`'extras' bucket:` という部分が、モジュールを含んでいるbucketになります。
Google Chromeの場合、 `extras` というbucketに含まれていることになります。

そこで、このextras bucketを利用できるようにするために、以下のコマンドを実行してbucketの追加を行います。

```powershell
scoop bucket add extras
```

以下の表示が出ればbucketの追加は成功です。

```output
Checking repo... ok
The extras bucket was added successfully.
```

なお、bucketを追加するためには `Git` が必要になるため、事前に `Git` をインストールしてください。
(本手順ではインストール済みです)

他にどのようなbucketがあるかは、以下を参照してください。
[【Known application buckets - GitHub】](https://github.com/lukesampson/scoop#known-application-buckets)


extras bucketの追加が完了したら、`scoop install` コマンドでGoogleChromeをインストールします。

```powershell
scoop install googlechrome
```

以下の表示が出れば、インストールは完了しています。

```output
Running installer script...
Linking ~\scoop\apps\googlechrome\current => ~\scoop\apps\googlechrome\85.0.4183.83
Creating shim for 'chrome'.
Creating shortcut for Google Chrome (chrome.exe)
'googlechrome' (85.0.4183.83) was installed successfully!
```

なお、インストールされたGoogle Chromeを実行するにはコマンドプロンプトまたはPowerShellのコンソールから `chrome` と打つか、Windowsメニューの「Scoop Apps」内のショートカットから実行することができます。



## VisualStudio Codeをインストールする
続いてScoopでVisualStudio Code(以下VSCode)をインストールします。
VSCodeも `extras` に含まれているので、事前にbucketの追加が必要です。
(本手順では追加済みです)

```powershell
scoop install vscode
```

インストールが完了すると、以下のようなメッセージが表示されます。

```output
Download: (OK):download completed.
Checking hash of dl.7z ... ok.
Checking hash of vscode-install-context.reg ... ok.
Checking hash of vscode-uninstall-context.reg ... ok.
Extracting dl.7z ... done.
Linking ~\scoop\apps\vscode\current => ~\scoop\apps\vscode\1.48.2
Creating shim for 'code'.
Creating shortcut for Visual Studio Code (code.exe)
Running post-install script...
'vscode' (1.48.2) was installed successfully!
Notes
-----
Add Visual Studio Code as a context menu option by running: "C:\Users\hogehoge\scoop\apps\vscode\current\vscode-install-context.reg"
```

上記メッセージの最後にコンテキストメニューに関するNotesが表示されています。
インストールした状態ではエクスプローラのコンテキストメニューからVSCodeを実行することが出来ないため、コンテキストメニューを追加したい場合はメッセージの指示に従いScoopによって提供されているレジストリファイル `vscode-install-context.reg` をレジストリにマージしてください。
レジストリファイルの保存先はメッセージを確認してください。
(本例では `C:\Users\hogehoge\scoop\apps\vscode\current\` になります)

このように、`scoop install` 後に操作が必要な場合はメッセージが表示されますので、見逃さないようにしてください。

## 環境構築スクリプト
上記の一連の操作 + α をスクリプト化してみました。
スクリプト化しておくことで、常に同じ環境を作成することが可能になります。
いちいちインストーラをダウンロードしてきたり、ダイアログ操作でインストールオプションを指定する必要はありません。
例えばチーム開発で同じ環境に揃えたい場合や、繰り返し行うサンドボックス内でのテスト環境構築などで非常に有効です。

```powershell:scoopをインストールしてGitおよびVSCodeをインストールする
##################################################
# install Scoop
##################################################
# インストールディレクトリの設定 (user)
#$env:SCOOP='D:\Applications\Scoop'
#[Environment]::SetEnvironmentVariable('SCOOP', $env:SCOOP, 'User')

# インストールディレクトリの設定 (global)
#$env:SCOOP_GLOBAL='D:\GlobalScoopApps'
#[Environment]::SetEnvironmentVariable('SCOOP_GLOBAL', $env:SCOOP_GLOBAL, 'Machine')

try {
  # Scoopのインストール確認
  get-command scoop -ErrorAction Stop
} 
catch [Exception] {
  # Scoopのインストール
  Set-ExecutionPolicy RemoteSigned -scope CurrentUser
  Invoke-Expression (New-Object System.Net.WebClient).DownloadString('https://get.scoop.sh')
}

# install basic module
scoop install aria2
scoop install git
scoop install sudo

# add bucket
scoop bucket add extras
scoop bucket add versions

# Scoopのインストールディレクトリの取得
$SCOOP_ROOT = if ($env:SCOOP) {$env:SCOOP} else {"$home\scoop"}



##################################################
# install Google Chrome
##################################################
scoop install googlechrome

##################################################
# install vscode
##################################################
scoop install vscode
reg import $SCOOP_ROOT\apps\vscode\current\vscode-install-context.reg  # add context menu

##################################################
# install slack
##################################################
scoop install slack

##################################################
# install VC Runtime
##################################################
scoop install vcredist2019
```


本スクリプトでは、まずScoopコマンド確認し、確認できない場合はScoopのインストールを行います。
それ以前のコメントアウト部分は、ScoopおよびScoopによってインストールされるモジュールのインストール先を指定するための記述になります。
必要に応じて変更してください。

Scoopのインストールが完了したら、必要なモジュールをインストールしています。
`aria2` 、 `git`、`sudo` をインストールした後に `extras bucket` を追加して、  `Google Chrome`、`VSCode`、`Slack`、`VC Runtime`をインストールしています。




なお `scoop install` コマンドは、何も指定しない場合は最新バージョンを取得してきます。
従って、上記で提示したスクリプトでは実行するタイミングにより異なるバージョンがインストールされてしまい、100%再現性のある環境を構築できません。
バージョンコントロールもできるのですが、ちょっと癖があるので別の機会で記述したいと思います。