Yarn Workspaces を後付けする


Yarn Workspaces を後付けする

以下のような状況を想定します。

  • 既存のワークスペース (Yarn Workspaces 未適用) が存在する
  • 既存のワークスペース配下に追加をしたくない (上位ディレクトリなどに追加は大丈夫)
  • 追加するワークスペースの内容を別途追加される兄弟ワークスペースが使用するが
    • 兄弟ワークスペースの Node のバージョンが違う・・・
    • でも同じコードを使用したりしたい

対応

共有する対象のコードの設置

共有するコードを ./src/ と同列の ./packages/ に設置します。
それぞれ配下には package.json を設置して namenode_modules/ に格納される名前を指定します。

Yarn Workspaces の設定

既存のパスを packages への指定にしつつ、追加のワークスペースを ./src/packages/ に設置します。

package.json
{
  ・・・
  "workspaces": {
    "packages": [
      "./",
      "./src/packages/*"
    ]
  },
  ・・・
}
  • 既存のパスを "./" にて指定
  • 追加するワークスペースを "./src/packages/*" に指定

./src/packages/ に指定した内容を用意

./packages/ に用意した内容をシンボリックリンクにより ./src/packages/ として設置します。

set-symbolic-link-packages
cd ./src
ln -s ../packages/ packages

「既存コードに変更を行いたくない」に反するような気がしますが、
まあ適当に空いている構造に設置するということで・・・

yarn install

これによりこれまで通りのパスで yarn install を行うと、
./src/packages/ に設置した内容が node_modules/ に反映されました。

・・・もっといい方法があるかもですが。

Yarn Workspaces の使用で Firebase に functions がアップロードできない場合

上記までのものを使用して Firebase の functions をアップロードしたところ、
Yarn Workspaces として設定した対象が module not found として解決できない事象に遭遇しました。

なんとか動かした対応として、

  • シンボリックリンクでなくファイルのコピーに変更
  • Yarn Workspaces の指定を解除
    • package.json を前述までの workspaces の記述を削除
    • @test/ (仮) が node_modules/@test/ に紐づいていたところを、
      @test/src/packages/ に紐づけ直し
      • webpack.config.js
      • tsconfig.json
  • @test/ 配下で dependencies の指定があれば使用側の package.json に追加