我想运行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)。
答案 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>