■
1つのプロジェクト成り立たせるためにGCPのApp EngineとCloud Functionsで動作させています。App Engine、Cloud Functions両方共通のコードがあります。この共通コードをどこに置くかで小一時間悩みました。
結論から言うと共通コードはリポジトリを分けて、git submoduleで取り込むことにしたのですが、その経緯を書きます。
最初は以下のようにしようと思いました。
common
└ **/*.js
appEngine
├ package.json
├ node_modules/**
└ **/*.js
cloudFunctions
├ package.json
├ node_modules/**
└ **/*.js
そしてappEngine、cloudFunctions以下のjsファイルから相対パスでcommon以下のjsをimport。
[appEngine/index.js]
import "../common/hoge.js"
しかし、common以下にはnode_modulesがない。appEngineやcloudFunctions以下のnode_modulesにあるモジュールをcommon以下のjsでimportすると、そんなものはないと怒られる。
[common/hoge.js]
import {Request, Response} from "express" -> expressはないとエラーになる
common以下にpackage.jsonを置いてnpm install, yarn installでcommon/node_modulesを作ると動くけど、common、appEngine、cloudFunctionsそれぞれのnode_modules以下のモジュールのバージョンが食い違うと上手く動作しなくなることがある。
というわけで以下のようにcommonは別リポジトリにして、それぞれgit submoduleで取り込むのが良いと判断しました。
appEngine
├ package.json
├ node_modules/**
├ common/**/*.js <- commonはgit submodule
└ **/*.js
cloudFunctions
├ package.json
├ node_modules/**
├ common/**/*.js <- commonはgit submodule
└ **/*.js
appEngineとcloudFunctionsが同じリポジトリで、異なるディレクトリでcommonを別々にgit submodleで取り込むこともできます。が、結局、appEngine、cloudFunctionsもリポジトリ分けましたけどね・・・