Heroku node_modules не кэшируется
У меня есть toplevel package.json, где я устанавливаю cacheDirectories согласно https://devcenter.heroku.com/articles/nodejs-support
"scripts": {
"start": "npm --prefix frontend start && npm --prefix mockserver start",
},
"dependencies": {
},
"devDependencies": {
},
"cacheDirectories": ["frontend/node_modules", "mockserver/node_modules"],
...
Так что нет никаких зависимостей в toplevel, но у меня есть frontend/package.json и mockserver/package.json с множеством зависимостей, которые устанавливаются в их соответствующие node_modules. Вот как выглядит соответствующий package.jsons (например, mockserver):
"scripts": {
"start": "npm install && npm run build && node dist/server.js",
},
dependencies...
devdependencies...
Это работает нормально и развертывается, но не кэширует два узла node_modules, определенные для кэширования.
Вот выход из сборки героя:
-----> Creating runtime environment
NPM_CONFIG_LOGLEVEL=error
NPM_CONFIG_PRODUCTION=true
NODE_VERBOSE=false
NODE_ENV=demo
NODE_MODULES_CACHE=true
npm scripts will see NODE_ENV=production (not 'demo')
https://docs.npmjs.com/misc/config#production
-----> Installing binaries
engines.node (package.json): 7.10.0
engines.npm (package.json): unspecified (use default)
Downloading and installing node 7.10.0...
Using default npm version: 4.2.0
-----> Restoring cache
Loading 2 from cacheDirectories (package.json):
- frontend/node_modules (not cached - skipping)
- mockserver/node_modules (not cached - skipping)
-----> Building dependencies
Installing node modules (package.json)
-----> Caching build
Clearing previous node cache
Saving 2 cacheDirectories (package.json):
- frontend/node_modules (nothing to cache)
- mockserver/node_modules (nothing to cache)
-----> Build succeeded!
Просто заметьте, что два модуля node_modules были установлены в предыдущей сборке, но там написано (не кэшировано - пропущено).
Заранее спасибо!
1 ответ
Я получил ответ здесь: https://github.com/heroku/heroku-buildpack-nodejs/issues/435
Таким образом, я должен был использовать heroku-postbuild вместо сценария запуска для установки пользовательских зависимостей. И используйте запуск только в качестве команды запуска приложения.
Пакет верхнего уровня
"scripts": {
"heroku-postbuild": "npm --prefix frontend run installAndCompile && npm --prefix mockserver run installAndCompile",
"start": "npm --prefix mockserver start"
},
Подпроектный пакет.json
"scripts": {
"installAndCompile": "npm install && npm run compile"
},