7

很好,我不仅可以从项目根目录运行 NPM 脚本,还可以从子文件夹运行 NPM 脚本。但是,受限于它不能告诉我当前的工作路径($PWD)。

假设有这样的命令:

"scripts": {
  ...
  "pwd": "echo $PWD"
}

如果我npm run pwd在项目根目录的子文件夹中运行(例如,$PROJECT_ROOT/src/nested/dir),而不是打印出我当前的路径$PROJECT_ROOT/src/nested/dir,它总是会$PROJECT_ROOT返回。有没有办法告诉 NPM 脚本使用我当前的工作目录而不是解析到package.json所在的位置?

基本上,我想将 Yeoman 生成器拉入现有项目并通过 NPM 脚本使用它,以便每个人都可以使用共享知识(例如,npm run generator)而不是学习任何 Yeoman 特定的东西(例如npm i yo -g; yo generator)。由于生成器根据当前工作路径生成文件,而 NPM 脚本始终解析为项目根目录,因此我无法在打算使用的地方使用生成器。

4

3 回答 3

24

如果您希望您的脚本根据您所在的子目录使用不同的行为,您可以使用INIT_CWD环境变量,它包含您运行时所在的完整路径npm run

来源:https ://docs.npmjs.com/cli/run-script

像这样使用它:

"scripts": {
    "start": "live-server $INIT_CWD/somedir --port=8080 --no-browser"
}

2019-11-19 更新

$INIT_CWD仅适用于 *nix-like 平台。Windows 将需要%INIT_CWD%. Node.js 没有为我们抽象出来,这有点令人失望。解决方案:使用cross-env-shell live-server $INIT_CWD/somedir....-> https://www.npmjs.com/package/cross-env

于 2019-10-24T15:20:12.243 回答
1

一种已知的解决方案是通过 ENV 变量注入。

例如:

在 package.json 中定义脚本:

"pwd": "cd $VAR && echo $PWD"

从任何子目录调用它:

VAR=$(pwd) npm run pwd

但是,这看起来真的很难看,有没有更清洁/更好的解决方案?

于 2017-09-13T19:35:16.927 回答
0

使用节点 8+,您可以自动化 ENV 变量注入。

mystart1.- 在 $HOME/.node_modules/ (默认节点搜索路径)中创建一个文件

process.env.ORIGPWD = process.env.PWD

mystart2.- 然后在你的 $HOME/.bashrc 告诉节点每次加载

export NODE_OPTIONS="-r mystart"

3.-$ORIGPWD在您的脚本中使用。这适用于npm,yarn和其他人。

于 2019-08-05T03:15:23.170 回答