自定义系统环境变量MSBuild Exec任务

时间:2015-07-27 23:10:12

标签: msbuild

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

<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" />

但是,我收到以下错误

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 \ Projects \ Bpl; C:\ PROGRA~1 \ Borland的\ vbroker \ JRE \ BIN; C:\ PROGRA〜1 \ Borland的\ vbroker \ BIN; 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 Server \ 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:\ PL ATFORM \工具\ Eze.Thirdparty.Node.js   npm install --no-color --no-optional   &#39; NPM&#39;不被视为内部或外部命令,   可操作程序或批处理文件。

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

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

如何使Path变量的动态更新在MSBuild Exec任务中有效?谢谢

4 个答案:

答案 0 :(得分:7)

已添加到它确实具有的Path变量,但Path是MsBuild进程中的属性,与Exec任务使用的环境变量不同。您可以验证这一点:

<Exec Command="echo %PATH%"/>

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

此外,执行npm的命令错误:$(Path)\npm评估您在问题中显示的所有内容,然后是\npm(类似 d:\ Delphi Projects \ Libraries; C:\ Windows \ Microsoft.NET \框架\ v4.0.30319; C:\ PROGRA〜1 \ Borland的\ Delphi5 \项目\栉Bpl; C:\ PROGRA〜1 \ Borland的\ vbroker \ JRE \滨; C:\ PROGRA〜1 \ Borland的\ vbroker \ Bin; C:\ PROGRA .... \ npm )因此无法纠正

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

<Exec Command="$(WorkspaceRoot)\Tools\$(Node_jsPackage)\npm"/>

如果由于某种原因,npm要求将其所在的目录添加到PATH,那么就像在命令行上一样:(set PATH=...) & npm。要为exec执行此操作,您需要使用&

转义&amp
<Exec Command="(set PATH=$(Path)) &amp; npm" />

在您的问题中修改Path的位置。更多解释here for instance

答案 1 :(得分:1)

我在[Jeff Hardy的博客文章]中找到了这个问题的实际解决方案。      您基本上在命令行上设置PATH。或

<PropertyGroup>
  <PythonExec><![CDATA[
set PYTHONPATH=C:\Foo
set FOO=42
python script.py
  ]]></PythonExec>
</PropertyGroup>

以上所有内容均来自Jefff hardy的博客。我测试了一个案例,我使用“长形式”技术使用$ PATH,它对我来说效果很好。

1 http://blog.jdhardy.ca/2011/12/setting-environment-variables-for.html

答案 2 :(得分:0)

<ItemGroup>
  <ExecLines Include="call C:\esp-idf\export.bat" />
  <ExecLines Include="idf.py build" />
</ItemGroup>

<Exec Command="@(ExecLines->'%(Identity)&amp;')" WorkingDirectory="$(SolutionDir)" />

答案 3 :(得分:0)

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

<!-- Outputs [42][forty-two] -->
<Exec Command="echo [%Var1%][%Var2%]" EnvironmentVariables="Var1=42;Var2=forty-two" />

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

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

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