なんやかんやあって Unity のパッケージで、1 レポジトリで複数のパッケージを管理しているのですが、
もろもろ自動化したかったので、 Node.js 界隈でよく見る monorepo 風に管理してみました。
誰か正しい方法知ってたら教えてください。
~だって package.json
つかって NPM に publish してるんだし、これが正しいんでしょしらんけど。~
ということでいつも通りの前提条件
- Node.js 14.x
- Yarn v1
基本的には Yarn Workspaces を使うことになります。
まずはいつも通りに yarn init
し、 workspaces
に Assets/Namespace/**
とやってあげます。
次に、以下のパッケージを導入します。
patch-package
を入れているのは、 oao
が Unity のようなプラットフォームでの利用を想定していないためです。
次に、以下のようなパッチを作ります。
diff --git a/node_modules/oao/lib/utils/readSpecs.js b/node_modules/oao/lib/utils/readSpecs.js index 729b985..8a99d85 100644 --- a/node_modules/oao/lib/utils/readSpecs.js +++ b/node_modules/oao/lib/utils/readSpecs.js @@ -74,16 +74,16 @@ const validatePkgName = (pkgPath, name) => { } if (pkgPath === '.') return; - const segments = pkgPath.split('/'); - - if (name[0] !== '@' && name !== segments[segments.length - 1]) { - const errMsg = `Package name (${name}) does not match directory name ${pkgPath}`; - - _storyboard.mainStory.error(errMsg); - - const err = new Error('INVALID_DIR_NAME'); // $FlowFixMe (piggyback on exception) - - err.details = errMsg; - throw err; - } + // const segments = pkgPath.split('/'); + + // if (name[0] !== '@' && name !== segments[segments.length - 1]) { + // const errMsg = `Package name (${name}) does not match directory name ${pkgPath}`; + // + // _storyboard.mainStory.error(errMsg); + // + // const err = new Error('INVALID_DIR_NAME'); // $FlowFixMe (piggyback on exception) + // + // err.details = errMsg; + // throw err; + // } }; \ No newline at end of file
単純に、命名規則をチェックしている部分をまるまるコメントアウトしただけですね。
あとは、通常通り oao
を使えば動きます。
Publish する場合は yarn oao publish --access public
、
リポジトリの状態を確認するには yarn oao status
といった感じで使えます。
ということで、メモでした。