如何修改PreBuildEvent或BeforeBuild中的输出路径

时间:2013-09-25 08:55:42

标签: visual-studio-2010 msbuild

我在BeforeBuild事件中使用以下代码:

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

然后,我可以访问$(ProjectNumber),其中包含1234等项目编号。然后我使用它在类上包含一些项目特定的覆盖。这工作正常。

我的问题是在ProjectNumber事件之外访问BeforeBuild

我想要做的是修改项目的<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>0@(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 个答案:

答案 0 :(得分: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,因为InitializeBuild是其中的一部分InitialTargets然后通过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).

所以你的问题可以用类似的方式解决。