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行目付近によると 環境変数 SCOOPとSCOOP_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
を除いてバックアップします。
> 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
をとっとくと後のリストアが少し楽になります。
####導入済アプリのリストア 用スクリプトを作成
> 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 list
Installed apps:
nyagos 4.2.2_1 [https://gist.githubusercontent.com/dohzoh/75eab6bd7a46d3625ddcd332618e4518/raw/b8e98b5f9e0c14317a9abbafe176081b0cf97438/nyagos.json]
# scoop install nyagos
scoop install https://gist.githubusercontent.com/dohzoh/75eab6bd7a46d3625ddcd332618e4518/raw/b8e98b5f9e0c14317a9abbafe176081b0cf97438/nyagos.json
###Scoopをアンインストール
> scoop uninstall scoop
なんかエラーが出た時はC:\Users\<ユーザー名>\scoop
以下を手動で削除
環境変数を設定
インストールしたい場所を指定、この時点では実フォルダはなくても良いようです。
管理者権限でプロンプトを起動
> setx SCOOP d:\scoop\<ユーザー名>
> setx SCOOP_GLOBAL d:\scoop\global /m
(2020.06.02追記 d:\scoop\%USERNAME%
の指定ではうまくいかないようなので修正しました。環境変数使わないで直値で書いてください。)
Scoopの再インストール
> 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
内にアーカイブが残ってれば後の工程でアプリの再ダウンロードが発生しないので多少早く終わります。
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
したほうがいいかも
> powershell -ExecutionPolicy RemoteSigned -File d:\scoop_bkup\restore.ps1
> powershell -ExecutionPolicy RemoteSigned -File d:\scoop_bkup\restore_global.ps1
時間かかるのでしばらく待ちます。
その他のリストア
MSYS2やcygwinのように\apps
内に固有環境を構築するものはファイラーで確認しながら個別に手動で戻します。終わったらバックアップフォルダは丸ごと削除
所感
めんどくさい設定をよしなにしてくれるためのパッケージマネージャなのに、環境設定を弄って使うというのは邪道な気がしなくもない。linuxみたいに入れる場所がきっちり固定化されてる環境から見たらアホなことやってるように見えるんだろうなあ。