【问题标题】:Nuget package contentFiles not copied to .NET Core projectNuget 包内容文件未复制到 .NET Core 项目
【发布时间】:2019-01-28 06:56:02
【问题描述】:

我正在尝试将 Nuget 包中的内容文件提取到引用我的包的项目中。

基于Justin Emgarten's comment

Packages.config 项目使用内容文件夹

Project.json/PackageReference/NETCore SDK 项目使用 contentFiles 文件夹

太好了,我创建了一个 .NET Core 2.1 控制台应用程序项目,并遵循了 NuGet ContentFiles Demystified 博客文章,该文章写于 2016 年 project.json,但现在应该仍然可以使用。

我在c:\dev\ContentFilesExample\contentFiles\any\any\images\dnf.png 创建了一个图像,然后创建了一个c:\dev\ContentFilesExample\ContentFilesExample.nuspec 文件并复制粘贴了内容:

<?xml version="1.0"?>
<package>
    <metadata minClientVersion="3.3.0">
        <id>ContentFilesExample</id>
        <version>1.0.0</version>
        <authors>nuget</authors>    <!-- The NuGet team authored this package -->
        <owners>nuget</owners>      <!-- The NuGet team owns this package -->
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>A content v2 example package.</description>
        <tags>contentv2 contentFiles</tags>
        <!-- Build actions for items in the contentFiles folder -->
        <contentFiles>
            <!-- Include Assets as Content -->
            <files include="**/images/*.*" buildAction="EmbeddedResource" />
        </contentFiles>
    </metadata>
</package>

然后我使用命令nuget pack ContentFilesExample.nuspec 生成了Nuget 包,并使用Nuget 包资源管理器打开它

太棒了,我的照片和预期的一样。

现在是最后的非工作步骤。我在我的 .NET Core 2.1 项目中安装了这个 Nuget 包,但图像丢失了。在我的项目的根目录中,obj 文件夹和 bin 文件夹中都没有图像的痕迹。

我尝试关闭并重新打开 Visual Studio,如某处某些 cmets 中所述,但这并没有解决问题。

我也尝试将我的 .NET Core 项目样式更改为 PackageReference 但同样,这并没有解决问题

<Project Sdk="Microsoft.NET.Sdk">

    <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp2.1</TargetFramework>
        <RestoreProjectStyle>PackageReference</RestoreProjectStyle>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="ContentFilesExample" Version="1.0.0" />
    </ItemGroup>

    <ItemGroup>
        <None Update="appsettings.json">
            <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        </None>
    </ItemGroup>

</Project>

那我做错了什么? .NET Core 真的支持 Nuget 包中的内容文件吗?

谢谢

【问题讨论】:

标签: c# .net-core nuget nuget-package


【解决方案1】:

nupkg 应该有contentFiles/ 目录:

安装到netcore项目:

在消费项目中它不会是一个松散的文件,当你构建项目时它将是一个EmbeddedResource

【讨论】:

  • 哇,好消息,这是你今天为我解决的第二个 Nuget 问题。为你喝彩!我将再次与contentFilesContent 一起玩我想我将要做的下一个Nuget 包。很高兴我终于可以让这个黑魔法发挥作用(我的问题是我实际上忘记创建一个contentFiles windows 文件夹,因此包中缺少这个目录)
【解决方案2】:

经过数小时的谷歌搜索后,我最终解决了这个问题,因此我决定写另一个答案以使事情变得清晰因为 MS 文档很烂

  1. .nuspec 文件中的&lt;files&gt; 元素用于packer。它告诉 nuget 要 pack 哪些文件(如果 nuspec 中没有 &lt;files&gt; 元素 - nuget 将使用目录命名约定)
  2. &lt;contentFiles&gt; 元素用于消费者 - 它告诉提取文件的方式和时间。
  3. 如果您希望文件在安装后出现在您的项目中 - 您必须 pack 使用 target 表示 contentFiles/any/any 其中“any/any”部分告诉 nuget 它适用于 ANY语言和任何框架。
  4. (可选)如果您希望此文件在使用 packages.config 的旧 nuget 模式下工作 - 您必须再次打包它,第二次,这次 - 到“内容”文件夹,所以老用户仍然可以使用它。

nuspec

  <metadata>
   ...
    <contentFiles>
      <files include="**/myfile.cs" />
    </contentFiles>
  </metadata>
  <files>
      <file src="myfile.cs" target="contentFiles\any\any" /> <!-- this is for new format -->
      <file src="myfile.cs" target="content" /> <!-- this is for the old format -->
  </files>

附言。更多细节在我的博文here

【讨论】:

    【解决方案3】:

    对我来说,contentFiles 不适用于 ProjectReferenes。我需要将我自己的 c++ dll 与 c# 代理一起使用。对于 packages.config 和 PackageReferences 的通用 nuget,我接下来做了:

    1. c++ dll 和 MyCompany.MyDep.CppClient.targets 已添加到 nuget 数据包项目中:

      • CppClient(解决方案目录)
      • CppClient (c# 代理项目目录)
        • lib\mycpp.dll (c++ dll)
        • MyCompany.MyDep.CppClient.targets
        • CppClient .csproj
        • ...
      • CppClient .sln.
    2. 向 CppClient.csproj 添加了下一个声明:

      -- 这适用于 packages.config 项目 总是 真的 内容\$(目标框架) -- 这适用于 ProjectReferenes 项目 - dll 总是 真的 构建\$(目标框架) -- 这也适用于 ProjectReferenes 项目 - 复制 dll 的目标 总是 真的 构建\$(目标框架)
    3. MyCompany.MyDep.CppClient.targets 是:

      %(RecursiveDir)%(文件名)%(扩展名) 保留最新
    4. 从 CppClient(解决方案目录)运行命令 dotnet pack CppClient -c Release --output ./package /p:Version=1.0.0 /p:PackageID=MyCompany.MyDep.CppClient

    5. MyCompany.MyDep.CppClient.1.0.0.nupkg 具有下一个结构:

      • MyCompany.MyDep.CppClient.1.0.0
        • 构建\架构
          • MyCompany.MyDep.CppClient.targets
          • mycpp.dll
        • 内容\拱
          • mycppdll
        • lib\arch
          • CppClient.dll
        • ...

    MyCompany.MyDep.CppClient.1.0.0.nupkg 可以安装到具有两种类型的 nuget 包管理的项目中。 对于带有 packages.config 的项目,在 nuget 包中 content 目录的神奇部分,在将 NUGET 包安装到项目后,它的所有内容都将被复制到目标项目文件夹。然后它应该被复制到最终的 bin 目录以便在运行时下载(你应该自己做)。 对于带有 ProjectReferenes 的项目,build\arch\MyCompany.MyDep.CppClient.targets 的魔法副本 build\arch\mycpp.dll 不是在您安装 nuget 包之后立即生效,而是在何时目标项目已经建成。安装 nuget 包后,mycpp.dll 不会复制到目标项目源目录。它将包含在目标项目的引用 nuget 中,并在构建目标项目后直接复制到二进制的输出目录。

    【讨论】:

      猜你喜欢
      • 2021-07-11
      • 2013-02-03
      • 1970-01-01
      • 2019-08-12
      • 2020-11-07
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多