-
Notifications
You must be signed in to change notification settings - Fork 1.4k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
P2Ps should be allowed when ReferenceOutputAssembly=false even given TFM incompatibilities #2661
Comments
Workaround: Try also adding SkipGetTargetFrameworkProperties=true metadata to the reference. |
From @AArnott on March 7, 2017 5:58 Thanks @nguerrera. But that doesn't work either. That causes a referencing project A to build the referenced project B per A's TargetFramework value instead of B's TargetFramework. |
Ah, I believe this would only happen if A is multi targeted. Is it? Try adding UndefineProperties="TargetFramework" metadata as well. |
From @AArnott on March 7, 2017 18:39 Yes, Should we leave the issue active for making this scenario simpler, and/or work the way it used to? |
Yes, this should work without the extra metadata. |
From @AArnott on April 11, 2017 13:31 This is badly broken. The workaround causes nuget restore to fail in VS (command line is fine) and also is related to a build failure that only occurs on some non-Windows machines including Travis CI Ubuntu. I tried replacing this with a "project dependency" encoded in the solution file, and that fixed most of the symptoms, until I tried This inability to influence build ordering is really causing some pain here. Please fix soon! |
From @Sumo-MBryant on May 8, 2017 8:1 Has anyone found a workaround that is close to successful? For a minimal netstandard1.X project reference to a netcoreapp1.X project:
Interestingly enough when I restore and build from MSBuild directly the |
From @AArnott on May 8, 2017 22:52 No. I finally gave up and checked the binary into git so I didn't need a project reference. I tried for days but never found a way that got dotnet build, msbuild, and VS to all work correctly at once. 😦 |
From @rainersigwald on July 14, 2017 21:46 This can be worked around by adding an outside-the-norm order dependency in MSBuild, by way of a custom call to the <Target Name="WorkaroundSdk939" BeforeTargets="ResolveProjectReferences">
<MSBuild Project="..\..\the\other.csproj" />
</Target> Note that depending on your specific needs, you might need to be careful to preserve configuration and other normally-handled-for-you properties, or call a specific target.
This appears to have been added to MSBuild in the dev11 timeframe. @cdmihai went into detail on the process in #2274 (comment). The current team doesn't know why it's necessary. |
From @AArnott on July 14, 2017 22:52
Ya, that's what kills your proposed workaround in virtually all my scenarios. That would build the default configuration of the project, which could mean building all the target frameworks in debug mode, which is almost never what I would expect or need. Also, it would cause over-build, compiling twice etc. which can at least slow down the build, but also lead to symbols and DLLs not always matching up. It's a non-starter for me. |
From @rainersigwald on August 7, 2017 13:41 @mhutch came up with an interesting workaround in #2399 (comment): <!-- workaround for https://github.com/Microsoft/msbuild/issues/2399 -->
<Target Name="WorkaroundMSBuildIssue2399" BeforeTargets="GetTargetFrameworkProperties">
<PropertyGroup>
<ReferringTargetFramework>$(TargetFramework)</ReferringTargetFramework>
</PropertyGroup>
</Target> In the referenced project. That essentially disables the target-framework compatibility check for the referenced project, which could be somewhat dangerous (depending on the nature of other references to the project) but avoids this problem. |
From @rainersigwald on August 23, 2017 18:47 WorkaroundSet <AddSyntheticProjectReferencesForSolutionDependencies>false</AddSyntheticProjectReferencesForSolutionDependencies> in the project that has the (Was poking around near this target for another reason and saw this.) |
Moving to msbuild because after the double-evaluation fix, this compatibility check happens there in the context of the caller. |
I would think SkipGetTargetFrameworkProperties=true metadata on ProjectReference would work now and that we should set this automatically when ReferenceOutputAssembly=false. |
I just tried SkipGetTargetFrameworkProperties workaround and it works for me. Thanks! |
Actually, I spoke too soon, it fails during pack:
|
my workaround
|
@SimonCropp what does that accomplish? MSBuild would never build your project reference in that case. Is it that at least it works within the IDE that makes this workaround attractive? |
FYI something in 15.5 seems to have broken my workaround while not resolving the original bug. Fortunately setting |
Explicitly opts synthetic project references injected by solution dependencies out of the TargetFramework-compatibility/find-best-match dance instituted in 15.x for .NET Standard support. Fixes the most common cause of dotnet#2661.
It is confusing to explicitly specify that you _don't_ want the output of another project referenced in this project and then be told that the output is incompatible. This commit listens to the preexisting ProjectReference metadatum ReferenceOutputAssembly and avoids the compatibility/best-match checks on ProjectReferences that avoid the dependency. Fixes dotnet#2661 (and dotnet/sdk#939).
It is confusing to explicitly specify that you _don't_ want the output of another project referenced in this project and then be told that the output is incompatible. This commit listens to the preexisting ProjectReference metadatum ReferenceOutputAssembly and avoids the compatibility/best-match checks on ProjectReferences that avoid the dependency. Fixes dotnet#2661 (and dotnet/sdk#939).
It is confusing to explicitly specify that you _don't_ want the output of another project referenced in this project and then be told that the output is incompatible. This commit listens to the preexisting ProjectReference metadatum ReferenceOutputAssembly and avoids the compatibility/best-match checks on ProjectReferences that avoid the dependency. Fixes #2661 (and dotnet/sdk#939).
@rainersigwald any comments on the above question? |
Also running into this. I'm trying to build a <ItemGroup>
<None Include="..\Faithlife.AssemblyEmbedder\bin\$(Configuration)\netcoreapp3.1\**" Pack="true" PackagePath="/tools/netcoreapp3.1/" />
</ItemGroup> This works fine but ideally I'd like to have a reference so that Currently my workaround is to just do a separate |
From @AArnott on March 3, 2017 18:40
With VS2015 projects, I can have a P2P from a portable library to a net46 library by setting metadata on the project reference:
But with the .NET SDK projects, even with this metadata the build fails:
This blocks scenarios where a P2P exists merely for the sake of ensuring build ordering but without the assembly reference. In my particular scenario, the referenced project provides a binary that the build of the portable library picks up for code generation purposes.
Copied from original issue: dotnet/sdk#939
The text was updated successfully, but these errors were encountered: