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

bra*_*ing 6 .net msbuild

如果我从VS2017将新的resx文件添加到我的新dotnetstandard 2.0 SDK项目中的properties文件夹中,

<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>
Run Code Online (Sandbox Code Playgroud)

但是,我更希望以与处理普通CS文件相同的方式进行处理。项目为空,并且搜索文件系统。什么是达到上述目的的笨拙方法,所以当我添加新文件时,它们不会以显式声明的形式结束。

我的第一次尝试是

  <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>
Run Code Online (Sandbox Code Playgroud)

但这行不通,因为

Properties\%(Filename).resx
Run Code Online (Sandbox Code Playgroud)

扩展到

Properties\Foo.designer.resx
Run Code Online (Sandbox Code Playgroud)

代替

Properties\Foo.resx
Run Code Online (Sandbox Code Playgroud)

sti*_*ijn 8

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

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


Sli*_*SFT 7

向@stijn表示感谢,我们将此解决方案进一步走了一步,因为它缺少EmbeddedResource我们在发布过程中使用的避免运行时磁盘IOPS 的步骤。

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

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>
Run Code Online (Sandbox Code Playgroud)

注意MSBUILD项元数据参考是一个很好的资源 -例如,它告诉您%FileName排除了最初使我绊倒的扩展名。同时此相关的SO职位申明使用的必要性String.Copy