node.js - Heroku Review App 不缓存 node_modules
问题描述
我使用以下 buildpack:heroku-buildpack-nodejs
默认情况下,它应该缓存和恢复node_modules
。
yarn.lock
文件位于应用程序的根目录以及package.json
.
我也添加"cacheDirectories": [".cache/yarn"]
到package.json
在 review-app 构建日志分析期间,我看到:
-----> Restoring cache
Loading 1 from cacheDirectories (package.json):
- .cache/yarn (not cached - skipping)
...
-----> Installing dependencies
Installing node modules (yarn.lock)
...
-----> Caching build
- node_modules
似乎这个问题是在 2016 年 12 月 20 日打开的: https ://github.com/heroku/heroku-buildpack-nodejs/issues/359
如何在不安装每个构建的依赖项的情况下实现缓存机制?
解决方案
Heroku NodeJS构建包的 v83 不支持使用 yarn 安装依赖项。这是在v93中添加的。
Buildpack v93 并非没有自己的问题。由于它对相对于as的纱线缓存路径进行硬编码。这会带来一个问题,因为它是一个临时目录,并且不能依赖于在下一次部署中存在。$build_dir
$build_dir/.cache/yarn/v2
$build_dir
为了演示这一点,为key in添加一个heroku-postbuild
或heroku-prebuild
命令脚本以显示正在运行的文件夹部署。scripts
package.json
"heroku-postbuild": "pwd"
构建日志的部分输出
remote: $ echo 'postbuild'; pwd
remote: postbuild
remote: /tmp/build_260cb9d4ad95c7671332f8a404117b59
remote: Done in 0.10s.
后续版本的 buildpack 解决了有关 yarn 部署的一些问题。我建议使用当前为v165的最新构建包
在 v165 中,缓存从yarn 缓存依赖项的临时文件夹复制cacheDirectories
到为key in配置的文件夹package.json
目前,此功能位于功能标志后面。
为了为您的部署启用它,请features
在您的项目中创建一个文件。
.
├── README.md
├── features
├── package.json
└── yarn.lock
在features
文件中,写
cache-native-yarn-cache=true
重新运行您的部署应该会产生类似于以下内容的日志:
remote:
remote: -----> Restoring cache
remote: Loading 1 from cacheDirectories (package.json):
remote: - .cache/yarn
推荐阅读
- angular - 选择过滤器后未打开 Angular 9 对话框窗口
- javascript - Sort an array by an objects value into multiple arrays
- javascript - Radio button that filter through products javascript
- mysql - strange mysql query issue
- java - second button in my game doesn't colored up
- ruby - Fastlane can not run git actions in a certain project folder
- python - How does pipenv decide my python version and why does the requirement.txt generated different from the original?
- c++ - What does str[i]!='\0' mean?
- java - Best practice to organize SpringBoot Events/EventListeners
- django - My site shows menus based on a users privs. I have a function that returns the privs as a dictionary as below: