[英]How to setup a NuGet package to copy content files to output build directory?
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.
注意:由于该问题的范围太广, 因此对该问题 (现已结束)进行了跟进,并且该问题的第一部分有关.dll的问题已解决,这是一个单独的问题。
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. 我正在开发一个名为ComputeSharp的.NET Standard 2.0项目 ,我想将其发布为NuGet程序包,但我不知道如何让程序包使用以下命令将内容文件复制到项目的输出生成目录中:它。 Some info:
一些信息:
.nuspec
is in the folder of the main project, ComputeSharp
, and has the following structure: .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>
ComputeSharp
in Release mode, then open a cmd in the folder for that project, and run: ComputeSharp
,然后在该项目的文件夹中打开一个cmd,然后运行: nuget pack ComputeSharp.csproj -Prop Configuration=Release -IncludeReferencedProjects
.mustache
file being present in the right folder structure in the package, under the "content" directory): .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
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).问题 :一旦我创建了一个测试项目并安装了NuGet软件包,就可以很好地构建它,但是整个
Renderer\\Templates\\ShaderTemplate.mustache
树都没有复制到构建目录中,因此我的lib无法加载该文件(因为它是相对于lib程序集的路径加载的)。
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? 我已经阅读了无数SO问题以及文档,并在这里尝试了很多组合(例如,设置
ContentType="None"
而不是"Content"
,但结果始终相同: .mustache
文件存在于程序包,但不会使用该程序包复制到项目的构建目录中。构建项目时,我还需要做一些其他事情来使NuGet程序包在输出目录中重新创建该树+文件吗?
Thank you for your help! 谢谢您的帮助!
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.
这样,您不必依靠Nuget来安装它们。 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);
}
}
You want to use the contentFiles
folder and not content
. 您要使用
contentFiles
文件夹而不是content
。 See this blog NuGet ContentFiles Demystified . 请参阅此博客NuGet ContentFiles Demystified 。
You can also read Enable support for 'content' folder with PackageReference that explains why the content
folder doesn't work with PackageReference
. 您还可以阅读使用PackageReference启用对“内容”文件夹的支持,以解释为何
content
文件夹不能与PackageReference
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.