MSBuild命令行参数长度超过8191个字符
我正在使用MSBUILD.exe为应用程序执行生成。作为其中的一部分,我将所需变量作为MSBUILD.exe的命令行参数传递 我有两个文件。xml和MyService.proj。下面的行显示在service.xml文件中MSBuild命令行参数长度超过8191个字符,msbuild,Msbuild,我正在使用MSBUILD.exe为应用程序执行生成。作为其中的一部分,我将所需变量作为MSBUILD.exe的命令行参数传递 我有两个文件。xml和MyService.proj。下面的行显示在service.xml文件中 <installCommand name="MyService" cmd="msbuild.exe "MyService.proj" /p:{vairables}"> 最初命令的长度很小,一切都很好,因为我能够构建我的项目,
<installCommand name="MyService" cmd="msbuild.exe "MyService.proj" /p:{vairables}">
最初命令的长度很小,一切都很好,因为我能够构建我的项目,但是随着项目大小的增加,参数的数量也增加了,现在我正处于命令行显示错误的阶段(输入行太长)
经过一些搜索,我发现命令行不能超过8191个字符
任何人都可以为此提出任何替代方案。什么是
installCommand
MSBuild引擎将所有系统、用户和进程变量以及参数和属性合并到一个大池中,因此可以首先分别设置通过{vairables}
传递的每个属性。请记住,通过命令行传递的属性是global属性,因此等效环境变量不会覆盖相应的项目属性,除非其上有Condition=“”$(Foo)”==”
您可以在xml文件中设置变量,并将xml文件名传递给msbuild脚本 下面是一个使用MSBuildCommunityTasks的简单示例 Parameters.xml(以下内容)
谢谢你的评论,我已经编辑了原来的帖子。是,首先设置变量,然后将其传递给命令执行。我正在传递的变量超过了允许的最大长度。@Raghavendrapasa我的观点是,如果您先
设置它们,即将{vairables}
转换为环境变量,而不需要再将它们传递给/p:
,MSBuild无论如何都会读取它们,因此命令行将是最小的。Ilya Kozhevnikov:我试图将我的变量分配给环境变量。我用这个作为我的参考。[但我没有成功地实现我的目标。您能否提供任何示例或指向在生成XML文件中创建环境变量的引用。感谢@granadaCoder提供示例代码。您已经定义了参数并在触发生成之前为其分配了值,但在我的情况下,该值是在运行tim时分配的e(在构建过程中),当我使用您的代码时,我得到的参数值为“”。这种情况下是否有解决方法。如果您将它们作为参数传递给命令行,它们是如何生成的?因此,您可以将XmlWritePeekValue传递到一个文件…~然后调用传递xml文件名的子任务。然后在该文件中,读取值。一个进程将在xml中创建变量值,另一个进程将实现variab女同性恋。
<?xml version="1.0" encoding="utf-8"?>
<parameters>
<setParameter name="LineNumber1" value="PeanutsAreCool" />
<setParameter name="LineNumber2" value="" />
</parameters>
<?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>
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=