我正在创建一个具有以下想法的NuGet包:
这个想法不是嵌入本机资源然后提取它们,而是与使用它们的.NET库一起分发。但是,我遇到了一些问题,我想问一下。
1。对于外部依赖项,是否存在通用的公约约定?目前,我的结构是:
.\Solution.sln
.\Solution.nuspec
.\runtimes\win-x64\native\<.exe and .dll>
.\Project\Project.csproj
此.NET Standard 2.0库项目编译为Project\bin\Debug\netstandard2.0
。我想知道是否有根的其他约定或名称。我已阅读过其他来源和GitHub项目Creating NuGet packages。
2。取.nuspec
文件非常普通,我想知道如何安排文件引用?我阅读了Nuspec replacement tokens和.nuspec
文件中的说明,我有一节说明:
<files>
<file src="bin/$configuration$/$id$.pdb" target="lib/netstandard20" />
<file src="bin/$configuration$/$id$.dll" target="lib/netstandard20" />
<file src="runtimes/win-x64/native/.exe" target="runtimes/win-x64/native/.exe" />
<file src="runtimes/win-x64/native/.dll" target="runtimes/win-x64/native/.dll" />
</files>
但不包含本机文件。当我尝试设置以..\
开头的相对路径时也是如此(我仍然可能有这个错误,可能只是睡了一下再试一次)。
3。我是否应该包含某种.props
文件,然后将包装器和本机资源正确地包含给使用Nuget库的人?应该设置它,以便包含和设置所有本机资源的两个文件,以便将它们与其他构建工件一起复制到项目输出中。
4. 我应该对Project.csproj
作出特别安排吗?或者更好的问题是,我应该注意一些强有力的实践吗?我看到有问题和答案,如https://github.com/aspnet/websdk/issues/204#issuecomment-302482115。或者实际上Automaticaly copy native dll to the bin folder of referencing project in Visual Studio和Automatic native and managed DLLs extracting from Nuget Package。
我应该在Project.csproj
中提及我只设置:
<PropertyGroup>
<RuntimeIdentifiers>win-x64;osx.10-11-x64;ubuntu.16.04-x64;debian.8-x64</RuntimeIdentifiers>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
</PropertyGroup>
编辑:Doh!我尝试按dotnet pack .\Project\Project.csproj
创建包,但不使用.nuspec
文件。也许一种好方法是使用Additions to the csproj format for .NET Core中描述的Nuget元数据工具。
编辑2 :似乎试图通过.csproj
打包有一些问题,更多信息来自https://github.com/NuGet/Home/issues/2372。
编辑3 :在VS 2017中,Package
标签显示是添加详细信息的最佳方式。然后需要修改.csproj
,如
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RuntimeIdentifiers>win-x64;debian-x64</RuntimeIdentifiers>
</PropertyGroup>
<ItemGroup>
<Content Include="lib\runtimes\win-x64\native\.exe">
<PackagePath>lib/runtimes/win-x64/native/.exe</PackagePath>
<Pack>true</Pack>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
本机资源包含在NuGet包中,但未正确恢复。
编辑4:其他人也有类似的问题。 https://github.com/NuGet/Home/issues/6645的其他链接和理由。
编辑5:使用上述结构,最后需要添加的是lib
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Content Include="$(MSBuildThisFileDirectory)../../lib/runtimes/win-x64/native/.exe">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<Link>.exe</Link>
<Visible>false</Visible>
</Content>
</ItemGroup>
</Project>
然后转到Project.csproj
添加
ItemGroup
<Content Include="lib/{your_libraryname}.targets">
<PackagePath>build/netstandard2.0/</PackagePath>
<Pack>true</Pack>
</Content>
有了这些,这看起来就像被解决了。
答案 0 :(得分:0)
这对我有用:
要打包的csproj :
<ItemGroup>
<Content Include="bin\$(Configuration)\runtimes\win-x64\native\e_sqlite3.dll">
<Pack>true</Pack>
<PackagePath>runtimes\win-x64\native\e_sqlite3.dll</PackagePath>
<Link>runtimes\win-x64\native\e_sqlite3.dll</Link>
</Content>
<Content Include="bin\$(Configuration)\runtimes\win-x86\native\e_sqlite3.dll">
<Pack>true</Pack>
<PackagePath>runtimes\win-x86\native\e_sqlite3.dll</PackagePath>
<Link>runtimes\win-x86\native\e_sqlite3.dll</Link>
</Content>
<Content Include="MyNuget.targets">
<Pack>true</Pack>
<PackagePath>build\MyNuget.targets</PackagePath>
</Content>
</ItemGroup>
targets
文件和csproj
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<None Include="$(MSBuildThisFileDirectory)..\runtimes\win-x64\native\e_sqlite3.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<Link>runtimes\win-x64\native\e_sqlite3.dll</Link>
</None>
<None Include="$(MSBuildThisFileDirectory)..\runtimes\win-x86\native\e_sqlite3.dll">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
<Link>runtimes\win-x86\native\e_sqlite3.dll</Link>
</None>
</ItemGroup>
</Project>
从属项目的csproj :
<PackageReference Include="MyNuget">
<Version>0.6.0</Version>
</PackageReference>