【问题标题】:Creating NuGet package for multiple .NET Framework versions为多个 .NET Framework 版本创建 NuGet 包
【发布时间】:2017-11-24 20:03:22
【问题描述】:

我正在开发一个库并希望为多个版本的 .NET Framework 创建 NuGet 包。我没有找到任何包含执行此操作的完整列表的文章。

我尝试的第一个选项是创建一堆配置,例如 Release_Net45 等等。然后我编辑 csproj 以更正每个配置的输出目录(lib/net45 等)和目标框架版本。然后我构建了每个配置。之后我运行了 nuget pack 并成功创建了一个包,并发出一个警告,即没有添加一个 dll,因为它已经在包中......

然后我尝试编辑 csproj 以将 TargetFrameworks 元素和用于包元数据的元素包含到与发布配置相对应的 PropertyGroup 中。编辑后重新加载项目后,解决方案资源管理器中出现了名为 Dependencies 的新组。我尝试在开发人员命令提示符中使用 msbuild /t:pack /p:Configuration=Release 创建包,但它以没有包目标的错误完成。为了修复它,我添加了 NuGet.Build.Tasks.Pack 包,然后构建了包。但是当我在配置管理器中查看它们时,我的配置突然损坏了。

我没想到为多个目标框架设置一个包会如此痛苦:(这样做的正确方法是什么?这个任务有完整的指南吗?

【问题讨论】:

    标签: nuget nuget-package csproj


    【解决方案1】:

    TargetFramework / TargetFrameworks 属性仅在基于 SDK 的项目中受支持。目前,只有 .NET Standard、.NET Core 和 ASP.NET Core 项目的项目模板使用这种基于 SDK 的项目格式。因此,您可以创建一个 .NET Standard 库,然后编辑 csproj(右键单击项目 > 编辑)。

    一个最小的例子是:

    <Project Sdk="Microsoft.NET.Sdk">
      <PropertyGroup>
        <TargetFrameworks>net45;net461</TargetFrameworks>
      </PropertyGroup>
    </Project>
    

    注意Sdk 属性的存在,它提供了许多默认值和额外的构建逻辑。您无需在文件夹结构中指定任何 .cs 文件,并且可以使用项目的属性页来设置 NuGet 相关属性。

    在您的案例中显示依赖项节点的原因是因为 VS 2017 为 .NET 项目提供了两个不同的项目系统 - 一个已经在 VS 中使用很长时间的经典项目系统,另一个正在新项目中开发的新项目系统系统模型 (CPS) 尚不支持经典项目系统的所有功能,但具有其他功能,例如新的依赖项模型、NuGet 的属性页以及在加载项目时支持编辑项目文件。选择加载哪个项目系统取决于项目文件中是否存在TargetFrameworkTargetFrameworks

    【讨论】:

    • 感谢您的解释。那么,为 .NET Framework 设置项目以便为多个目标框架打包的正确方法是什么?
    • 目前没有公开记录的。您可以将我发布的代码复制到 xyz.csproj 文件中,然后在 Visual Studio 中打开它即可开始使用。从经典的 csproj 迁移到基于 sdk 的 csproj 也没有什么好的迁移故事——它主要是手动编辑 csproj 文件(恐怕知道该怎么做)。
    • 但它确实很好用,Newtonsoft.Json 也在使用这种方法,甚至使用自定义逻辑对其进行扩展,以允许构建可移植类库
    • OK... 是的,似乎检查其他项目的 csproj 文件是了解如何准备库以打包到 NuGet 包的最快方法。
    • 我终于解决了我的任务。可以在经典 .NET Framework 中切换到新的 csproj 格式。这个article对我帮助很大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多