首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS CodeBuild tsc错误TS2307:找不到模块

AWS CodeBuild tsc错误TS2307:找不到模块
EN

Stack Overflow用户
提问于 2021-03-11 21:01:09
回答 2查看 5.4K关注 0票数 9

我已经创建了两个不同的TypeScript cdk管道,它们在CodeBuild阶段都会遇到相同的tsc错误。

其中两个管道是通过cdk文档复制的:

本质上,npm i (或npm ci) + tsc在本地工作良好,但是当通过CodeBuild完成时,我的依赖项似乎没有安装它们的依赖项,从而导致tsc中断。

还有其他人遇到过这个问题吗?或者换句话说,为什么npm install + tsc在CodeBuild上的行为会有所不同?

CodeBuild日志1:

代码语言:javascript
复制
[Container] 2021/03/11 19:11:35 Waiting for DOWNLOAD_SOURCE
[Container] 2021/03/11 19:11:36 Phase is DOWNLOAD_SOURCE
[Container] 2021/03/11 19:11:36 CODEBUILD_SRC_DIR=/codebuild/output/src038984068/src
[Container] 2021/03/11 19:11:36 YAML location is /codebuild/readonly/buildspec.yml
[Container] 2021/03/11 19:11:36 Processing environment variables
[Container] 2021/03/11 19:11:36 No runtime version selected in buildspec.
[Container] 2021/03/11 19:11:36 Moving to directory /codebuild/output/src038984068/src
[Container] 2021/03/11 19:11:36 Registering with agent
[Container] 2021/03/11 19:11:36 Phases found in YAML: 2
[Container] 2021/03/11 19:11:36  PRE_BUILD: 1 commands
[Container] 2021/03/11 19:11:36  BUILD: 2 commands
[Container] 2021/03/11 19:11:36 Phase complete: DOWNLOAD_SOURCE State: SUCCEEDED
[Container] 2021/03/11 19:11:36 Phase context status code:  Message: 
[Container] 2021/03/11 19:11:36 Entering phase INSTALL
[Container] 2021/03/11 19:11:36 Phase complete: INSTALL State: SUCCEEDED
[Container] 2021/03/11 19:11:36 Phase context status code:  Message: 
[Container] 2021/03/11 19:11:36 Entering phase PRE_BUILD
[Container] 2021/03/11 19:11:36 Running command npm ci
added 772 packages in 7.728s

[Container] 2021/03/11 19:11:48 Phase complete: PRE_BUILD State: SUCCEEDED
[Container] 2021/03/11 19:11:48 Phase context status code:  Message: 
[Container] 2021/03/11 19:11:48 Entering phase BUILD
[Container] 2021/03/11 19:11:48 Running command npm run build

> cdk-s3-sns-lambda@0.1.0 build /codebuild/output/src038984068/src
> tsc

node_modules/@aws-cdk/aws-codebuild/lib/pipeline-project.d.ts(1,27): error TS2307: Cannot find module 'constructs' or its corresponding type declarations.
(...cascade of missing module errors)
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! cdk-s3-sns-lambda@0.1.0 build: `tsc`
npm ERR! Exit status 2

CodeBuild日志2:

代码语言:javascript
复制
[Container] 2021/03/11 19:54:10 Waiting for agent ping
[Container] 2021/03/11 19:54:15 Waiting for DOWNLOAD_SOURCE
[Container] 2021/03/11 19:54:16 Phase is DOWNLOAD_SOURCE
[Container] 2021/03/11 19:54:16 CODEBUILD_SRC_DIR=/codebuild/output/src363431369/src
[Container] 2021/03/11 19:54:16 YAML location is /codebuild/readonly/buildspec.yml
[Container] 2021/03/11 19:54:16 Processing environment variables
[Container] 2021/03/11 19:54:16 No runtime version selected in buildspec.
[Container] 2021/03/11 19:54:16 Moving to directory /codebuild/output/src363431369/src
[Container] 2021/03/11 19:54:16 Registering with agent
[Container] 2021/03/11 19:54:16 Phases found in YAML: 2
[Container] 2021/03/11 19:54:16  INSTALL: 1 commands
[Container] 2021/03/11 19:54:16  BUILD: 2 commands
[Container] 2021/03/11 19:54:16 Phase complete: DOWNLOAD_SOURCE State: SUCCEEDED
[Container] 2021/03/11 19:54:16 Phase context status code:  Message: 
[Container] 2021/03/11 19:54:16 Entering phase INSTALL
[Container] 2021/03/11 19:54:16 Running command npm install
npm WARN read-shrinkwrap This version of npm is compatible with lockfileVersion@1, but package-lock.json was generated for lockfileVersion@2. Ill try to do my best with it!
npm WARN pipeline@0.1.0 No repository field.
npm WARN pipeline@0.1.0 No license field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.3.2 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.3.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

