我试图尝试调用使用Exec任务在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目标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执行此操作,需要使用&
:
&
。<Exec Command="(set PATH=$(Path)) & npm" />
其中Path
被修改为您的问题。例如:
为Exec
任务设置环境变量的另一种方法是它的EnvironmentVariables
参数,该参数接受Variable=Value
定义列表(文档)。例如,下面的代码设置Var1
和Var2
环境变量:
<!-- 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)&')" WorkingDirectory="$(SolutionDir)" />
我在Jeff Hardy的博客文章中找到了一个实际的解决方案:
<Exec Command="(set PYTHONPATH=C:Foo) & python script.py" />
基本上是在命令行上设置环境变量。或者,您可以运行多行脚本:
<PropertyGroup>
<PythonExec><![CDATA[
set PYTHONPATH=C:Foo
set FOO=42
python script.py
]]></PythonExec>
</PropertyGroup>
<Exec Command="$(PythonExec)" />
以上内容均来自Jeff Hardy的博客。我测试了一个案例,我使用$PATH
使用"长格式"。