自定义系统环境变量MSBuild Exec Task的路径

use*_*296 4 msbuild

我正在尝试使用Exec Task调用在MSBuild过程中获取的批处理脚本.但是,脚本的位置不是路径系统环境变量的一部分.所以我想我可以更新目标中的Path属性,然后触发Exec任务:

<Target Name="RestoreNPMPackages">
  <Message Text="$([System.DateTime]::Now.ToString(&quot;yyyy-MM-dd hh.mm.ss.fff&quot;)) Entering Build.xml Target RestoreNPMPackages..." Importance="high" />

  <PropertyGroup>
    <Path>$(Path);$(WorkspaceRoot)\Tools\$(Node_jsPackage)</Path>
  </PropertyGroup>

  <Message Text="Property Path in RestoreNPMPackages=$(Path)" Importance="high" />

  <Exec Command="$(Path)\npm install --no-color --no-optional" />

  <Message Text="$([System.DateTime]::Now.ToString(&quot;yyyy-MM-dd hh.mm.ss.fff&quot;)) Exiting Build.xml Target RestoreNPMPackages..." Importance="high" />
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误

RestoreNPMPackages:2015-07-27 06.31.24.334输入Build.xml目标RestoreNPMPackages ... RestoreNPMPackages中的属性路径= d:\ Delphi Projects\Libraries; C:\ Windows\Microsoft.NET\Framework\v4.0.30319; C:\ PROGRA〜1\Borland的\ Delphi5 \项目\栉Bpl; C:\ PROGRA〜1\Borland的\ vbroker\JRE \滨; C:\ PROGRA〜1\Borland的\ vbroker \滨; C:\ PROGRA〜1\Borland的\ Delphi5\Bin; C:\ Windows\system32; C:\ Windows; C:\ Windows\System32\Wbem; C:\ Windows\System32\WindowsPowerShell\v1.0 \; C:\ Program Files(x86)\ Microsoft SQL Server\100\Tools\Binn \; C:\ Program Files\Microsoft SQL Server\100\Tools\Binn \; C:\ Program Files\Microsoft SQL Server\100\DTS\Binn \; C:\ Program Files(x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE \; C:\ Program Files(x86)\ Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies \; C:\ Program Files(x86)\ Microsoft SQL服务器\ 100\DTS\BINN \; C:\ Program Files(x86)\ GNU\GnuPG; C:\ Program Files\Microsoft\Web Platform Installer \; C:\ Program Files(x86)\ Microsoft ASP.NET\ASP.NET Web Pages\v1.0 \; C :\ Program Files\Microsoft SQL Server\110\Tools\Binn \; C:\ RealTick \; C:\ Program Files(x86)\ Graphviz 2.28\bin; D:\ PLATFORM\Tools\Eze.Thirdparty.Node.js npm install --no-color --no-optional'npm'不被识别为内部或外部命令,可操作程序或批处理文件.

从Message任务我可以看到文件夹D:\ PLATFORM\Tools\Eze.Thirdparty.Node.js已添加到Path变量但由于某种原因它抱怨'npm'不被识别为内部或外部命令

如果我将文件夹D:\ PLATFORM\Tools\Eze.Thirdparty.Node.js添加到Windows中的Path变量而不是MSBuild脚本中,该命令将无错误地运行.当然,提前设置Path变量听起来不是很灵活.

如何使Path变量的动态更新在MSBuild Exec任务中正常工作?谢谢

sti*_*ijn 7

已经添加到它确实具有的Path变量,但它Path是MsBuild进程中的属性,并且与Exec任务使用的环境变量不同.你可以验证这个:

<Exec Command="echo %PATH%"/>
Run Code Online (Sandbox Code Playgroud)

将打印Exec使用的PATH,它不会包含您的更改,因为MsBuild在使用Exec时会启动单独的cmd进程,并且不会将环境变量传递给它.

此外,执行npm的命令是错误的:$(Path)\npm评估你在问题中显示的所有内容\npm(例如d:\ Delphi Projects\Libraries; C:\ Windows\Microsoft.NET\Framework\v4.0.30319; C:\ PROGRA~ 1\Borland\Delphi5\Projects\Bpl; C:\ PROGRA~1\Borland\vbroker\jre\Bin; C:\ PROGRA~1\Borland\vbroker\Bin; C:\ PROGRA .... \npm)so这不可能纠正

既然你知道npm在哪里,你应该直接调用它:

<Exec Command="$(WorkspaceRoot)\Tools\$(Node_jsPackage)\npm"/>
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因需要NPM所在被添加到PATH的目录,然后就去做,当你将在命令行上:(set PATH=...) & npm.要为exec执行此操作,您需要转义&使用&amp:

<Exec Command="(set PATH=$(Path)) &amp; npm" />
Run Code Online (Sandbox Code Playgroud)

Path被修改为你的问题.这里有更多解释.


Ant*_*sha 7

为任务设置环境变量的另一种方法Exec是它的EnvironmentVariables参数,它接受定义列表Variable=Value文档)。例如,以下代码设置Var1Var2环境变量:

<!-- Outputs [42][forty-two] -->
<Exec Command="echo [%Var1%][%Var2%]" EnvironmentVariables="Var1=42;Var2=forty-two" />
Run Code Online (Sandbox Code Playgroud)

您可以以PATH相同的方式设置变量。但是,您必须使用百分比编码转义其值中的所有分号:

<PropertyGroup>
  <MyPath>C:\Foo;D:\Bar</MyPath>
</PropertyGroup>

<!-- Outputs [C:\Foo;D:\Bar] -->
<Exec Command="echo [%PATH%]" EnvironmentVariables="PATH=$(MyPath.Replace(';','%3B'))" />
Run Code Online (Sandbox Code Playgroud)