如何设置NuGet包以将内容文件复制到输出构建目录? [英] How to setup a NuGet package to copy content files to output build directory?

查看:721
本文介绍了如何设置NuGet包以将内容文件复制到输出构建目录?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


注意::来自此问题(现已关闭),因为范围太广,并且该问题的第一部分涉及.dll,这是一个单独的问题。

NOTE: follow up from this question (now closed), as that one was too broad in scope, and the first part of that question, regarding .dlls, has been resolved, and this is a separate issue.

我正在研究称为 ComputeSharp 的.NET Standard 2.0项目,我想将其发布为NuGet程序包,但我不知道该怎么做程序包将内容文件复制到使用它的项目的输出构建目录中。一些信息:

I'm working on a .NET Standard 2.0 project called ComputeSharp that I'd like to publish as a NuGet package, but I can't figure out how to have the package copy a content file to the output build directory of a project using it. Some info:


  • 该项目仅针对.NET Standard 2.0

  • 该项目使用2个引用的项目在同一个解决方案中,每个都使用其他一些NuGet软件包。 这里是我当前解决方案的屏幕。

  • 我的 .nuspec 在主项目 ComputeSharp 的文件夹中,并具有以下结构:

  • The project only targets .NET Standard 2.0
  • The project uses 2 referenced projects in the same solution, each using some other NuGet packages. Here is a screen of my current solution.
  • My .nuspec is in the folder of the main project, ComputeSharp, and has the following structure:
<?xml version="1.0"?>
<package >
  <metadata>
    <id>ComputeSharp</id>
    ...
    <dependencies>
      <dependency id="SharpDX.Direct3D12" version="4.2.1-beta0-gab36f12303" />
      ...
    </dependencies>
    <contentFiles>
      <files include="..\ComputeSharp.Shaders\Renderer\Templates\*.mustache" buildAction="Content" copyToOutput="true" />
    </contentFiles>
  </metadata>
</package>




  • 为了创建NuGet程序包,我首先构建 ComputeSharp 在发布模式下,然后在该项目的文件夹中打开一个cmd,然后运行:

    • In order to create the NuGet package, I first build ComputeSharp in Release mode, then open a cmd in the folder for that project, and run:
    • nuget pack ComputeSharp.csproj -Prop Configuration=Release -IncludeReferencedProjects
      




      • 生成的NuGet软件包在检查时看起来像这样(看起来很好,因为我看到 .mustache 文件存在于其中包中正确的文件夹结构,在目录目录下):

        • The resulting NuGet package, when inspected, looks like this (which looks perfectly fine, as I can see the .mustache file being present in the right folder structure in the package, under the "content" directory):
        • ComputeSharp.x.x.x.nupkg
          ├───rels
          │   └───...
          ├───content
          │   └───Renderer
          │       └───Templates
          │           └───ShaderTemplate.mustache
          ├───lib
          │   └───netstandard2.0
          │       ├───ComputeSharp.dll
          │       ├───ComputeSharp.Graphics.dll
          │       └───ComputeSharp.Shaders.dll
          ├───package
          │   └───...
          ├───[Content_Types].xml
          └───ComputeSharp.nuspec
          




          问题:创建测试项目并安装NuGet软件包后,就可以很好地构建它,但是整个 Renderer\Templates\ShaderTemplate。胡子树未复制到构建目录中,因此我的lib无法加载该文件(因为它相对于lib程序集的路径已加载)。

          PROBLEM: once I create a test project and install the NuGet package, I can build it just fine, but the whole Renderer\Templates\ShaderTemplate.mustache tree is not copied in the build directory, so as a result my lib can't load that file (as it's loaded relative to the path of the lib assembly).

          我已经阅读了无数SO问题和文档,并在这里尝试了很多组合(例如设置 ContentType = None 而不是 Content ,但结果始终相同: .mustache 文件存在于软件包中,但不会使用该文件复制到项目的build目录中。当构建一个项目时,我还需要做些什么才能让NuGet软件包在输出目录中重新创建该树+文件?

          I've read countless SO questions as well as the docs, and tried a bunch of combinations here (eg. setting ContentType="None" instead of "Content", but the result is always the same: the .mustache file is present in the package but it's not copied to the build directory of the project using it. Is there something else I need to do to just have the NuGet package recreate that tree + file in the output directory, when a project is built?

          感谢您的帮助!

          推荐答案

          我建议通过构建动作嵌入式资源将所需的文件嵌入到程序集中。这样,您不必依靠Nuget来安装它们。相反,在首次使用时,您可以从程序集中读取它们并将它们复制到文件系统中或直接使用它们。以下是从程序集中读取嵌入式文件并将其复制到文件系统中的方法:

          I suggest embedding the files you need in the assembly with build action "Embedded resource". That way you don't have to rely on Nuget to install them. Instead, upon first usage, you can read them from the assembly and copy them into the file system or directly consume them. Here is how to read an embedded file from the assembly and copy it into the file system:

          private void CopyEmbeddedResourceToFile(Assembly assembly, string resourceName, string filePath)
          {
                  var key = GetResourceKey(assembly, resourceName);
                  using (Stream stream = assembly.GetManifestResourceStream(key))
                  using (var file = new FileStream(filePath, FileMode.Create))
                  {
                      if (stream == null)
                          throw new ArgumentException($"Resource name '{resourceName}' not found!");
                      stream.CopyTo(file);
                  }
          }
          

          这篇关于如何设置NuGet包以将内容文件复制到输出构建目录?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