2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

yarn addしたmoduleのsubmoduleがempty問題

Last updated at Posted at 2018-06-03

環境

  • リポジトリAリポジトリBがある。
  • リポジトリBのsubmoduleにリポジトリCを設定している
  • リポジトリAはmonorepo環境であり、lerna&yarnで管理)
・リポジトリA

・リポジトリB
   └── リポジトリC(submodule)

・リポジトリC
   └── hogehoge

何が起きたか

  1. リポジトリAのpackage.jsonにリポジトリBを追加する
  2. yarn installする
  3. リポジトリ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。
(シンボリックリンク作る前に空のディレクトリは削除している)

実行ファイル.sh
# リポジトリ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/

(実行したい処理)

解決。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?