我在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>
没有正确的值。
答案 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).
所以你的问题可以用类似的方式解决。