カラクリサイクル

『輝かしい青春』なんて失かった人の雑記

Windows ファイル共有上の node_modules 問題をなんとかした

という話。

Windows ファイル共有上の node_modules 問題をなんとかしたとは?

Windows のファイル共有……と言うか、Linux の ACL とか Permission が有効にならない共有ファイルシステム上で、 yarn addnpm i を使って node_modules とかと作ろうとすると、

  1. symlink が貼れない
  2. パーミッションを変更出来ない
  3. というか node_modules とか共有フォルダに置きたくない

言った様な色々と面倒なコトが起きるんですが、色々と考えるのが面倒だったので、 下記の様なスクリプトを用意してなんとかしました、という話です。

問題解決のためのスクリプト

#!/usr/bin/env zsh

set -e -u -o pipefail

function main() {
  local prefix="$HOME"/.cache/node_prefix"$(cd "$(pwd)" && pwd)"
  local target="$(pwd)/node_modules"

  if ! test -d "${prefix}" ; then
    mkdir -p "${prefix}"
  fi

  if ! test -d "${target}" ; then
    mkdir -p "${target}"
  fi

  sudo bindfs "${prefix}" "${target}"
  /run/current-system/sw/bin/yarn $*
  sudo fusermount -u "${target}"
}

main $*

これは何をしているのか

基本的には、

  1. node packages の管理コマンド (この場合 yarn) を実行するタイミングで
  2. bindfs を使ってファイル共有上の node_modules をローカルな fs に変更し
  3. コマンド (この場合 yarn) の実行した後に元に戻す

という感じです。

なお、上記スクリプトでは yarn が奇妙な絶対パスで書かれていますが、この絶対パスは NixOS 独特のモノで、 普通の Linux だったら普通の絶対パスで yarn (に相当する package manager) へのパスを書けば良いです。

使ってみた感想は?

最初、上記スクリプトを yarn というファイル名で作成し、 その際にスクリプト内部で呼び出す yarn を絶対パスで書いていなかったのですが、 そのせいで yarnyarn を呼び出して無限ループしてやーん、って感じにはなりましたが、その点を除けば、 別に特段の面倒もなく yarn が使えています。

以上

今日は NixOS on Hyper-V の環境構築とか行なっていたのですが、ファイル共有周りを除けば、 特段のに苦労するを事なく環境構築が出来ました。

ただ、それとは別に、なんか今の Windows 環境のネットワークが時々詰まるので、 その辺りがちょっと微妙だなーと感じてます。何が原因かは良く判ってないんですが。