msbuildvisual-studio-2017nugettransitive-dependencypackagereference

Disable transitive PackageReference dependency for a specific MsBuild project


I am migrating an old style MsBuild csproj project to using PackageReference format and have run into a problem with transitive dependencies.

Consider the following Project A reference NuGet package B and C, each containing one single assembly using PackageReference. On Build Project A uses IL merge to incorporate B as public symbols in the A assembly and C as internalized symbols. Project D have a project reference to A.

The transitive dependencies case D to reference A, B and C. When building D, compile errors of the type error CS0433: The type 'X' exists in both 'A' and 'B' occur.

Is there any way to force D to not add an explicit reference to B or C in the scenario above?


Solution

  • I ended up using a workaround to move the transitive dependency to an alias to get around the compiler error.

    <Target Name="ChangeAliasesOfBNameAssemblies" BeforeTargets="FindReferenceAssembliesForReferences;ResolveReferences">
      <ItemGroup>
        <ReferencePath Condition="'%(FileName)' == 'B'">
          <Aliases>nonmerged</Aliases>
        </ReferencePath>
      </ItemGroup>
    </Target>
    

    I tried to use private assets but couldn't get the compiler error to go away in that way.