当前位置:  开发笔记 > 编程语言 > 正文

如何打包面向.NET Core的可移植.NET库?

如何解决《如何打包面向.NETCore的可移植.NET库?》经验,为你挑选了1个好方法。

如何以现代通用方式打包可移植.NET库?假设我有一个AnyCPU程序集,我希望它可用于任何支持.NET Core API表面的.NET平台,例如.NET Framework 4.6和通用Windows平台.

这是一系列问题和答案,记录了我对现代NuGet包创作主题的研究结果,特别关注NuGet 3引入的变化.您可能还对一些相关问题感兴趣:

如何打包.NET Framework库?

如何打包面向通用Windows平台的.NET库?

如何打包面向.NET Framework和通用Windows平台的.NET库并包含特定于平台的功能?

如何打包一个针对通用Windows平台的多架构.NET库?

如何打包一个针对通用Windows平台并依赖于Visual Studio扩展SDK的.NET库?

Sander.. 13

此答案建立在用于打包面向.NET Framework的库的原则之上.首先阅读链接的答案,以便更好地理解以下内容.

要发布可移植的.NET库,您需要创建一个具有以下结构的NuGet包:

\---lib
    \---dotnet
            MyPortableLibrary.dll
            MyPortableLibrary.pdb
            MyPortableLibrary.XML

所有这三个文件都来自Release构建配置下项目的构建输出目录.

dotnet上面结构中的目录具有特殊含义 - 它向NuGet指示目录中的文件将用于所有包依赖项兼容的任何平台上.因此,您的程序包可以自动在任何支持所有依赖项的.NET平台上使用(例如.NET Core).

关键的下一步是确定依赖项列表.由于包管理问题,不可能简单地声明对.NET Core本身的依赖(.NET Core是所有.NET平台共享的API表面).相反,您必须手动确定每个.NET Core组件依赖项并将其添加到nuspec文件中.

.NET Core包的依赖项检测过程包括两个步骤:

    确定库引用的.NET Core程序集.

    确定包含这些程序集的NuGet包.

Visual Studio不提供您需要的信息.相反,您需要构建库并检查生成的DLL文件.以下PowerShell脚本将显示.NET程序集的引用:

Get-ChildItem MyPortableLibrary.dll | % { [Reflection.Assembly]::LoadFile($_.FullName).GetReferencedAssemblies() | % { $_.Name + ".dll" } }

此命令的输出将是程序集名称列表,例如:

System.Runtime.dll
System.Resources.ResourceManager.dll
System.Numerics.Vectors.dll

获得列表后,打开项目目录中的project.lock.json文件.此文件包含有关项目使用的所有NuGet包的信息.除了其他数据之外,您还可以找到各种JSON块,如下所示:

"System.Numerics.Vectors/4.1.0": {
    "dependencies": {
        "System.Globalization": "[4.0.10, )",
        "System.Resources.ResourceManager": "[4.0.0, )",
        "System.Runtime": "[4.0.20, )",
        "System.Runtime.Extensions": "[4.0.10, )"
    },
    "frameworkAssemblies": [
        "mscorlib",
        "System.Numerics"
    ],
    "compile": {
        "ref/net46/System.Numerics.Vectors.dll": {}
    },
    "runtime": {
        "lib/net46/System.Numerics.Vectors.dll": {}
    }
},

此JSON块表示"compile"下列出的程序集文件由顶级值(System.Numerics.Vectors 4.1.0版)中列出的程序包提供.使用此信息将每个引用的程序集映射到NuGet包.请注意,虽然包和程序集名称通常是相同的,但情况并非总是如此!

对于不属于.NET Core的任何NuGet包,您可以跳过上述过程,因为您已经知道您依赖的确切包.此处描述的依赖项检测逻辑仅是必需的,因为由于上面链接的问题,您无法直接在.NET Core(Microsoft.NETCore包)上声明依赖项.

现在,只需列出nuspec文件中的所有依赖项,基于以下示例:



    
        Example.MyPortableLibrary
        1.0.0
        Firstname Lastname
        Example of a portable library with NuGet package dependencies.
        
            
            
            
        
    
    
        
    

