不要运行`npm安装-g ..是一个陷阱!
#aws #node #devrel

我最近遇到了一个我的同事在全球安装AWS CDK的情况:

npm install -g aws-cdk

我不怪任何这样做的人,因为官方的AWS文档及其讲习班正在促进以这种方式安装:https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html

但是有一个捕获!ð«£

版本的不匹配

假设您最近加入了一个新项目,并且您没有注意到他们已经固定了特定版本的软件包版本。由于您一直在与AWS CDK合作,因此您在3个月前在全球安装了它。

您知道它已经安装在计算机上。因此,您盲目地运行cdk synth

This CDK CLI is not compatible with the CDK library used by your application. Please upgrade the CLI to the latest version. (Cloud assembly schema version mismatch: Maximum schema version supported is 6.0.0, but found 7.0.0)

ehm ...发生了什么事? ðρ

好吧,根据消息,您只需要更新npm install -g aws -cdk和解决问题。

AWS CDK社区发布得这么快(我认为每周发布一个版本)。这意味着如果您的最后一个CDK项目是在3个月前设立的,则您将包括12个版本,并且可能包括破坏更改。

此外,您全球安装的cdk-版本可能与项目中的版本不符。因为如果您使用的是UNIX机器,系统将始终将全球安装的版本置于优先级(我不确定Windows)。

他们甚至在他们的troubleshooting page上提到)

该项目的二进制位于node_modules内部

作为回顾,将所有内容放入package.json中,将作为依赖项下载。如果您使用CloudFlare工人,则将下载其CLI并将其放入node_modules/bin

当您想使用它时,可以在任何wrangler命令之前运行npx。那是运行./node_modules/bin的别名。您还可以自定义package.json内的script-部分。例如

{
  "scripts": {
      "dev": "wrangler dev src/index.ts",
      "deploy": "wrangler deploy --minify src/index.ts"
    }
}

在这种情况下,它将始终从node_modules/bin拿起CLI。

您可以使用CDK的情况 -

{
    "scripts": {
        "synth": "cdk synth",
        "dev": "cdk watch",
        "deploy": "cdk deploy"
    }
}

如果您运行npm run synth,它将从node_modules中选择正确的CDK版本。

如果您想引导一个新的CDK项目,则应使用npx
引导它

npx cdk init app --language typescript

将在全球临时安装CDK CLI。

提示:如果您有几个CDK项目,并且不想通过许多CDK下载来膨胀机器,则应考虑pnpmyarn v2

如果您查看其他Nodejs-(例如Wrangler,SSTVite)等其他项目,则它们都不会要求您在全球上安装它。当然,有例外使用pnpm

结论

运行cdk -cli时,您的操作系统正在尝试查看是否将CLI安装在bin中的一个(全球)。

我一直在阅读和构建一些使用React,Astro,Vuejs,Svelte和Cloudflare工人的Nodejs/typeScript应用程序,它们都不要求您在全球安装某些东西。我不知道为什么AWS CDK会推广这一点,因为它会造成更多麻烦,并猜测所有问题都在全球删除aws-cdk并重新安装

https://github.com/aws/aws-cdk/issues/11494

https://stackoverflow.com/questions/66565550/how-to-solve-cdk-cli-version-mismatch

https://github.com/aws/aws-cdk/issues/14738

如果您的终端说找不到它,那是一个谎言,因为您需要使用npx将其指向node_modules。它只是运行./node_modules/bin/cdk的别名。

通常,您不应在全球安装NPM软件包,因为它可能在您的node_modules中使用该项目的正确版本。

如果您找到了一个页面,它说要运行npm install -g是一个陷阱。