如何通过 NuGet 包共享源代码以用于 .NET Core 项目

Posted

技术标签:

【中文标题】如何通过 NuGet 包共享源代码以用于 .NET Core 项目【英文标题】:How to share source code via NuGet packages for use in .NET Core projects 【发布时间】:2019-03-23 15:45:12 【问题描述】:

我想让小段源代码(例如帮助程序类)可用于 .NET Core 项目 (.csproj)。 至此,我根据不同的博文和官方的 nuget 文档,以多种不同的方式用 NuGet 打包了源代码。我使用了一个 nuspec 文件来控制我的源文件在 nuget 包中的最终位置,例如:

<files>
    <file src="*.cs" target="content/LruCache" />
    <file src="*.cs" target="contentFiles/cs/any/LruCache" />
</files>

我没有包含任何 msbuild 目标文件或安装脚本。

每当我将 NuGet 包安装到 .NET Core 项目 (https://docs.microsoft.com/en-us/dotnet/core/tools/csproj) 时,我根本就什么也得不到。我的项目中不会包含任何源文件。我为 .csproj(PrivateAssets 等)中的 &lt;PackageReference/&gt; 节点尝试了不同的设置,但没有成功。

这意味着可能吗?如果有,应该怎么做?


背景: 这样做的原因是某种菱形问题,我们有项目 B 和 C 都使用辅助类 A,而第三个项目 D 使用 B 和 C。 在这种情况下,当在 B 和 C 中使用不同(不兼容)版本的 A 时,我不想处理程序集版本冲突。

【问题讨论】:

【参考方案1】:

这意味着可能吗?如果有,应该怎么做?

答案是肯定的。由于您测试项目类型是.net core。您应该使用contentFiles 而不是contentcontent 用于 packages.config。查看Using the contentFiles element for content files 和博客NuGet ContentFiles Demystified 了解更多详情。

所以你的.nuspec 文件应该是:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
  <metadata>
    <id>MyTestCore</id>
    <version>5.0.0</version>
    <authors>TestContentFile</authors>
    <owners>TestContentFile</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Package Description</description>
    <contentFiles>
      <files include="any/any/Test.cs" buildAction="content" flatten="true" copyToOutput="true"/>
    </contentFiles>
  </metadata>

  <files>
    <file src="contentFiles/any/any/Test.cs" target="contentFiles/any/any/LruCache" />
  </files>
</package>

nuget 包应如下所示:

注意:创建新包时,不要忘记删除C:\Users\&lt;UserName&gt;\.nuget\packages文件夹中此包的nuget缓存,否则,它总是安装旧包。

使用此方法,源文件将包含到您的项目中。

希望这会有所帮助。

【讨论】:

非常感谢。我错过了元数据部分中的&lt;contentFiles&gt; 节点。 如果用户编辑文件,这会影响使用该包的其他项目。当包更新时,编辑就会消失。我不确定这个功能是否设计得很好。有没有办法从解决方案资源管理器中隐藏文件,或将其设为只读? ...啊哈,显然文件应该是只读的,并且可以编辑它们是a bug。 当我这样做时,文件夹最终被深埋在 obj 文件夹中 - 如何避免这种情况?

以上是关于如何通过 NuGet 包共享源代码以用于 .NET Core 项目的主要内容,如果未能解决你的问题,请参考以下文章

通过几个 nuget 包共享自定义异常

如何创建面向 .NET 5 或更低版本的 NuGet 包。但不是 .NET 6 或更高版本

如何使用本地构建的 nuget 包进行调试?

用于 ASP.NET Core 5 MVC 的 NuGet 包

10分钟学会Visual Studio将自己创建的类库打包到NuGet进行引用(net,net core,C#)

C#上位机开发(十七)—— 基于NuGet安装并使用包(Visual Studio)