2011-09-20 118 views
2

我需要能够覆盖输出程序集的名称。MSBuild覆盖输出文件名

有一个文件包含前缀appid。我需要读取该文件以获取此前缀,然后将其用于装配名称。即,程序集名称engine.dll和appid包含slot_113。最终输出应该是engine_slot113.dll。

我正在考虑创建一个单独的.targets文件,我可以将其包含到任何需要该行为的.csproj文件中。

我发现任务ReadFileLines读取文件包含appid,但我不知道如何覆盖输出名称。

回答

1

我不认为有一种方法来重写它,但在后期构建操作重命名它应该是非常可能的。使用PostBuildEvent。

+0

但我还是希望能找到一种方式来覆盖。我花了几个小时没有成功。 –

+0

@alexanderb:您是否尝试过使用MSBuild目标的解决方案?至少它适合我 – sll

2

您可以使用MSBuild Copy Task轻松实现此目的。 让我们假设你已经提取后缀属性$(AssemblyNameSuffix)并指定装配文件项目组@(AssemblyDllFiles),所以:

  1. 创建RenameDlls.targets文件(如下图所示的内容)
  2. 与目标文件
  3. 执行一起创建testfile.txtmsbuild.exe RenameDlls.targets
  4. 文件testfile.txt将被复制为testfile_SUFFIX.txt

注意:您可以将这种动作的多个文件以及


的MSBuild目标:

<?xml version="1.0" encoding="utf-8"?> 

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Default"> 

    <Target Name="Default" DependsOnTargets="CreateItems;CopyItems"/> 

    <PropertyGroup>   
       <AssemblyNameSuffix>SUFFIX</AssemblyNameSuffix> 
    </PropertyGroup> 

    <Target Name="CreateItems"> 
     <ItemGroup> 
      <AssemblyDllFiles Include="testfile.txt"/> 
     </ItemGroup> 
    </Target> 

    <Target Name="CopyItems" 
      Inputs="@(AssemblyDllFiles)" 
      Outputs="@(AssemblyDllFiles->'.\%(RecursiveDir)%(Filename)_$(AssemblyNameSuffix)%(Extension)')"> 
      <Message Text="@(AssemblyDllFiles->'%(FullPath)', '%0a%0d')" 
        Importance="low"/> 

     <Copy SourceFiles="@(AssemblyDllFiles)" 
       DestinationFiles="@(AssemblyDllFiles->'.\%(RecursiveDir)%(Filename)_$(AssemblyNameSuffix)%(Extension)')" 
       SkipUnchangedFiles="true"/> 
    </Target> 
</Project> 
+0

,看起来很有趣,goint试试 –