Skip to content
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

Runtime packages not restoring properly? #118

Closed
SamVanheer opened this issue Feb 20, 2020 · 12 comments
Closed

Runtime packages not restoring properly? #118

SamVanheer opened this issue Feb 20, 2020 · 12 comments

Comments

@SamVanheer
Copy link

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.

@adamhewitt627
Copy link
Member

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" />

@SamVanheer
Copy link
Author

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

@tannergooding
Copy link
Member

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

@adamhewitt627
Copy link
Member

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.

@tannergooding
Copy link
Member

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: #46 (comment), 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.

@pamrulla
Copy link

pamrulla commented Apr 3, 2020

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?

@tannergooding
Copy link
Member

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.

@PathogenDavid
Copy link
Contributor

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.)

@alexrp
Copy link
Contributor

alexrp commented Sep 9, 2020

@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?

@amaitland
Copy link
Contributor

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

@tannergooding Was an issue ever created?

@tannergooding
Copy link
Member

No, there are a few existing issues that largely cover this, such as NuGet/Home#6083

@tannergooding
Copy link
Member

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

7 participants