在Pulumi资源中递归安装node_modules

问题描述 投票:0回答:1

我有以下项目,我正在使用 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 npm pulumi
1个回答
0
投票

您可以编写脚本来递归安装依赖项。这是使用简单

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
工作区。如果您喜欢更简单的方法,递归安装依赖项的脚本就足够了。

© www.soinside.com 2019 - 2024. All rights reserved.