你如何将Nuget包复制文件复制到DotNet核心项目中?

时间:2017-08-02 00:23:13

标签: asp.net-core nuget

我正在尝试创建一个将某些文件复制到应用程序的wwwroot文件夹中的Nuget包,但我似乎无法阅读文档并在线查看其他问题。 。这是我到目前为止所拥有的。

<?xml version="1.0"?>
<package >
  <metadata>
    <id>...</id>
    <version>...</version>
    <title>...</title>
    <authors>...</authors>
    <requireLicenseAcceptance>...</requireLicenseAcceptance>
    <description>...</description>
    <contentFiles>
      <files include="**/*.*" copyToOutput="true" buildAction="EmbeddedResource" />
    </contentFiles>
  </metadata>
  <files>
    <file src="ProjectName\bin\Release\**.dll" target="lib" />
    <file src="ProjectName\wwwroot\**.*" target="content\wwwroot" />
    <file src="ProjectName\wwwroot\**.*" target="contentFile\any\any\wwwroot" />
  </files>
</package>

它将文件按预期放入Nuget包的content和contentFile文件夹中,但在引用时如果不将文件复制到项目中。

2 个答案:

答案 0 :(得分:0)

不支持将文件复制到项目的源目录中,对于经典项目而言,这是一种沮丧的做法。

但是,contentFiles部分旨在将文件逻辑地包含到项目中,以便它们可以影响构建的输出。 buildAction="Content"会将文件添加到构建和发布输出中。这允许在不修改源的情况下向项目添加内容。

答案 1 :(得分:0)

因此,在检查建议的链接和互联网的其余部分之后,这是我提出的解决方案。

public static class ApplicationBuilderExtensions
{
    public static IApplicationBuilder UseMyApp(this IApplicationBuilder app) => UseMyApp(app, null);

    public static IApplicationBuilder UseMyApp(this IApplicationBuilder app, Action<Options> setupOptions)
    {
        var options = new Options();
        setupOptions?.Invoke(options);

        app.UseStaticFiles(new StaticFileOptions
        {
            RequestPath = $"/{options.RoutePrefix}",
            FileProvider = new EmbeddedFileProvider(Assembly.Load(new AssemblyName("MyAssembly")), "MyAssembly.EmbeddedResourcesFolder")
        });

        return app;
    }

    public class Options
    {
        internal Options() { }

        public string RoutePrefix { get; set; } = "defaultRoutePrefix";
    }
}

然后,在您的html中,您可以通过执行类似的操作来引用静态文件。

<link rel="stylesheet" href="~/routePrefix/fileName.extension" />

从技术上讲,这不是我所提出的问题的答案,但现在我很清楚,我要求做的不是最佳做法 - 这是一个更好的方法。