MSBuild:在一个任务中合并来自不同来源的信息

时间:2012-06-13 14:41:33

标签: visual-studio visual-studio-2008 msbuild

我想运行MSBuild的<AL></AL>任务来创建发布者策略。为此,在我的csproj文件中,我创建了一个配置文件名列表:

<Target Name="AfterBuild">
   <ItemGroup>
     <ConfigFiles Include="$(TargetDir)\*.config" />
   </ItemGroup>
   <AL 
      LinkResources="%(ConfigFiles.Identity)" 
      Platform="x86" 
      KeyFile="$(ProjectDir)\KeyFile.snk" 
      OutputAssembly="$(TargetDir)\%(ConfigFiles.Filename).dll" 
      Version="@(PolicyVersion)" 
   />
</Target>

如果我只需要一个版本号"@(PolicyVersion",这样就可以了。但是,如果每个配置文件需要不同的版本号呢?我可以从配置文件中的XML属性中检索版本号,但我不知道如何这样做,因此在批量生成期间它可用于相应的正确项目。

我还尝试了以下操作:配置文件名为Policy.2.2xx.Mylib.config。这些是以编程方式创建的。另外,我创建了一个Policy.2.2xx.Mylib.ver甚至MyLib.ver文件,其中包含版本信息(每个Mylib都相同,但对于其他库可能不同),我可以阅读使用

<ReadLinesFromFile File="$(TargetDir)\MyLib.ver">
  <Output TaskParameter="Lines" ItemName="PolicyVersion" />
</ReadLinesFromFile> 

但我现在如何设法将MyLib(或Policy.2.2xx.Mylib)的版本信息与<AL>任务中的相应配置文件相关联?我尝试在阅读中使用"%(ConfigFies.identity).ver"作为ItemName - 我希望我可以在"$("%(ConfigFiles.identity).ver")"目标中以AL的形式访问此信息,因此请参阅相同内容msbatch循环,但这不起作用,因为项目名称中的点是非法的。

这可能就像从另外两个创建一个新的项目组一样简单,但是现在我对这个MS Build怪物没有足够的经验来完成这项工作。任何帮助将不胜感激。

(请注意,我正在使用VS 2008)。

1 个答案:

答案 0 :(得分:2)

我并不完全明白你需要什么。我想你想从配置文件的名称中提取版本号,并将其传递给Version任务的AL属性。

创建一个包含AL调用的目标。通过批量处理ConfigFiles项目组来调用新目标。在目标中,使用字符串方法提取版本号:

<Target Name="AfterBuild">
    <ItemGroup>
        <ConfigFiles Include="$(TargetDir)\*.config" />
    </ItemGroup>

    <MSBuild Projects="$(MSBuildThisFileFullPath)"
             Properties="LinkResource=%(ConfigFiles.Filename)%(Extension)"
             Targets="_AL" />
</Target>

<Target Name="_AL">
    <Error Condition="'$(LinkResource)' == ''" Text="Missing LinkResource property." />
    <PropertyGroup>
        <_OutputFilename>$(LinkResource.Replace('.config', '')).dll</_OutputFilename>
        <_VersionNumber>$(_OutputFilename.Replace('Policy.',''))</_VersionNumber>
    </PropertyGroup>

    <AL 
        LinkResources="$(LinkResource)" 
        Platform="x86" 
        KeyFile="$(ProjectDir)\KeyFile.snk" 
        OutputAssembly="$(TargetDir)\$(_OutputFilename)" 
        Version="$(_VersionNumber)" />
</Target>