I'm trying to figure out how to migrate a project from PCL to .netstandard 1.2.
I have a solution where I have a PCL project (portable45-net45+win8+wpa81) and a .Net Standard (netstandard1.2) project which has all it files linked into the PCL project.
Currently we create a nuget package from the PCL project using a nuspec file.
Now what would be the best approach to have both available in 1 nuget package?
I find the use of nuget pack vs dotnet pack and mixing multiple frameworks and project types (csproj) very confusing.
Also appearantly there is a new csproj format for VS2017+ projects, should I convert the PCL project?
Eventually the nuget should only contain the .netstandard1.2 project but we want to take both up the dependency tree during migration.
what would be the best approach to have both available in 1 nuget package?
You can still use .nuspec file to accomplish this, just need include the dll files from PCL project and .Net Standard project into different frameworks.
Following is my test .nuspec file, you can check it for details:
<?xml version="1.0"?>
<package >
<metadata>
<id>My.Package</id>
<version>1.0.0</version>
<authors>Tester</authors>
<owners>Tester</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Package description</description>
<releaseNotes>Summary of changes made in this release of the package.</releaseNotes>
<copyright>Copyright 2018</copyright>
<tags>Tag1 Tag2</tags>
</metadata>
<files>
<file src="TestPCL\bin\Debug\TestPCL.dll" target="lib\portable-net45+wp8\" />
<file src="TestStandard\bin\Debug\netstandard1.2\TestStandard.dll" target="lib\netstandard1.2\" />
</files>
</package>
When you install this package to the PCL project and .Net Standard project, nuget will select the DLL file under the corresponding framework to your project.
Related
I have a few projects, which could be a console application, Web Application, WebAPI, MVC etc) and a normal Class Library (not Core/.Net 6) which contains Newtonsoft.Json dll (latest version).
Each of the applications have their own version of Newtonsoft.Json dll that has been added manually for that project. In doing this it means an older app could have used version 1.0 the next application could have used v 2.0 and later apps could have used a much later version etc
I would like to share this class library through a Nuget package but i have added the latest version of Newtonsoft.Json dll into my own class library.
When i create a .nuspec file i would like to exclude this file but using this code
<files>
<file src="bin\Release\Newtonsoft.dll" target="\" />
</files>
within the .nuspec file doesnt seem to work, reading https://learn.microsoft.com/en-us/nuget/reference/nuspec suggests to use the exclude but i cant get the syntax right.
What am i missing here?
In your nuspec include this:
<dependencies>
<dependency id="Newtonsoft.Json" version="[3.5,14)" />
</dependencies>
Where 3.5 is the oldest version you support and 14 is the newest you do not support.
Then you can leave out newtonsoft.dll from you own package and the project you install the nuget into will be able to determine which newtonsoft to use.
I have a Visual Studio solution with multiple projects. There is one single csproj for every version of .NET Framework (+ .NET Core) I want to support, and I want to keep it that way. They all generate one DLL each. All DLLs are named the same but are slightly different.
I've recently started generating NuGet packages out of these DLLs using a nuspec file and the command nuget pack. So far, I've generated one NuGet package for each DLL.
Would it be possible to generate one single NuGet package, that contains all the DLLs, and when a user installs the package, installs the right DLL?
I tried the following in my nuspec file:
<?xml version="1.0" encoding="utf-8"?>
<package >
<metadata>
...
<dependencies>
<group targetFramework=".NETCoreApp3.1" />
<group targetFramework=".NETFramework4.0" />
</dependencies>
</metadata>
<files>
<file src="bin\Company.Product.dll" target="lib\net40" />
<file src="..\CompanyProductCore\bin\Company.Product.dll" target="lib\netcoreapp3.1" />
</files>
</package>
When I look in the generated NuGet package, there are the two expected subfolders in the lib folder, and they each contain a DLL which looks right.
However, when I test the package and try to install it in another Visual Studio solution on a .NET Core App project, I get the warning:
Package X was restored using '.NETFramework,Version=v4.6.1...4.6.2...4.7...4.7.1...4.7.2...4.8 instead of the project target framework '.NetCoreApp,Version=3.1'. This package may not be fully compatible with your project.
which is something that did not appear when I packed it separately. So it would seem that it didn't detect that there was a .NET Core-specific DLL given.
Is what I want to do possible, and if so, how?
Your target frameworks should be net40 and netcoreapp3.1.
<dependencies>
<group targetFramework="netcoreapp3.1" />
<group targetFramework="net40" />
</dependencies>
https://learn.microsoft.com/en-us/dotnet/standard/frameworks
I created a .NET framework class library targeting 4.6.1 .NET Framework. The project contains one .cs class and no external references to any libraries, DLLs, or NuGet packages. Here is the nuspec:
<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<!-- Required elements-->
<id>MyEventLogger.Core</id>
<version>1.0.0</version>
<description>Logs event log</description>
<authors>Me</authors>
</metadata>
<files>
<file src="MyEventLogger.Core\**\bin\Debug\*.dll" target="lib\net" />
<file src="MyEventLogger.Core\**\bin\Debug\*.dll" target="lib\netstandard" />
</files>
</package>
I am having trouble importing this from an ASP.NET Core application running .NET Framework 4.7.1.
The error I get is that the package does not support any frameworks:
I am using Azure Devops Build pipeline to initiate the pack and push to a local feed. How should I reference this correctly so that an application on a newer version of .NET Framework can still use this library that is on an older version?
Thank you for any help! I can't find how to fix this error anywhere or good examples of targeting multiple .NET Frameworks.
I got it working when I was able to use the following file nodes:
<files>
<file src="**\MyEventLogger.Core.dll" target="lib\net461\MyEventLogger.Core.dll" />
</files>
What helped me figure this out was to install NuGet onto my machine as well as installing the NuGetPackageExplorer. You can create a package using the NuGetPackageExplorer and then exporting the .nuspec file. I copied that .nuspec file into my repository and then pointed my Azure DevOps build pipeline to the .nuspec file. This error disappears when I import the package into another project.
For you to be able to use code across .net framework and .net core, you need to write your code in a library written in .net standard. You may find a similar solution here
Thank you
I have a solution with 3 projects (using netstandard1.4). Project A contains shared code. Project B is a server side library and project C is a client side library. Project B and C include project A as project reference.
Now I want to publish project B and project C as a nuget package.
The Problem is the nuget packages for project B and C do not contain the code / dll from project A. It looks like project B and C want project A also as a nuget package.
How can I pack the project B and C as standalone nuget packages? I don’t want to publish project A as a nuget package.
How can I pack the project B and C as standalone nuget packages? I don’t want to publish project A as a nuget package.
Since you are using .NET Standard 1.4, you could not use the direct way "dotnet pack" to include the project references. Because dotnet pack will pack only the project and not its P2P references, you can get the detail info from the document dotnet-pack and the issue on GitHub:
NuGet dependencies of the packed project are added to the .nuspec file, so they're properly resolved when the package is installed. Project-to-project references aren't packaged inside the project. Currently, you must have a package per project if you have project-to-project dependencies.
If you want to pack project B and C contain the code / dll from project A, you can use NuGet.exe to create the package B and C by adding project reference assemblies to the .nuspec file:
<?xml version="1.0"?>
<package >
<metadata>
<id>TestProjectB</id>
<version>1.0.0</version>
<authors>Tester</authors>
<owners>Tester</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>Package description</description>
<releaseNotes>Test sample for netstandard package.</releaseNotes>
<copyright>Copyright 2017</copyright>
<tags>Tag1 Tag2</tags>
</metadata>
<files>
<file src="bin\Debug\netstandard1.4\TestProjectB.dll" target="lib\netstandard1.4\TestProjectB.dll" />
<file src="bin\Debug\netstandard1.4\TestProjectA.dll" target="lib\netstandard1.4\TestProjectA.dll" />
</files>
</package>
In this case, you can pack the project B and C as standalone nuget packages, do not need publish project A as a nuget package.
with the release of the .net core i have been trying to build a simple project, however whenever i try and add a dll reference in my project i get the following message
".Net Core Projects only support Referencing .Net Framework assemblies in this release To Reference other assemblies they need to be included in nuget package and reference that package"
i was getting this message in RC2 but not in RC1, is anyone else having this issue and does anyone know how to resolve it? i have not been able to find anything relating to this other than a git issue ticket https://github.com/aspnet/Home/issues/1612
For referencing external dll in .net core you need to create you own nuget package.
The NuGet docs show how to create a package from a dll:https://docs.nuget.org/create/hosting-your-own-nuget-feeds . You can put that nuget package in a local folder and use that as a feed: [https://docs.nuget.org/create/hosting-your-own-nuget-feeds]
For this you need to edit the nuspec file and add the following code in the nuspec file.
<package>
*******--Some code--*****
<metadata>
<references>
<reference file="xxx.dll"/>
</references>
</metadata>
<--For addig reference of external dll-->
<files>
<file src="path\*.dll" target="lib\netCoreApp1.0"/>
</files>
Now create .nupkg file and install this package in your project.
Hope this solution works for you.