在 AWS CodeBuild 期间使用 npm install 时未创建 node_modules 目录

Posted

技术标签:

【中文标题】在 AWS CodeBuild 期间使用 npm install 时未创建 node_modules 目录【英文标题】:node_modules directory not created when using npm install during AWS CodeBuild 【发布时间】:2020-10-22 10:35:47 【问题描述】:

CodeBuild 完成并通过 ssh 进入我的环境后,我可以看到服务器应用程序的依赖项已安装并在其 node_modules 中找到。但是在客户端目录中,没有 node_modules 也没有 build 目录。在构建日志中,npm install --prefix client --production 似乎运行良好。

我的问题与this one 几乎一模一样,只是它既是 node_modules 又是 build 文件夹。

buildspec 文件有问题吗?这是(EDIT 4:更新)

version: 0.2

phases:
  install:
    commands:
      # upgrade AWS CLI
      - pip install --upgrade awscli
      # install Node 12
      - curl -sL https://deb.nodesource.com/setup_12.x | bash -
      - apt install nodejs

  pre_build:
    commands:
      # install server dependencies
      - npm install
  build:
    commands:
      # install client dependencies and build static files
      - npm install --prefix client && npm run build --prefix client

  post_build:
    commands:
      - ls -la
      - ls client -la

artifacts:
  files:
    - '**/*'

编辑 1:以下是代码构建日志为 npm install --prefix client 显示的示例:

Running command npm install --prefix client --production



> core-js@2.6.11 postinstall /codebuild/output/src133125934/src/client/node_modules/babel-runtime/node_modules/core-js
> node -e "tryrequire('./postinstall')catch(e)"

对于npm run build -prefix client

[Container] 2020/07/02 00:24:06 Entering phase BUILD
[Container] 2020/07/02 00:24:06 Running command npm run build --prefix client



> client@0.1.0 build /codebuild/output/src133125934/src/client
> react-scripts build



Creating an optimized production build...
Compiled successfully.



File sizes after gzip:



  144.95 KB  build/static/js/2.d25271aa.chunk.js
  23.22 KB   build/static/css/main.fe6e5073.chunk.css
  6.38 KB    build/static/js/main.8e99a285.chunk.js
  774 B      build/static/js/runtime-main.f63e6028.js

编辑 2:使用 ls 查看构建后的目录:

[Container] 2020/07/02 01:11:24 Entering phase POST_BUILD
[Container] 2020/07/02 01:11:24 Running command ls -la
total 136
drwxr-xr-x  12 root root  4096 Jul  2 01:09 .
drwxr-xr-x   3 root root  4096 Jul  2 01:09 ..
drwxr-xr-x   2 root root  4096 Jul  2 01:09 .ebextensions
-rw-rw-r--   1 root root   130 Jul  2 01:08 .gitignore
-rw-rw-r--   1 root root    16 Jul  2 01:08 .npmrc
-rw-rw-r--   1 root root    34 Jul  2 01:08 README.md
-rw-rw-r--   1 root root  1737 Jul  2 01:08 app.js
drwxr-xr-x   2 root root  4096 Jul  2 01:09 bin
-rw-rw-r--   1 root root   566 Jul  2 01:08 buildspec.yml
drwxr-xr-x   6 root root  4096 Jul  2 01:10 client
drwxr-xr-x   2 root root  4096 Jul  2 01:09 config
drwxr-xr-x   2 root root  4096 Jul  2 01:09 graphql
drwxr-xr-x   2 root root  4096 Jul  2 01:09 models
drwxr-xr-x 197 root root  4096 Jul  2 01:10 node_modules
-rw-rw-r--   1 root root 63888 Jul  2 01:08 package-lock.json
-rw-rw-r--   1 root root   814 Jul  2 01:08 package.json
drwxr-xr-x   2 root root  4096 Jul  2 01:09 routes
drwxr-xr-x   2 root root  4096 Jul  2 01:09 services
drwxr-xr-x   2 root root  4096 Jul  2 01:09 views




[Container] 2020/07/02 01:11:24 Running command ls client -la
total 748
drwxr-xr-x    6 root root   4096 Jul  2 01:10 .
drwxr-xr-x   12 root root   4096 Jul  2 01:09 ..
drwxr-xr-x    3 root root   4096 Jul  2 01:11 build
drwxr-xr-x 1081 root root  36864 Jul  2 01:10 node_modules
-rw-rw-r--    1 root root 699332 Jul  2 01:08 package-lock.json
-rw-rw-r--    1 root root   1212 Jul  2 01:08 package.json
drwxr-xr-x    2 root root   4096 Jul  2 01:09 public
drwxr-xr-x    8 root root   4096 Jul  2 01:09 src

编辑 3:验证目录已创建后,我 ssh 进入 beanstalk (ec2) 实例以检查它们是否已部署,但这就是我得到的:

$ cd /var/app/current
$ ls
app.js
bin
buildspec.yml
client
config
graphql
models
node_modules
package.json
package-lock.json
Procfile
README.md
routes
services
views

$ cd client
$ ls
package.json 
package-lock.json 
public 
src

build 和 modules 目录没有部署到 beanstalk 中。

【问题讨论】:

您确定您需要的所有文件都在client/build 中吗?使用base-directory**/* 将适用于client/build。您也可以转到 S3 并以 zip 格式下载工件并检查其结构以详细了解其内容。 @Marcin 这是我第一个使用 aws 的项目,如果我错了,请纠正我,但基本目录中的文件不应该是 Elastic Beanstalk 上网站的静态文件吗?还是应该是整个项目? 我假设您使用 CodePipeline 并且 CP 部署到 EB?那么它应该是整个项目,就像您通过 EB 控制台自己上传 zip 文件一样。 @Marcin 感谢您的澄清!我在删除基本目录后检查了结构,client/node_modulesclient/build 目录仍然不存在。我不知道哪个阶段导致了这个错误;查看日志时,命令 npm install --prefix clientnpm run build --prefix client 正在运行,所以我假设目录正在创建 somewhere 只需删除 `base-directory: 'client/build'` 即可进行测试和故障排除。这将允许您下载整个文件夹并检查它。也许npm install 是安装在系统文件夹中,而不是您的本地直接工作? 【参考方案1】:

问题在于 CodePipeline 的 Deploy 阶段接收的是 Source 输出,而不是 Build 输出。将 Deploy 输入设置为 Build 输出修复了它!

【讨论】:

以上是关于在 AWS CodeBuild 期间使用 npm install 时未创建 node_modules 目录的主要内容,如果未能解决你的问题,请参考以下文章

无法将更改从 AWS CodeBuild 推送到 AWS CodeCommit

AWS Sam package 命令在构建规范期间失败

使用 AWS CDK 创建用于构建 Docker 映像的 CodeBuild 项目

AWS codeBuild 不运行 .ebextension 配置

AWS Batch 与 AWS CodeBuild

AWS CodePipeline 能否在不劫持 CodeBuild 的工件设置的情况下触发 AWS CodeBuild?