2

我想运行<AL></AL>MSBuild 的任务来创建发布者策略。为此,在我的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"as ItemName- 我希望我可以像"$("%(ConfigFiles.identity).ver")"ALtaks 中一样访问此信息,因此引用相同的 msbatch 循环,但这不起作用,因为点在项目名称中是非法的。

这可能就像从另外两个项目组中创建一个新项目组一样简单,但是到目前为止,我对这个 MS Build 怪物的经验还不够,无法完成这项工作。任何帮助将不胜感激。

(请注意,我使用的是 VS 2008)。

4

1 回答 1

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>
于 2012-06-14T04:46:01.897 回答