環境
-
リポジトリA
とリポジトリB
がある。 -
リポジトリB
のsubmoduleにリポジトリC
を設定している - (
リポジトリA
はmonorepo環境であり、lerna&yarnで管理)
・リポジトリA
・リポジトリB
└── リポジトリC(submodule)
・リポジトリC
└── hogehoge
何が起きたか
-
リポジトリA
のpackage.jsonにリポジトリB
を追加する -
yarn install
する -
リポジトリB
のリポジトリC
ディレクトリが空っぽになっている
リポジトリA
├── package.json
│ "devDependencies": {
│ "リポジトリB": "git+ssh:~",
│
└── node_modules/
└── リポジトリB/
└── リポジトリC(submodule)
└── (Empty)
なんで?
どうやらyarnで追加したnode_modules内部のsubmoduleが正常にfetchできないみたい。
Submodules of git dependencies are not fetched · Issue #1488 · yarnpkg/yarn
対処1
git cloneで一時しのぎすればいいよ、というコメントがあったので強引感はあったものの試してみる。
While i hope this issue is getting some research invested into it, this placeholder workaround might serve as a temporary solution for all of us waiting
In package.json of a module being fetched, add a following script
"postinstall": "grep url .gitmodules | sed 's/.*= //' | while read url; do git clone $url; done"
今回の場合「リポジトリA
からリポジトリB
を実行する」ときはbin経由で呼ぶつもりだったので、その実行ファイルのshellスクリプトにgit cloneを書いてしまえばイケそう。
リポジトリA
├── package.json
│
└── node_modules/
└── リポジトリB/
└── リポジトリC(git clone)
└── hogehoge
さらなる問題
対処1でうまくいったように見えたので、別でyarn addしてみたところ問題発生。
パーミッションエラーが発生してyarn addできない。
なぜだかgit cloneしたディレクトリが読み取り専用になっていてyarnから操作できなくなっている。
リポジトリA
├── package.json
│
└── node_modules/
└── リポジトリB/
└── リポジトリC(git clone) <= permission dinide
対処2
git cloneはやめ、シンボリックリンクで対処することに決めた。
リポジトリAにリポジトリCのsubmoduleを設定し、
リポジトリB配下にリポジトリCのシンボリックリンクを貼る。
リポジトリA
├── リポジトリC(submodule)
│ └── hogehoge
│
└── node_modules/
└── リポジトリB/
└── リポジトリC(シンボリックリンク)
└── (hogehoge)
シンボリックリンクをはる処理は、実行ファイル内に書いてしまえばOK。
(シンボリックリンク作る前に空のディレクトリは削除している)
# リポジトリAのsubmoduleにシンボリックリンクを貼る
# /リポジトリA/node_modules/リポジトリB/リポジトリC/ => /リポジトリA/packages/リポジトリC/
# cd リポジトリA
rm -fd node_modules/リポジトリB/リポジトリC
ln -nfs packages/リポジトリC node_modules/リポジトリB/
(実行したい処理)
解決。