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

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

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

yo npm-scripts pwd
4个回答
46
投票

如果您希望脚本根据您所在的子目录使用不同的行为,您可以使用

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


2
投票

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

例如:

在package.json中定义脚本:

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

从任何子目录调用它:

VAR=$(pwd) npm run pwd

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


1
投票

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

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

mystart
with

process.env.ORIGPWD = process.env.PWD

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

mystart

export NODE_OPTIONS="-r mystart"

3.- 在脚本中使用

$ORIGPWD

。这适用于 
npm
yarn
 和其他。


0
投票
如果您在 javascript 文件中工作,则需要额外添加。

    process.cwd()
  • process.env.PWD
  • 路径.resolve('.')
© www.soinside.com 2019 - 2024. All rights reserved.