Project-system: Globbing and DependsUpon with resx files and custom tool doesn't quite work

Created on 6 Oct 2017  路  13Comments  路  Source: dotnet/project-system

Here is a fun example of bad behaviour of globbing and the project system. I have

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

  <ItemGroup>
    <EmbeddedResource Update="Properties\*.resx">
      <Generator>I18NReactive</Generator>
      <LastGenOutput>%(Filename).resx.cs</LastGenOutput>
    </EmbeddedResource>
  </ItemGroup>

where I18NReactive is a custom single file generator I wrote. The globbing and dependencies work at first glance.

image

Then I right click and select run custom tool to regen the resx.cs file. And not only does it update the file it also updates my csproj file. 馃憥 so now it is

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

  <ItemGroup>
    <EmbeddedResource Update="Properties\*.resx">
      <Generator>I18NReactive</Generator>
      <LastGenOutput>%(Filename).resx.cs</LastGenOutput>
    </EmbeddedResource>
  </ItemGroup>

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

  <ItemGroup>
    <EmbeddedResource Update="Properties\lang.resx">
      <Generator>I18NReactive</Generator>
      <LastGenOutput>lang.resx.cs</LastGenOutput>
    </EmbeddedResource>
  </ItemGroup>

that's kinda wierd no?

I also tried

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

  <ItemGroup>
    <EmbeddedResource Remove="Properties\*.resx" />
    <EmbeddedResource Include="Properties\*.resx">
      <Generator>I18NReactive</Generator>
      <LastGenOutput>%(Filename).resx.cs</LastGenOutput>
    </EmbeddedResource>
  </ItemGroup>
Area-External-CPS Bug Feature-Project-File-Simplification Needs-CPS-work Resolution-Fixed

All 13 comments

@jviau - would this be project-system, or core CPS?

It's nasty, but here's a glob that works for Resx/embedded resources:
https://github.com/onovotny/MSBuildSdkExtras/blob/master/MSBuild.Sdk.Extras/build/MSBuild.Sdk.Extras.Common.targets#L14-L28

I see the same stuff getting added to the project file when you run the tool.

This is CPS. I have identified the issue, single file generator is rewriting all property, causing us to expand them all. We will fix this soon.

Nice - @jviau is there an ID for the issue on the CPS side?

Great - closing as external then. If you can - it would be great to comment here on the expected release with the fix once it's merged.

@Pilchie did this ever get a release?

@davidwengier We had a bunch of changes both in single file generators and editing since above - can we verify if this still exists? The internal bug was won't fix but we've had feedback here and https://github.com/Microsoft/msbuild/issues/2352#issuecomment-454076634.

i also note that renaming a parent file, that has dependents globbed under it, results in those dependents being explicitly duplicated in the csproj. will the fix for this issue also resolve that?

@SimonCropp No, can you file a new one for that here?

This has been fixed.

Was this page helpful?
0 / 5 - 0 ratings