scoopのインストール先を変更する

# Scoopのインストール先を変更する

システムドライブにデータやツールは置きたくないという宗教的理由から、`C:`は意図的に小さめ(100GB)でパーティション切ってます。なのでChocolateyやScoopのようなパッケージマネージャでどかどか放り込まれるのは心理的にも物理的にもつらい。

最初`\scoop\`以下を別ドライブに移動して`c:\Users\<ユーザー名>`にシンボリックリンク張ってみたんですがscoop自身がなかでジャンクションを使用してるのでリンクが循環参照しまくって気持ち悪いことに。（というか先に[マニュアル](https://github.com/lukesampson/scoop/wiki/Quick-Start)読めっていう）

## Scoopとは

Windows用のコマンドラインインストーラ
aptとかpacmanとかapt-cygとかpipとかgemとかchocolateyとかその辺のやつみたい
[ScoopでWindowsにおける開発環境構築を最適化しよう](https://blog.satotaichi.info/scoop/)

## インストール先の指定方法

[scoop/lib/core.ps1 (GitHub)](https://github.com/lukesampson/scoop/blob/master/lib/core.ps1)の6～10行目付近によると **環境変数 SCOOP**と**SCOOP_GLOBAL** (AllUsers用)を設定しておけばよいようです。規定値は以下

`SCOOP`  = `C:\Users\<ユーザー名>\scoop`

`SCOOP_GLOBAL` = `C:\ProgramData\scoop`



…というか普通に[wiki](https://github.com/lukesampson/scoop/wiki/Quick-Start)に記載がありました (だから先に読めっていう)

> ### Installing Scoop to Custom Directory
>
> Assuming the target directory is D:\Applications\Scoop, in a PowerShell command console,  run:
>
> ```powershell
> [environment]::setEnvironmentVariable('SCOOP','D:\Applications\Scoop','User')
> $env:SCOOP='D:\Applications\Scoop'
> iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
> ```



## Scoopのアンインストールと引っ越し

Scoopはシステム依存性の少ないソフトですがジャンクションやshimのパスは張り直ししないと無理みたい。一度アンインストールして入れ直しします。

これを

```
C:.
├─ProgramData
│  └─scoop
│
└─Users
    └─<ユーザー名>
        └─scoop
```

こんな風にしたい

```
D:.
├─scoop
│  ├─global
│  │
│  └─<ユーザー名>

```

ぶっちゃけglobalとuserを分ける意味がないフォルダ構成ですがｷﾆｼﾅｲ

個人PCなんでglobalはほぼ使っていないです。ただ、busyboxやgowみたいに入れると既存の同名のshimが大量上書きされるものあるのでエイリアスのテスト展開場所として一応設定しています。一か所で管理できるほうが楽かなと。

### scoop以下をバックアップ

scoopのフォルダ構成

```
└─scoop
   ├─apps
   ├─buckets
   ├─cache
   ├─persist
   └─shims
```

バックアップ先は`D:\scoop_bkup`、フォルダ構成は引っ越し先と同じにしました。

```
D:.
├─scoop_bkup
│  ├─global
│  │  └─apps
│  │
│  └─<ユーザー名>
│     ├─apps
│     ├─buckets
│     ├─cache
│     └─persist  
```

`\apps`内のジャンクションと`\shims`を除いてバックアップします。

```cmd.exe
> robocopy /E /xj %USERPROFILE%\scoop d:\scoop_bkup\%USERNAME% /xd shims
> robocopy /E /xj %ProgramData%\scoop d:\scoop_bkup\global  /xd shims
```

時間かかるので面倒だったらアプリの設定が入ってる`\persist `だけでもいいんですが、`\buckets`と`\cache`をとっとくと後のリストアが少し楽になります。



#### 導入済アプリのリストア 用スクリプトを作成

```cmd.exe
> for /f "delims=;" %i in ('dir /b/ad %USERPROFILE%\scoop\apps') do ( echo scoop install %i>>d:\scoop_bkup\restore.ps1 )
> for /f "delims=;" %i in ('dir /b/ad %ProgramData%\scoop\apps') do ( echo sudo scoop install %i  --global>>d:\scoop_bkup\restore_global.ps1 )
```

buckets外からインストールしたアプリがある場合は`restore*.ps1`をテキストエディタで開いてjsonの場所をコピペしておきます。
<img width="736" alt="scoop_restore.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/249833/72338261-b766-6b1f-1f22-bb039716f22b.png">


```cmd.exe
> scoop list
Installed apps: 

  nyagos 4.2.2_1 [https://gist.githubusercontent.com/dohzoh/75eab6bd7a46d3625ddcd332618e4518/raw/b8e98b5f9e0c14317a9abbafe176081b0cf97438/nyagos.json]
```

```d:\scoop_bkup\restore.ps1 
# scoop install nyagos
scoop install https://gist.githubusercontent.com/dohzoh/75eab6bd7a46d3625ddcd332618e4518/raw/b8e98b5f9e0c14317a9abbafe176081b0cf97438/nyagos.json
```



### Scoopをアンインストール

```cmd.exe
> scoop uninstall scoop
```

なんかエラーが出た時は`C:\Users\<ユーザー名>\scoop`以下を手動で削除



### 環境変数を設定

インストールしたい場所を指定、この時点では実フォルダはなくても良いようです。

管理者権限でプロンプトを起動

```cmd.exe(管理者)
> setx SCOOP d:\scoop\<ユーザー名>
> setx SCOOP_GLOBAL d:\scoop\global /m
```
(2020.06.02追記 `d:\scoop\%USERNAME%`の指定ではうまくいかないようなので修正しました。環境変数使わないで直値で書いてください。)


## Scoopの再インストール

```cmd.exe->powershell
> powershell
PS> set-executionpolicy unrestricted -s cu
PS> iex (new-object net.webclient).downloadstring('https://get.scoop.sh')
```

確認

```powershell
PS> Get-Command scoop

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
ExternalScript  scoop.ps1                                                     D:\scoop\<ユーザー名>\shims\scoop.ps1
```



### バックアップデータのリストア

`\buckets` `\cache` `\persist`に関しては丸コピーでいけるので`\apps`のみ除外してリストア

`\cache`内にアーカイブが残ってれば後の工程でアプリの再ダウンロードが発生しないので多少早く終わります。

```powershell->cmd.exe
PS> exit
> robocopy /E /xo D:\scoop_bkup\%USERNAME% %SCOOP%  /xd apps
> robocopy /E /xo D:\scoop_bkup\global %SCOOP_GLOBAL% /xd apps
```



### アプリの再インストール

git入ってないとScoop本体のアプデできませんてメッセージが出るので一番最初に `scoop install git`したほうがいいかも

```cmd.exe
> powershell -ExecutionPolicy RemoteSigned -File d:\scoop_bkup\restore.ps1
> powershell -ExecutionPolicy RemoteSigned -File d:\scoop_bkup\restore_global.ps1
```

時間かかるのでしばらく待ちます。



### その他のリストア

MSYS2やcygwinのように`\apps`内に固有環境を構築するものはファイラーで確認しながら個別に手動で戻します。終わったらバックアップフォルダは丸ごと削除



## 所感

めんどくさい設定をよしなにしてくれるためのパッケージマネージャなのに、環境設定を弄って使うというのは邪道な気がしなくもない。linuxみたいに入れる場所がきっちり固定化されてる環境から見たらアホなことやってるように見えるんだろうなあ。