なつねこメモ

主にプログラミング関連のメモ帳 ♪(✿╹ヮ╹)ノ 書いてあるコードは自己責任でご自由にどうぞ。記事本文の無断転載は禁止です。

Unity で monorepo っぽいものをなんとかしたい

なんやかんやあって Unity のパッケージで、1 レポジトリで複数のパッケージを管理しているのですが、
もろもろ自動化したかったので、 Node.js 界隈でよく見る monorepo 風に管理してみました。
誰か正しい方法知ってたら教えてください。

~だって package.json つかって NPM に publish してるんだし、これが正しいんでしょしらんけど。~

ということでいつも通りの前提条件

  • Node.js 14.x
  • Yarn v1

基本的には Yarn Workspaces を使うことになります。
まずはいつも通りに yarn init し、 workspacesAssets/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 といった感じで使えます。

ということで、メモでした。