added 762 packages from 491 contributors and audited 764 packages in 12.459s

28 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities


[Container] 2021/03/11 19:54:30 Phase complete: INSTALL State: SUCCEEDED
[Container] 2021/03/11 19:54:30 Phase context status code:  Message: 
[Container] 2021/03/11 19:54:30 Entering phase PRE_BUILD
[Container] 2021/03/11 19:54:30 Phase complete: PRE_BUILD State: SUCCEEDED
[Container] 2021/03/11 19:54:30 Phase context status code:  Message: 
[Container] 2021/03/11 19:54:30 Entering phase BUILD
[Container] 2021/03/11 19:54:30 Running command npm run build

> pipeline@0.1.0 build /codebuild/output/src363431369/src
> tsc

node_modules/@aws-cdk/aws-codebuild/lib/artifacts.d.ts(1,21): error TS2307: Cannot find module '@aws-cdk/aws-s3' or its corresponding type declarations.
(...more missing module errors)
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! pipeline@0.1.0 build: `tsc`
npm ERR! Exit status 2

其他详情:

  • 我确保我的@aws-cdk/* dep都安装在完全相同的版本上。
  • 在cdk 1.60.0、1.92.0、1.93.0上转载
  • 来自PipelineStack日志1的CodeBuild类:
代码语言:javascript
复制
// lib/pipeline-stack.ts
import * as cdk from '@aws-cdk/core';
import * as codecommit from '@aws-cdk/aws-codecommit';
import * as codepipeline from '@aws-cdk/aws-codepipeline';
import * as codepipeline_actions from '@aws-cdk/aws-codepipeline-actions';
import { SimpleSynthAction, CdkPipeline } from '@aws-cdk/pipelines';

export class PipelineStack extends cdk.Stack {
  constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
    super(scope, id);

    const repo = new codecommit.Repository(this, 'UploadRepo', {
      repositoryName: 'cdk-s3-sns-lambda'
    });

    const sourceArtifact = new codepipeline.Artifact();
    const cloudAssemblyArtifact = new codepipeline.Artifact();

    new CdkPipeline(this, 'CodePipeline', {
      crossAccountKeys: false,
      cloudAssemblyArtifact,
      sourceAction: new codepipeline_actions.CodeCommitSourceAction({
        actionName: 'CodeCommit',
        output: sourceArtifact,
        repository: repo
      }),
      synthAction: SimpleSynthAction.standardNpmSynth({
        sourceArtifact,
        cloudAssemblyArtifact,
        buildCommand: 'npm run build'
      }),
    });
  }
}


// bin/pipeline.ts
#!/usr/bin/env node
import 'source-map-support/register';
import * as cdk from '@aws-cdk/core';
import { PipelineStack } from '../lib/pipeline-stack';

const app = new cdk.App();
new PipelineStack(app, 'AppPipelineStack');
  • buildspec.yaml日志1生成CodeBuild:
代码语言:javascript
复制
{
  "version": "0.2",
  "phases": {
    "pre_build": {
      "commands": [
        "npm ci"
      ]
    },
    "build": {
      "commands": [
        "npm run build",
        "npx cdk synth"
      ]
    }
  },
  "artifacts": {
    "base-directory": "cdk.out",
    "files": "**/*"
  }
}
EN

回答 2

Stack Overflow用户

发布于 2021-03-25 07:46:34

我一直面临着同样的问题。

