我有以下项目,我正在使用 Pulumi 来管理我的各种云运行作业。我正在尝试设置我的所有包管理,以便为每个开发使用像
mise
这样的工具。问题是每个云运行作业都有自己的 package.json 文件,并且没有简单的方法来递归安装所有 node_modules。我研究过像yarn工作区或pnpm(带有递归安装)这样的工具,但都不起作用。当我使用这些工具时,pulumi up
失败并出现语法错误。我只能在每个子目录中运行 pulumi up
后才能在每个作业上运行 npm i
,这很麻烦。
├── README.md
├── infra
│ ├── job1
│ │ ├── Pulumi.dev.yaml
│ │ ├── Pulumi.prod.yaml
│ │ ├── Pulumi.qa.yaml
│ │ ├── Pulumi.yaml
│ │ ├── index.ts
│ │ ├── package-lock.json
│ │ ├── package.json
│ │ └── tsconfig.json
│ ├── job2
│ │ ├── Pulumi.dev.yaml
│ │ ├── Pulumi.prod.yaml
│ │ ├── Pulumi.qa.yaml
│ │ ├── Pulumi.yaml
│ │ ├── index.ts
│ │ ├── package-lock.json
│ │ ├── package.json
│ │ └── tsconfig.json
│ └── job3
│ ├── Pulumi.dev.yaml
│ ├── Pulumi.prod.yaml
│ ├── Pulumi.qa.yaml
│ ├── Pulumi.yaml
│ ├── index.ts
│ ├── package-lock.json
│ ├── package.json
│ └── tsconfig.json
├── justfile
├── lib
│ └── job5
│ ├── cloudrun.ts
│ ├── package-lock.json
│ ├── package.json
│ └── tsconfig.json
├── mise.toml
有没有一种方法可以从主项目目录递归调用
npm i
? 是否可以以某种方式共享 package.json 文件,它们本质上都是相同的:
{
"name": "job1",
"main": "index.ts",
"version": "1.0.0",
"devDependencies": {
"@eslint/eslintrc": "^3.2.0",
"@eslint/js": "^9.17.0",
"@eslint/migrate-config": "1.3.5",
"@types/node": "^18.19.69",
"@typescript-eslint/eslint-plugin": "^8.19.0",
"@typescript-eslint/parser": "^8.19.0",
"eslint": "^9.17.0",
"typescript": "^5.7.2"
},
"dependencies": {
"@lib/cloudrun": "file:../../lib/job5",
"@pulumi/docker": "^4.5.8",
"@pulumi/gcp": "^7.38.0",
"@pulumi/pulumi": "^3.144.1",
"@pulumi/random": "^4.16.8",
"natural-cron": "^1.0.2"
}
}
What is the best practice here? I am open to any and all solutions.
您可以编写脚本来递归安装依赖项。这是使用简单
Node.js
脚本的示例:
创建脚本文件
const { execSync } = require('child_process');
const path = require('path');
const fs = require('fs');
const directories = ['infra/job1', 'infra/job2', 'infra/job3', 'lib/job5'];
directories.forEach(dir => {
const packageJsonPath = path.join(__dirname, dir, 'package.json');
if (fs.existsSync(packageJsonPath)) {
console.log(`Installing dependencies in ${dir}`);
execSync('npm install', { cwd: path.join(__dirname, dir), stdio: 'inherit' });
}
});
运行脚本 ->
node install-deps.js
使用
mise
进行包管理
您可以配置 mise
来处理每个作业的依赖项安装。 mise.toml
配置示例:
[tasks.install]
command = "npm"
args = ["install"]
cwd = ["infra/job1", "infra/job2", "infra/job3", "lib/job5"]
然后,您可以使用 ->
mise run install
运行任务
其他注意事项: 如果您想要更集成的解决方案,建议使用 monorepo 工具,例如
lerna
或 yarn
工作区。如果您喜欢更简单的方法,递归安装依赖项的脚本就足够了。