ClangSharp icon indicating copy to clipboard operation
ClangSharp copied to clipboard

Runtime packages not restoring properly?

Open SamVanheer opened this issue 4 years ago • 11 comments

I'm trying to use ClangSharp v9.0.0 beta from NuGet and i had a lot of trouble getting the libClang and libClangSharp native dependencies to load. I had to manually add the win-x64 runtime packages in order to have them deployed to the runtimes directory to be loaded.

Are we supposed to do this manually, or is NuGet supposed to automatically add the dependencies based on the main dependency specified in the libClang and libClangSharp packages? I'm not knowledgeable enough on NuGet to know what it can do so i'm at a loss here.

SamVanheer avatar Feb 20 '20 19:02 SamVanheer

I think it's what you said, but just to be clear: I see the error loading libClangSharp even with:

<PackageReference Include="libClangSharp" Version="9.0.0-beta1" />

However, the error goes away with:

<PackageReference Include="libClangSharp.runtime.win-x64" Version="9.0.0-beta1" />

adamhewitt627 avatar Mar 12 '20 05:03 adamhewitt627

Yeah that's what i'm referring to. The native dependencies need to be manually added for it to load.

SamVanheer avatar Mar 12 '20 08:03 SamVanheer

It is meant to automatically resolve them based on the host runtime identifier. I'll see if I can reproduce in a bit.

tannergooding avatar Mar 12 '20 14:03 tannergooding

libclang-repro.zip

I actually assumed the root of my issue was that my code in in a class library, but this reproduces in a very simple console app.

adamhewitt627 avatar Mar 12 '20 16:03 adamhewitt627

I can repro.

The simple fix for now is to add <RuntimeIdentifier Condition="'$(RuntimeIdentifier)' == '' AND '$(PackAsTool)' != 'true'">$(NETCoreSdkRuntimeIdentifier)</RuntimeIdentifier> to your project (under a PropertyGroup), unfortunately because of the way NuGet restore works, we can't just add this to a build/*.targets in the ClangSharp nuget package.

The issue is essentially that libClang and libClangSharp just contain a runtime.json file which point to the real packages. This was done to avoid users needing to download hundreds of megabytes just to consume ClangSharp (when they only need one of the native binaries most often). You can see some more details on the sizes here: https://github.com/microsoft/ClangSharp/issues/46#issuecomment-562653088, noting that that is the size of the compressed NuGet.

I had thought this was working for dev scenarios where the RID wasn't specified, but it apparently isn't. I'll log an issue on NuGet to see if this is something that can be improved.

tannergooding avatar Mar 12 '20 17:03 tannergooding

I am getting following error when downloading libclangsharp from nuget. "Install-Package : Could not install package 'libClangSharp.runtime.win-x64 9.0.0-beta1'. You are trying to install this package into a project that targets '.NETFramework,Version=v4.6.1', but the package does not contain any assembly references or content files that are compatible with that framework. For more information, contact the package author." Do I need to change my project .Net Framework to 2.0?

pamrulla avatar Apr 03 '20 11:04 pamrulla

libClangSharp.runtime.win-x64 9.0.0-beta1 isn't meant to be referenced directly. You are meant to reference libClangSharp and specify a RuntimeIdentifier so NuGet downloads and resolves the correct assets.

tannergooding avatar Apr 14 '20 23:04 tannergooding

Not sure if it's the SDK's responsibility or if this is something that could be fixed in ClangSharp, but in my case the issue was doubly confusing because the runtime picked up a random libclang.dll (version 5) that happened to be on my path. As you might imagine I was very confused why C++17 wasn't supported in the latest version of Clang.

Is there something we can do to make something complain when the RID is invalid/incompatible with the package? (I'm not particularly up to speed on how RIDs work in NuGet in the first place.)

PathogenDavid avatar May 14 '20 06:05 PathogenDavid

@tannergooding

The simple fix for now is to add <RuntimeIdentifier Condition="'$(RuntimeIdentifier)' == '' AND '$(PackAsTool)' != 'true'">$(NETCoreSdkRuntimeIdentifier)</RuntimeIdentifier> to your project (under a PropertyGroup), unfortunately because of the way NuGet restore works, we can't just add this to a build/*.targets in the ClangSharp nuget package.

I suppose this fixes the issue for regular dotnet build/dotnet publish scenarios, but the problem remains for dotnet pack'd global tools, right?

If so, if I don't mind the size increase of the package (in my case, I'm only using LLVM, not Clang, so it's not quite as bad), is there a way to explicitly include the RID-specific packages in my tool package for the RIDs I care about?

alexrp avatar Sep 09 '20 08:09 alexrp

I'll log an issue on NuGet to see if this is something that can be improved.

@tannergooding Was an issue ever created?

amaitland avatar Oct 13 '20 10:10 amaitland

No, there are a few existing issues that largely cover this, such as https://github.com/NuGet/Home/issues/6083

tannergooding avatar Oct 13 '20 16:10 tannergooding

ClangSharp and libClangSharp now provide a linux-x64 component which should assist in many scenarios "just working".

It's worth noting, however, this is a "best attempt" and LLVM/Clang themselves often need "per distro" and even "per distro version" builds for things to work end to end as expected.

As indicated above, the broader restore issue is an issue with NuGet and something that issues have been logged around.

tannergooding avatar Sep 18 '22 16:09 tannergooding