如何在Windows上的npm脚本中使用变量

时间:2016-09-30 14:09:22

标签: npm

我有一个裸存储库,我们从中开始新项目。在此存储库中是另一个必须单独更新的存储库。每个项目都从这两个存储库开始,但有时在项目期间,它们不应同时更新。

我试图创建一个克隆父存储库的Npm脚本,然后打开文件夹并克隆子存储库。

该脚本有一个代表项目的变量,因此代表文件夹名称。

根据this answer,我想出了以下内容:

"new_project": "git clone x:/parent_repo $PROJECT & cd $PROJECT & git clone x:/child_repo"

我像这样运行命令:PROJECT=new_project_name npm run new_project 还试过PROJECT="new_project_name" npm run new_project

不幸的是,这会创建一个名为$PROJECT的文件夹,而不是实际读取变量。

也尝试过:

"new_project": "git clone x:/parent_repo $PROJECT & cd $PROJECT & git clone x:/child_repo"

npm run new_project --PROJECT new_project_name

或以

运行
npm run new_project -- --PROJECT=new_project

同样的结果。

这些解决方案中的大多数似乎适用于Linux机器,但不适用于Windows。

看来字符串中的变量不是这样读的。我试过了

"git clone x:/parent_repo "+$PROJECT+" & cd "+$PROJECT+" & git clone x:/child_repo" 

但这只是给了我语法错误。

如何从我在npm脚本中使用的命令行成功传递变量?

命令必须是一行。

我在Windows上使用Git bash作为cli

npm版本:2.14.20

3 个答案:

答案 0 :(得分:5)

因此,由于操作系统的不同,the answer I linked无效,我的机器似乎失败了。

这适用于Linux:

"new_project": "git clone x:/parent_repo $PROJECT & cd $PROJECT & git clone x:/child_repo"

PROJECT=new_project_name npm run new_project

要使其在Windows上运行,您需要使用% %而不是$来转义变量。您还需要在Windows cli上特定设置变量。要与脚本结合,您需要将脚本和set变量命令与&&链接。

因此Windows上面的内容变为:

"new_project": "git clone x:/parent_repo %PROJECT% & cd %PROJECT% & git clone x:/child_repo"

SET PROJECT=new_project_name && npm run new_project

另请注意,如果要引用配置变量,则必须以相同方式转义该变量。因此,$npm_package_config_yourvariable在Windows上变为%npm_package_config_yourvariable%

答案 1 :(得分:1)

您可以使用package.json配置。

{
    "name" : "myapp",
    "config" : { "folder": "myfolder" },
    "scripts" : {
        "new_project": "git clone x:/parent_repo $npm_package_config_folder & cd $npm_package_config_folder & git clone x:/child_repo"
    }
}

然后:

npm config set myapp:folder mynewfolder

npm run newproject
  

但在我看来,更好的方法是使用外部NodeJS自定义脚本并使用npm脚本运行它。

答案 2 :(得分:0)

如果您查看以下页面:https://github.com/npm/npm/pull/5518(它与您链接的答案有关)

"new_project": "git clone x:/parent_repo $PROJECT & cd $PROJECT & git clone x:/child_repo"

然后:

npm run --PROJECT new_project_name