NPM脚本如何使用我当前的工作目录(在嵌套子文件夹中时)

时间:2017-09-13 19:28:25

标签: yo npm-scripts pwd

我不仅可以从项目根目录运行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脚本始终解析为项目根目录,因此我无法使用它打算使用的生成器。

3 个答案:

答案 0 :(得分:2)

  

如果您希望脚本根据您所在的子目录使用不同的行为,则可以使用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的平台上工作。 Windows将需要%INIT_CWD%。令人失望的是,Node.js并没有为我们抽象这一点。解决方案:使用cross-env-shell live-server $INIT_CWD/somedir....-> https://www.npmjs.com/package/cross-env

答案 1 :(得分:1)

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

例如:

在命令行中声明变量:

cwd="$(pwd)" npm run pwd

在package.json中使用env变量:

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

但是,始终传递cwd="$(pwd)"作为前缀看起来更像是黑客,是否有更清洁/更好的解决方案?

答案 2 :(得分:0)

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

1.--在$ HOME / .node_modules /(默认的节点搜索路径)中,使用

创建文件mystart
process.env.ORIGPWD = process.env.PWD

2.--然后在$ HOME / .bashrc中,告诉节点每次加载mystart

export NODE_OPTIONS="-r mystart"

3.--在脚本中使用$ORIGPWD。该功能适用​​于npmyarn和其他用户。