MSBuild命令行参数长度超过8191个字符

时间:2014-07-01 07:41:35

标签: msbuild

我正在使用MSBUILD.exe为应用程序执行构建。作为其中的一部分,我将所需的变量作为MSBUILD.exe的命令行参数传递。

我有2个文件。 service.xml和MyService.proj。 service.xml文件中包含以下行。

<installCommand name="MyService" cmd="msbuild.exe &quot;MyService.proj&quot; /p:{vairables}">

最初命令的长度很小,一切都很好,因为我能够构建我的项目,但随着项目大小的增加,参数的数量也增加了,现在我处于命令行显示的阶段错误(输入行太长)。

经过一些搜索,我发现命令行不能超过8191个字符。

任何人都可以为此建议任何替代方案。

2 个答案:

答案 0 :(得分:0)

什么&#39; installCommand

MSBuild引擎将所有系统,用户和流程变量以及参数和属性合并到一个大池中,因此您通过{vairables}传递的每个属性可以首先分开set。请记住,通过命令行传递的属性是全局属性,因此等效的环境变量不会覆盖相应的项目属性,除非它上面有Condition=" '$(Foo)' == '' "

http://msdn.microsoft.com/en-us/library/ms171458.aspx

答案 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="&lt;Namespace Prefix='peanutNamespace' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;"
             XmlInputPath=".\Parameters.xml" 
             Query="/parameters/setParameter[@name='LineNumber1']/@value">
            <Output TaskParameter="Result" ItemName="Peeked" />
        </XmlPeek>

        <Message Text="@(Peeked)"/>

        <XmlPeek Namespaces="&lt;Namespace Prefix='peanutNamespace' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;"
             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="&lt;Namespace Prefix='msb' Uri='http://schemas.microsoft.com/developer/msbuild/2003'/&gt;"
    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=