我正在使用MSBUILD.exe为应用程序执行构建。作为其中的一部分,我将所需的变量作为MSBUILD.exe的命令行参数传递。
我有2个文件。 service.xml和MyService.proj。 service.xml文件中包含以下行。
<installCommand name="MyService" cmd="msbuild.exe "MyService.proj" /p:{vairables}">
最初命令的长度很小,一切都很好,因为我能够构建我的项目,但随着项目大小的增加,参数的数量也增加了,现在我处于命令行显示的阶段错误(输入行太长)。
经过一些搜索,我发现命令行不能超过8191个字符。
任何人都可以为此建议任何替代方案。
答案 0 :(得分:0)
什么&#39; installCommand
?
MSBuild引擎将所有系统,用户和流程变量以及参数和属性合并到一个大池中,因此您通过{vairables}
传递的每个属性可以首先分开set
。请记住,通过命令行传递的属性是全局属性,因此等效的环境变量不会覆盖相应的项目属性,除非它上面有Condition=" '$(Foo)' == '' "
。
答案 1 :(得分:0)
您可以在xml文件中设置变量,并将xml文件名传递给msbuild脚本。
这是一个使用MSBuildCommunityTasks的简单示例。
Parameters.xml(以下内容)
<?xml version="1.0" encoding="utf-8"?>
<parameters>
<setParameter name="LineNumber1" value="PeanutsAreCool" />
<setParameter name="LineNumber2" value="" />
</parameters>
MyMsbuildDef.proj(以下内容)
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="AllTargetsWrapped">
<Import Project="$(MSBuildExtensionsPath32)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<PropertyGroup>
<!-- Always declare some kind of "base directory" and then work off of that in the majority of cases -->
<WorkingCheckout>.</WorkingCheckout>
</PropertyGroup>
<Target Name="AllTargetsWrapped">
<CallTarget Targets="ReadXmlPeekValue" />
<CallTarget Targets="WriteXmlPeekValue" />
</Target>
<Target Name="ReadXmlPeekValue">
<!-- you do not need a namespace for this example, but I left it in for future reference -->
<XmlPeek Namespaces="<Namespace Prefix='peanutNamespace' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/>"
XmlInputPath=".\Parameters.xml"
Query="/parameters/setParameter[@name='LineNumber1']/@value">
<Output TaskParameter="Result" ItemName="Peeked" />
</XmlPeek>
<Message Text="@(Peeked)"/>
<XmlPeek Namespaces="<Namespace Prefix='peanutNamespace' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/>"
XmlInputPath=".\Parameters.xml"
Query="/parameters/setParameter[@name='LineNumber1']/@value">
<Output TaskParameter="Result" PropertyName="PeekedSingle" />
</XmlPeek>
<Message Text="PeekedSingle = $(PeekedSingle) "/>
</Target>
<Target Name="WriteXmlPeekValue" Condition=" '$(PeekedSingle)' != '' ">
<XmlPoke Namespaces="<Namespace Prefix='msb' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/>"
XmlInputPath=".\Parameters.xml"
Query="/parameters/setParameter[@name='LineNumber2']/@value"
Value="$(PeekedSingle)" />
</Target>
</Project>
MyBatFile.bat(以下内容)
set msBuildDir=%WINDIR%\Microsoft.NET\Framework\v4.0.30319
call %msBuildDir%\msbuild /target:AllTargetsWrapped "MyMsbuildDef.proj" /p:Configuration=Debug;FavoriteFood=Popeyes /l:FileLogger,Microsoft.Build.Engine;logfile=ZZZZZAllTargetsWrapped.log
set msBuildDir=