繁体   English   中英

如何设置NuGet包以将内容文件复制到输出构建目录?

[英]How to setup a NuGet package to copy content files to output build directory?

注意:由于该问题的范围太广, 因此对该问题 (现已结束)进行了跟进,并且该问题的第一部分有关.dll的问题已解决,这是一个单独的问题。

我正在开发一个名为ComputeSharp.NET Standard 2.0项目 ,我想将其发布为NuGet程序包,但我不知道如何让程序包使用以下命令将内容文件复制到项目的输出生成目录中:它。 一些信息:

  • 该项目仅针对.NET Standard 2.0
  • 该项目在同一解决方案中使用2个引用的项目,每个项目都使用其他一些NuGet软件包。 是我当前解决方案的屏幕。
  • 我的.nuspec位于主项目ComputeSharp的文件夹中,并具有以下结构:
<?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包,我首先在Release模式下构建ComputeSharp ,然后在该项目的文件夹中打开一个cmd,然后运行:
nuget pack ComputeSharp.csproj -Prop Configuration=Release -IncludeReferencedProjects
  • 生成的NuGet包在检查时看起来像这样(看起来非常好,因为我可以看到包中正确的文件夹结构中“目录”目录下的.mustache文件):
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.mustache树都没有复制到构建目录中,因此我的lib无法加载该文件(因为它是相对于lib程序集的路径加载的)。

我已经阅读了无数SO问题以及文档,并在这里尝试了很多组合(例如,设置ContentType="None"而不是"Content" ,但结果始终相同: .mustache文件存在于程序包,但不会使用该程序包复制到项目的构建目录中。构建项目时,我还需要做一些其他事情来使NuGet程序包在输出目录中重新创建该树+文件吗?

谢谢您的帮助!

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

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);
        }
}

您要使用contentFiles文件夹而不是content 请参阅此博客NuGet ContentFiles Demystified

您还可以阅读使用PackageReference启用对“内容”文件夹的支持,以解释为何content文件夹不能与PackageReference

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM