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



我试图尝试调用使用Exec任务在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目标restorenppackages…属性路径RestoreNPMPackages = d: 德尔福项目图书馆;C: Windows Microsoft.NET Framework v4.0.30319; C: PROGRA ~ 1 宝蓝此项目 Bpl; C: PROGRA ~ 1 宝蓝 vbroker jre Bin; C: PROGRA ~ 1 宝蓝 vbroker Bin; C: PROGRA ~ 1 宝蓝此 Bin; C: Windows system32系统;C: Windows; C: Windows system32系统 Wbem; C: Windows system32系统v1.0 WindowsPowerShell ; C: Program Files Microsoft SQL Server (x86) 100 Binn 工具;C: Program Files Microsoft SQL Server 100 Binn 工具;C: Program Files Microsoft SQLServer100DTSBinn;C:Program Files (x86)Microsoft SQL Server100ToolsBinnVSShellCommon7IDE;C:Program Files (x86)Microsoft Visual Studio 9.0Common7IDEPrivateAssemblies;C:Program Files (x86)Microsoft SQL Server100DTSBinn;C:Program Files (x86)GNUGnuPG;C:Program Files (x86)Microsoft Web Platform Installer;C:RealTick;C:Program Files (x86)Graphviz 2.28bin;D:PLATFORMToolsEze.Thirdparty.Node.js . NET Web Pagesv1.0NPM install——no-color——no-optional'npm'不会被识别为内部或外部命令,可操作程序或批处理文件。

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

如果我将文件夹D:PLATFORMToolsEze.Thirdparty.Node.js添加到Windows的Path变量中,而不是在MSBuild脚本中,该命令将不会出错。当然,提前设置Path变量听起来不是很灵活。

我如何使在MSBuild执行任务的路径变量工作的动态更新?由于

已被添加到路径变量它肯定有,但Path是MsBuild进程中的属性,这与Exec任务使用的环境变量不同。您可以验证:

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

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

此外,您执行npm的命令是错误的:$(Path)npm评估您在问题中显示的所有内容,然后是npm(类似d:Delphi ProjectsLibraries;C:WindowsMicrosoft.NETFrameworkv4.0.30319;C:PROGRA~1BorlandDelphi5ProjectsBpl;C:PROGRA~1BorlandvbrokerjreBin;C:PROGRA~1BorlandvbrokerBin;C:PROGRA ~1BorlandvbrokerBin;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被修改为您的问题。例如:

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

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

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

<PropertyGroup>
  <MyPath>C:Foo;D:Bar</MyPath>
</PropertyGroup>
<!-- Outputs [C:Foo;D:Bar] -->
<Exec Command="echo [%PATH%]" EnvironmentVariables="PATH=$(MyPath.Replace(';','%3B'))" />
<ItemGroup>
  <ExecLines Include="call C:esp-idfexport.bat" />
  <ExecLines Include="idf.py build" />
</ItemGroup>
<Exec Command="@(ExecLines->'%(Identity)&amp;')" WorkingDirectory="$(SolutionDir)" />

我在Jeff Hardy的博客文章中找到了一个实际的解决方案:

<Exec Command="(set PYTHONPATH=C:Foo) &amp; python script.py" />

基本上是在命令行上设置环境变量。或者,您可以运行多行脚本:

<PropertyGroup>
  <PythonExec><![CDATA[
set PYTHONPATH=C:Foo
set FOO=42
python script.py
  ]]></PythonExec>
</PropertyGroup>
<Exec Command="$(PythonExec)" />

以上内容均来自Jeff Hardy的博客。我测试了一个案例,我使用$PATH使用"长格式"。

最新更新