这个GH问题(https://github.com/aws/aws-cdk/issues/13339)的解决办法帮助了我.

我这样改变了我在CDK的构建规范

代码语言:javascript
复制
synthAction: SimpleSynthAction.standardNpmSynth({
  sourceArtifact,
  cloudAssemblyArtifact,
  installCommand: 'npm i -g npm && npm ci'
}),

这将为管道构建步骤生成以下(内联)构建规范:

代码语言:javascript
复制
{
  "version": "0.2",
  "phases": {
    "pre_build": {
      "commands": [
        "npm i -g npm && npm ci"
      ]
    },
    "build": {
      "commands": [
        "npx cdk synth"
      ]
    }
  },
  "artifacts": {
    "base-directory": "cdk.out",
    "files": "**/*"
  }
}

在第一次推送代码并运行管道之后,我不得不自己修改buildspec,因为管道突变步骤是在构建步骤之后触发的。因此,设置将在突变步骤之后应用。

票数 4
EN

Stack Overflow用户

发布于 2021-04-06 17:06:44

简短回答

在本地和CodeBuild中使用相同的npm版本。我怀疑这个问题的出现是因为您在本地使用的npm版本比CodeBuild正在使用的版本要新。

较长答案

CodeBuild在特定的环境(Docker )中运行构建,并且这个环境安装了某些版本的运行时/包,例如Node.js/npm。因此,如果您使用npmv7.x进行开发,并且您的CodeBuild使用npmv6.x,那么npm ci命令使用的包-lock.json文件将与CodeBuild的环境不兼容,构建将失败。

(当使用CDK时,会为您选择图像作为SimpleSynthAction.standardNpmSynth操作的一部分。)

幸运的是,您可以更改其中一个以匹配另一个。

使本地版本的Node.js/npm与CodeBuild中使用的版本匹配

  1. 首先,通过转到CodeBuild > Build >您的构建项目> build (新的AWS控制台),找出CodeBuild使用的Docker映像。在“环境”部分中,用于构建的映像列在Image下面。
  2. 然后在本综述中找到该映像使用的运行时版本(如果您感兴趣,请查看该映像的Dockerfile)。例如,最新的"nodejs“运行时支持的是14,这仅受"Ubuntu标准:5.0”映像的支持。SimpleSynthAction.standardNpmSynth 使用的默认映像是"Ubuntu标准:4.0“.
  3. 在本地使用该运行时。

使CodeBuild使用所需的运行时版本

同样,实现这一目标的方法有多种:

  1. 为您的构建选择另一个环境(Docker图像)。当您使用CDK时,可以通过指定您的environment属性synthAction:new CdkPipeline( this,'CodePipeline',{ crossAccountKeys: false,cloudAssemblyArtifact,sourceAction: new codepipeline_actions.CodeCommitSourceAction({ actionName:'CodeCommit',输出: sourceArtifact,存储库: repo }),synthAction: SimpleSynthAction.standardNpmSynth({ sourceArtifact,cloudAssemblyArtifact,环境:{ buildImage: LinuxBuildImage.STANDARD_5_0 },buildCommand:'npm run build‘},});
  2. 在buildspec文件中指定运行时版本,例如阶段:安装:运行时-版本: nodejs: 14.x 这可能会有更大的风险,因为您指定的运行时版本可能与其他运行时版本(例如已在所选的Docker映像中的版本)不兼容。
  3. 安装所需的运行时版本,嗯,运行时,例如,通过使用installCommand重写'npm i -g npm && npm ci',这是@ GitHub问题引用的GitHub问题的作者所建议的。我个人不建议这样做,这似乎有点太麻烦了,而且也不能保证它会(继续)工作。

奖金信息

您可以使用本地运行CodeBuild来模拟CodeBuild环境。从指南中也可以清楚地看到,您正在决定使用哪个码头形象。

结论

您所描述的问题可能只是NPMv6.x与v7.x之间的一个特殊问题,但我认为它代表了更广泛的问题类别,所有这些问题都应该通过了解不同包/运行时CodeBuild使用的版本来解决,本质上使您的期望与现实保持一致(或改变现实)。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66590492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档