2013-09-25 40 views
1

輸出路徑:如何我使用的<code>BeforeBuild</code>事件下面的代碼來修改PreBuildEvent或BeforeBuild

<XmlPeek XmlInputPath="SiteSettings.config" Query="appSettings/add[@key='cProjectNumber']/@value"> 
    <Output TaskParameter="Result" ItemName="value" /> 
</XmlPeek> 
<PropertyGroup> 
    <ProjectNumber>[email protected](value)</ProjectNumber> 
</PropertyGroup> 

,然後讓我訪問$(ProjectNumber)其中將包含像1234項目數。然後我使用它來包含一些項目特定的覆蓋類。這工作正常。

我的問題是訪問BeforeBuild事件之外的ProjectNumber

我想要做的是修改該項目的<OutputPath>bin\</OutputPath>,使其進入項目特定的文件夾(所以我知道哪些構建完成)。我試過<OutputPath>bin\$(ProjectNumber)\</OutputPath>,但我認爲我的財產超出了範圍,因爲它是空的。

有誰知道一種方法來實現我想要的?

編輯:這是我與聲明全局變量的嘗試:

<Project ToolsVersion="4.0" DefaultTarget="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <ProjectNumber></ProjectNumber> 
    </PropertyGroup> 
    <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
    <DebugSymbols>true</DebugSymbols> 
    <DebugType>full</DebugType> 
    <Optimize>false</Optimize> 
    <OutputPath>bin\$(ProjectNumber)\</OutputPath> 
    <DefineConstants>DEBUG;TRACE</DefineConstants> 
    <ErrorReport>prompt</ErrorReport> 
    <WarningLevel>4</WarningLevel> 
    </PropertyGroup> 

    <Target Name="BeforeBuild"> 
    <XmlPeek XmlInputPath="SiteSettings.config" Query="appSettings/add[@key='cProjectNumber']/@value"> 
     <Output TaskParameter="Result" ItemName="value" /> 
    </XmlPeek> 
    <PropertyGroup> 
     <ProjectNumber>[email protected](value)</ProjectNumber> 
    </PropertyGroup> 
    <ItemGroup> 
     <Compile Include="Accounts\$(ProjectNumber)\Objects\MyObject.cs"> 
     <SubType>Code</SubType> 
     </Compile> 
    </ItemGroup> 
    </Target> 
    <Target Name="AfterBuild"> 
    <Message Text="Proj:$(ProjectNumber)" Importance="High" /> 
    </Target> 
</Project> 

AfterBuild具有打印正確的項目數的消息,但<OutputPath>bin\$(ProjectNumber)\</OutputPath>沒有正確的值。

回答

1

您可以在名稱爲ProjectNumber的項目全局級別中設置一個屬性,並以空值作爲佔位符。 ProjectNumber您在InitializeBuild目標中設置的屬性值將設置ProjectNumber的全局等級屬性。

通過查看樣品下面你可以更好地理解它:

<?xml version="1.0" encoding="utf-8"?> 
<Project ToolsVersion="4.0" InitialTargets="InitializeBuild" DefaultTargets="All" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <ProjectNumber></ProjectNumber> 
    </PropertyGroup> 

    <Target Name="All"> 
    <Message Text="This is the value after I set it in InitializeBuild '$(ProjectNumber)'"/> 
    </Target> 

    <Target Name="BeforeBuild"> 
    <Message Text="This is the value before I set it in InitializeBuild '$(ProjectNumber)'"/> 
    <PropertyGroup> 
     <ProjectNumber>12345678</ProjectNumber> 
    </PropertyGroup> 
    </Target> 
</Project> 

在此示例中,我們設置屬性ProjectNumber與全球水平,然後在InitializeBuild目標爲空值,則設置值爲12345678因爲InitializeBuildInitialTargets的一部分,然後通過DefaultTargets後,一旦在目標All中訪問它,它的值爲12345678

上述代碼的輸出變爲如下:

>msbuild mybuild.msbuild 
Microsoft (R) Build Engine version 4.0.30319.17929 
[Microsoft .NET Framework, version 4.0.30319.17929] 
Copyright (C) Microsoft Corporation. All rights reserved. 

Build started 9/25/2013 5:35:22 AM. 
Project "D:\CodeBase\COLNEW\COL-BIS\dev\mybuild.msbuild" on node 1 (default targets). 
InitializeBuild: 
    This is the value before I set it in InitializeBuild'' 
All: 
    This is the value after I set it in InitializeBuild'12345678' 
Done Building Project "D:\CodeBase\COLNEW\COL-BIS\dev\mybuild.msbuild" (default targets). 

所以你的問題可以以類似的方式來解決。

+0

這聽起來很有希望。我試着按照上面的建議設置' bin \ $(ProjectNumberBin)\',但它似乎沒有工作。我不確定'Target Name ='All''會配合在哪裏。 – webnoob

+0

Target'All'只是我給出的,表明它可以在'BeforeBuild'之外的任何地方使用'BeforeBuid'設置的值。在你的情況下,目標' bin \ $(ProjectNumber)\'目前應該等同於我的示例的所有目標。 – RinoTom

+0

您能否看到我的編輯並讓我知道您的想法。我可以看到唯一的區別是項目線聲明,但我嘗試過沒有成功。 – webnoob