而已!生成的程序包可用于任何兼容的.NET平台,例如.NET Framework 4.6或Universal Windows Platform.在创建NuGet包之前,请记住使用Release配置构建解决方案.

GitHub上提供了一个示例库和相关的打包文件.与此答案对应的解决方案是PortableLibrary.

请参阅Lucian Wischik的博客,深入了解运行此类NuGet软件包的逻辑.



1> Sander..:

此答案建立在用于打包面向.NET Framework的库的原则之上.首先阅读链接的答案,以便更好地理解以下内容.

要发布可移植的.NET库,您需要创建一个具有以下结构的NuGet包:

\---lib
    \---dotnet
            MyPortableLibrary.dll
            MyPortableLibrary.pdb
            MyPortableLibrary.XML

所有这三个文件都来自Release构建配置下项目的构建输出目录.

dotnet上面结构中的目录具有特殊含义 - 它向NuGet指示目录中的文件将用于所有包依赖项兼容的任何平台上.因此,您的程序包可以自动在任何支持所有依赖项的.NET平台上使用(例如.NET Core).

关键的下一步是确定依赖项列表.由于包管理问题,不可能简单地声明对.NET Core本身的依赖(.NET Core是所有.NET平台共享的API表面).相反,您必须手动确定每个.NET Core组件依赖项并将其添加到nuspec文件中.

.NET Core包的依赖项检测过程包括两个步骤:

    确定库引用的.NET Core程序集.

    确定包含这些程序集的NuGet包.

Visual Studio不提供您需要的信息.相反,您需要构建库并检查生成的DLL文件.以下PowerShell脚本将显示.NET程序集的引用:

Get-ChildItem MyPortableLibrary.dll | % { [Reflection.Assembly]::LoadFile($_.FullName).GetReferencedAssemblies() | % { $_.Name + ".dll" } }

此命令的输出将是程序集名称列表,例如:

System.Runtime.dll
System.Resources.ResourceManager.dll
System.Numerics.Vectors.dll

获得列表后,打开项目目录中的project.lock.json文件.此文件包含有关项目使用的所有NuGet包的信息.除了其他数据之外,您还可以找到各种JSON块,如下所示:

"System.Numerics.Vectors/4.1.0": {
    "dependencies": {
        "System.Globalization": "[4.0.10, )",
        "System.Resources.ResourceManager": "[4.0.0, )",
        "System.Runtime": "[4.0.20, )",
        "System.Runtime.Extensions": "[4.0.10, )"
    },
    "frameworkAssemblies": [
        "mscorlib",
        "System.Numerics"
    ],
    "compile": {
        "ref/net46/System.Numerics.Vectors.dll": {}
    },
    "runtime": {
        "lib/net46/System.Numerics.Vectors.dll": {}
    }
},

此JSON块表示"compile"下列出的程序集文件由顶级值(System.Numerics.Vectors 4.1.0版)中列出的程序包提供.使用此信息将每个引用的程序集映射到NuGet包.请注意,虽然包和程序集名称通常是相同的,但情况并非总是如此!

对于不属于.NET Core的任何NuGet包,您可以跳过上述过程,因为您已经知道您依赖的确切包.此处描述的依赖项检测逻辑仅是必需的,因为由于上面链接的问题,您无法直接在.NET Core(Microsoft.NETCore包)上声明依赖项.

现在,只需列出nuspec文件中的所有依赖项,基于以下示例:



    
        Example.MyPortableLibrary
        1.0.0
        Firstname Lastname
        Example of a portable library with NuGet package dependencies.
        
            
            
            
        
    
    
        
    

而已!生成的程序包可用于任何兼容的.NET平台,例如.NET Framework 4.6或Universal Windows Platform.在创建NuGet包之前,请记住使用Release配置构建解决方案.

GitHub上提供了一个示例库和相关的打包文件.与此答案对应的解决方案是PortableLibrary.

请参阅Lucian Wischik的博客,深入了解运行此类NuGet软件包的逻辑.


在我看来,这个答案是过时的,现在它是`lib \nestandard1.5`或1.6等等,我是对的吗?
推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有