如何为新的SDK csproj文件添加resx文件的glob

时间:2017-10-05 11:28:29

标签: .net msbuild

如果我在VS2017的新dotnetstandard 2.0 SDK项目中将新的resx文件添加到我的属性文件夹中,我看到

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <EmbeddedResource Remove="Properties\foo.resx" />
  </ItemGroup>

  <ItemGroup>
    <Compile Update="Properties\MyWords.Designer.cs">
      <DesignTime>True</DesignTime>
      <AutoGen>True</AutoGen>
      <DependentUpon>MyWords.resx</DependentUpon>
    </Compile>
  </ItemGroup>

  <ItemGroup>
    <EmbeddedResource Update="Properties\MyWords.resx">
      <Generator>ResXFileCodeGenerator</Generator>
      <LastGenOutput>MyWords.Designer.cs</LastGenOutput>
    </EmbeddedResource>
  </ItemGroup>


</Project>

但是,我更喜欢将此处理方式与处理普通cs文件的方式相同。项目为空,搜索文件系统。什么是 globby 方式来实现上述目标,这样当我添加新文件时,他们不会明确声明。

我的第一次尝试是

  <ItemGroup>
    <Compile Update="Properties\**\*.designer.cs">
      <DesignTime>True</DesignTime>
      <AutoGen>True</AutoGen>
      <DependentUpon>Properties\%(Filename).resx</DependentUpon>
    </Compile>
  </ItemGroup>

  <ItemGroup>
    <EmbeddedResource Update="Properties\**\*.resx">
      <Generator>ResXFileCodeGenerator</Generator>

    </EmbeddedResource>
  </ItemGroup>

但这不会起作用,因为

Properties\%(Filename).resx

扩展为

Properties\Foo.designer.resx

而不是

Properties\Foo.resx

2 个答案:

答案 0 :(得分:5)

对@stijn表示感谢,我们将此解决方案更进一步,因为它缺少发布期间为了避免运行时发生磁盘IOPS而使用的EmbeddedResource步骤。

这是一种类似的策略,也适用于嵌入式资源:

RESX +嵌入式资源(MSBUILD 15 Glob风格)

  <ItemGroup>
    <Compile Include="**\*.Designer.cs">
      <AutoGen>True</AutoGen>
      <DesignTime>True</DesignTime>
      <DependentUpon>$([System.String]::Copy('%(FileName)').Replace('.Designer', '.resx'))</DependentUpon>
    </Compile>
    <EmbeddedResource Include="**\*.resx">
      <Generator>PublicResXFileCodeGenerator</Generator>
      <LastGenOutput>$([System.String]::Copy('%(FileName)')).Designer.cs</LastGenOutput>
    </EmbeddedResource>
  </ItemGroup>

注释MSBUILD Item Metadata reference is a great resource-例如它告诉您%FileName不包括最初使我绊倒的扩展名。还有this related SO post affirms the necessity of using String.Copy

答案 1 :(得分:2)

您可以在元数据上使用属性函数,因此使用String.Replace删除.Designer部分应该没问题:

<Compile Update="Properties\**\*.designer.cs">
  <DesignTime>True</DesignTime>
  <AutoGen>True</AutoGen>
  <DependentUpon>Properties\$([System.String]::Copy('%(FileName)').Replace('.Designer', '')).resx</DependentUpon>
</Compile>