概要
scoopのキャッシュフォルダを、Windowsファイル共有フォルダに配置、複数マシンで共用化する。
最初にいいわけ
これは「もしかして他の人がすでに有用な記事を書いているかもしれないが、被ったり恥ずかしいバッドノウハウであることを恐れずに自分の手持ちネタを晒す」記事です。
はじめに
scoopのパッケージ管理の仕組みは、単純化されている一方で洗練されていて、この仕組みに乗っかろうと腹をくくると非常に使い勝手がよい。
(変なことを自分でいろいろ考えて決める必要がない)
一方で、一般ユーザーにはあまり馴染みのないジャンクションを多用しているので、なにができるのか、なにをやったらよくて何をやったらいかんのか、直感的にわかりづらい。
自分の出した結論
共用していいもの
- cache
- buckets
共用したらいかんもの
- apps
- shims
- persist
どうやって共用化するか
シンボリックリンクを使う。
> ren cache cache.orig
> mklink /d cache \\some-host\scoop\shared\cache
> ren buckets
> mklink /d buckets \\some-host\scoop\shared\buckets
各bucketsの同期には、おそらくほぼ git
を使っている(はず)だが、最近のgit(いつ頃からかはちょっと忘れた。。)では、共有フォルダ配下のリポジトリ更新時に警告が出る1。
警告を出さなくするには、safe directory設定をする。
警告に従ってもいいが、個人フォルダの .gitconfig
を直接追記編集するほうが楽かもしれない。
[safe]
directory = %(prefix)///some-host/scoop/shared/buckets/main
directory = %(prefix)///some-host/scoop/shared/buckets/extras
directory = %(prefix)///some-host/scoop/shared/buckets/java
directory = %(prefix)///some-host/scoop/shared/buckets/k2ok
上記の例のとおり、リポジトリごとのrootパスを指定しないといけないらしい。
apps, persistを共用化できない理由
ジャンクションの特性による。
scoopで多用している ジャンクション とは、NTFSファイルシステム 特有のもので、任意のユーザが作成可能である2。
ところがこのジャンクションは、 *.lnk
(ショートカット)や *.url
(インターネット ショートカット)のような「実体は只の一般ファイル」であるのと異なり、「ローカルの」NTFS上にしか存在することしかできない。
言い換えると、「共有フォルダの実態がNTFSであったとしても、ネットワーク経由では作成できない」。
appsフォルダの扱い方としては、各バージョンのファイル一式をバージョンのフォルダに展開した上で、インストール/アップデートしたバージョンを「current」というジャンクションで参照させる仕組みになっている。
ジャンクションが共用可能なファイルシステムがあれば別だが、少なくとも自分は存在を知らない。
shimsを共用化できない(?)理由
もしかすると(条件つきで)共用化できるかもしれないけど。。。
shimsに配置されるのは、「appsフォルダの実行ファイルを起動するコマンド群」であるはず。
で、これ自体は「実行ファイル」のはずなので、少なくとも32bit環境と64bit環境のものを混在させることはできない。
じゃぁアーキテクチャ一緒な環境同志だったら共用できるかというと、そもそもappsを共用できてないので、存在しないappsを参照するshimsが存在することになるんじゃない?
当然、配置先には存在しないので起動失敗するだろうけど、、、
shimsで占有されるのファイルサイズを考えたら、無理に共有する必要なくない?という話。
その他補足
じゃぁ、「複数ユーザーでcache, bucketsは共用できるの?」という話になると思うけど、おそらくできないと思う。
同時実行される前提で排他制御などしてないのでは。
git
が safe-directory
の警告を出すのも、複数ユーザで同時に作業フォルダを操作することなど想定していないので禁止したいのでしょ。
とはいえ、これは自分のあてずっぽうなので、違うようならコメント等で教えていただけると嬉しいです。