shell dotenv cli从`package.json`脚本中执行的命令动态设置环境变量

ryhaxcpt  于 2023-05-18  发布在  Shell
关注(0)|答案(1)|浏览(210)

我有一个简单的命令来运行nodejs程序,设置了动态环境变量:

pnpm exec dotenv -v DATABASE_URL=$(pnpm exec ts-node ./getDatabaseUrl.ts) -- pnpm -C backend run migrate:dev:main

它执行getDatabaseUrl.ts脚本并使用dotenv-cli将结果分配给环境变量,然后执行下一个脚本(pnpm -C backend run migrate:dev:main),DATABASE_URL env var将可用。
当我在PowerShell 7.3.4下运行它时,它工作得很好,但是当我把它放在package.json中时,它就不工作了:

{
  "scripts": {
    "migrate:dev:main": "pnpm exec dotenv -v DATABASE_URL=$(pnpm exec ts-node ./getDatabaseUrl.ts) -- pnpm -C backend run migrate:dev:main"
  }
}

显示这样的错误:Unexpected argument DATABASE_URL=$(pnpm. Expected variable in format variable=value如何使此命令从package.json脚本工作?我也试过在没有pnpm的情况下这样做:

{
  "scripts": {
    "migrate:dev:main": "dotenv -v DATABASE_URL=$(pnpm exec ts-node ./getDatabaseUrl.ts) -- pnpm -C backend run migrate:dev:main"
  }
}

但它无论如何都不工作,错误:-- was unexpected at this time.或类似于此(类似错误):

{
  "scripts": {
    "migrate:dev:main": "dotenv -v DATABASE_URL=$(pnpm exec ts-node ./getDatabaseUrl.ts) pnpm -C backend run migrate:dev:main"
  }
}

错误:pnpm was unexpected at this time.

3yhwsihp

3yhwsihp1#

npm的默认脚本shell是cmd.exe(源代码)。
您可能正在使用这个默认值,因为$(...)不会被计算。您可以通过多种方式解决问题:
1.将脚本shell更改为pwsh(docs):

pnpm config set script-shell "pwsh"

使用绝对路径,如果pwsh不在你的路径中,e. g. "C:\\path\\to\\pwsh.exe"
1.使用PowerShell * 显式 * 执行命令。这将在两个脚本shell中工作,cmdpwsh/powershell

{
  "scripts": {
    "migrate:dev:main": "pwsh -ExecutionPolicy ByPass -NoProfile -Command \"pnpm exec dotenv -v DATABASE_URL=$(pnpm exec ts-node ./getDatabaseUrl.ts) -- pnpm -C backend run migrate:dev:main\""
  }
}

相关问题