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

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

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

Scoopとは

Windows用のコマンドラインインストーラ
aptとかpacmanとかapt-cygとかpipとかgemとかchocolateyとかその辺のやつみたい
ScoopでWindowsにおける開発環境構築を最適化しよう

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

scoop/lib/core.ps1 (GitHub)の6~10行目付近によると 環境変数 SCOOPSCOOP_GLOBAL (AllUsers用)を設定しておけばよいようです。規定値は以下

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

SCOOP_GLOBAL = C:\ProgramData\scoop

…というか普通にwikiに記載がありました (だから先に読めっていう)

Installing Scoop to Custom Directory

Assuming the target directory is D:\Applications\Scoop, in a PowerShell command console, run:

[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の場所をコピペしておきます。
scoop_restore.PNG

cmd.exe
> scoop list
Installed apps: 

  nyagos 4.2.2_1 [https://gist.githubusercontent.com/dohzoh/75eab6bd7a46d3625ddcd332618e4518/raw/b8e98b5f9e0c14317a9abbafe176081b0cf97438/nyagos.json]
\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\%USERNAME%
> setx SCOOP_GLOBAL d:\scoop\global /m

Scoopの再インストール

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

確認

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みたいに入れる場所がきっちり固定化されてる環境から見たらアホなことやってるように見えるんだろうなあ。

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.