我试图尝试使用Exec Task调用在MSBuild过程中获取的批处理脚本。但是,脚本的位置不是路径系统环境变量的一部分。所以我想我可以更新目标中的Path属性,然后触发Exec Task:
<Target Name="RestoreNPMPackages">
<Message Text="$([System.DateTime]::Now.ToString("yyyy-MM-dd hh.mm.ss.fff")) 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("yyyy-MM-dd hh.mm.ss.fff")) 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任务中有效?谢谢
答案 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执行此操作,您需要使用&
&
<Exec Command="(set PATH=$(Path)) & 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)&')" WorkingDirectory="$(SolutionDir)" />
答案 3 :(得分:0)
为 Exec
任务设置环境变量的另一种方法是其 EnvironmentVariables
参数,它接受 Variable=Value
定义列表 (documentation)。例如,以下代码设置 Var1
和 Var2
环境变量:
<!-- 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'))" />