如何在多个平台上将Nuget中的本机资产包含在内,只有64位

时间:2018-03-07 22:18:16

标签: .net nuget .net-standard

我正在创建一个具有以下想法的NuGet包:

  • 具有平台相关的可执行文件和dll(Windows,Linux和MacOS)。
  • 原生二进制文件是64位的。
  • 使用这些本机资源的.NET Standard 2.0库。
  • 在.NET库开发和测试期间,本机资源应该包含在构建中,以便它们可以使用。

这个想法不是嵌入本机资源然后提取它们,而是与使用它们的.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 StudioAutomatic 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>

有了这些,这看起来就像被解决了。

1 个答案:

答案 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>