获取T4生成的.resx文件进行构建

时间:2013-09-23 17:51:08

标签: visual-studio-2010 t4 resx msbuild-4.0

在我们的Web应用程序中,我将iu-Cans-CA语言环境作为伪语言环境加入,其中字符串资源键也用作值。这是为自动化测试提供帮助。要为此区域设置生成.resx,我使用的是T4模板。

.resx生成正确,但出了点问题:资源文件没有像其他真正的翻译那样被编译到程序集中。我终于找到了原因。由于T4模板用于生成.resx,因此.csproj包含以下内容:

<EmbeddedResource Include="Strings.iu-Cans-CA.resx">
  <AutoGen>True</AutoGen>
  <DesignTime>True</DesignTime>
  <DependentUpon>Strings.iu-Cans-CA.tt</DependentUpon>
</EmbeddedResource>

出于某种原因,这阻止了.resx的编译。如果我将.csproj更新为此,则 编译:

<EmbeddedResource Include="Strings.iu-Cans-CA.resx">
  <AutoGen>True</AutoGen>
  <DesignTime>True</DesignTime>
</EmbeddedResource>

我希望这将是它的结束,但现在只要在Visual Studio中加载.csproj,项目文件就会再次更新为前一个结构,再次打破资源文件的编译。

有没有办法解决问题,以便生成/依赖.resx正确编译为嵌入式资源?或者有没有办法永久打破依赖关系,所以它不会继续恢复?我意识到我可以重写.tt所以它生成一个具有不同名称的文件,但我更愿意找到一个不需要这个的解决方案,因为这是T4的非典型用法,我想避免太多WTFs。

2 个答案:

答案 0 :(得分:2)

解决方法是在构建真正开始之前从T4生成的EmbeddedResource元素中剥离DependentUpon元数据。我项目文件中对BeforeBuild目标的以下修改对我有用:

<Target Name="BeforeBuild">
  <!-- Fix MSBuild issue where T4 generated .RESX files do not get compiled properly into satellite assemblies -->
  <ItemGroup>
    <GeneratedEmbeddedResource Include="@(EmbeddedResource)" Condition="'%(EmbeddedResource.DependentUpon)' != ''">
      <DependentUpon></DependentUpon>
    </GeneratedEmbeddedResource>
    <EmbeddedResource Remove="@(EmbeddedResource)" Condition="'%(EmbeddedResource.DependentUpon)' != ''"/>
    <EmbeddedResource Include="@(GeneratedEmbeddedResource)" />
  </ItemGroup>
</Target>

答案 1 :(得分:0)

您需要为.resx文件指定输出路径。

如果您将Output.Project留空并且未在Output.File中指定目录/路径,则生成的文件将 DependentUpon .tt文件本身。