【问题标题】:ASP.NET 5 keeping the wwwroot 'clean'ASP.NET 5 保持 wwwroot '干净'
【发布时间】:2015-12-20 17:39:51
【问题描述】:

我正在开发一个网站,我使用 ASP.NET 5 CLR (rc1-final x64)。 我想让我的 wwwroot 文件夹“干净”。我觉得应该在 wwwroot 中存在的所有内容都应该在构建时或通过任务添加(例如通过 Grunt)。我为此使用了 Grunt,它适用于 JavaScript 和 CSS 文件。

现在我正在向我的网站添加图片。现在我的 .gitignore 说要排除 wwwroot。我不知道如何将图像从 wwwroot 外部移动到其中。有什么好方法可以将文件移动到 wwwroot 吗?我真的希望我的 wwwroot '干净' 没有任何库。我在 wwwroot 之外有这些文件,所以我不会意外提供不需要的文件。

我想将它们从: [应用程序根目录]/static/imgwwwroot/img

目前我有以下繁重的任务:

  • grunt-contrib-concat
  • grunt-contrib-cssmin
  • grunt-contrib-uglify

我认为这可能非常低效,因为在构建时我们每次都需要移动所有文件。

有什么方法可以更好/更有效地做到这一点?

编辑#1: 是的,所以我阅读了文档:http://docs.asp.net/en/latest/fundamentals/static-files.html。 我实际上可以像这样将参数传递给app.UseStaticFiles() 方法:

app.UseStaticFiles(new StaticFileOptions
    {
        FileProvider = new PhysicalFileProvider(@"D:\Source\WebApplication1\src\WebApplication1\MyStaticFiles"),
        RequestPath = new PathString("/StaticFiles")
    });

这里的PhysicalFileProvider 包含绝对路径。这里可以使用相对路径吗?

编辑#2: 实际上这有效:

public void Configure(IApplicationBuilder app, IHostingEnvironment environment, ILoggerFactory loggerFactory, IApplicationEnvironment appEnvironment)
{
    app.UseIISPlatformHandler();
    app.UseDeveloperExceptionPage();

    app.UseMvcWithDefaultRoute()
        .UseStaticFiles()
        .UseStaticFiles(new StaticFileOptions
        {
            FileProvider = new PhysicalFileProvider(string.Concat(appEnvironment.ApplicationBasePath,"/static/images")),
            RequestPath = new PathString("/img")
        });
}

这里我们添加了两次UseStaticFiles 中间件以提供默认值,即 wwwroot。我们还将在图像所在的解决方案中提供文件。

但是,不知道两次添加这个中间件会不会出现性能或安全问题或其他问题。您需要小心添加到此文件夹中的内容。至少应该不启用目录浏览。

【问题讨论】:

  • 只是好奇,为什么 wwwroot 不是源代码控制的,为什么不将图像放在 wwwroot 中?这些图片是静态的还是动态的(如产品图片等)?
  • 那是因为我在 wwwroot 中有合并和缩小的文件(CSS 和 JavaScript)。我将所有源文件保存在 wwwroot 之外。是的,这些图片是静态的。
  • 我们的场景和你一样。我们的 wwwroot 中有我们的组合和 ugly 样式表和脚本,但我们从不提交缩小和连接的脚本。有一个适当的限制,这样开发人员就不会意外地提交它们。脚本在构建服务器上被缩小和连接。优化图像也是如此。这对我们来说已经足够“干净”了。我并不是说这是推荐的方法。我要说的是,当存在简单的解决方案时,有时我们往往会使事情过于复杂。
  • 好的。有什么限制?它在单片机中吗?你的静态图像在哪里?此外,我在问题的编辑 (2) 中添加了一个可能的解决方案。
  • 限制在源代码控制中,并通过gitsvn 中的服务器端挂钩。静态图片在wwwroot

标签: asp.net asp.net-core


【解决方案1】:

您确定要保持 wwwroot“干净”吗?

您不能轻易引用 wwwroot 之外的静态内容,因此将静态文件保留在 wwwroot 下面并将它们分离到开发与生产的子文件夹中,然后只使用 project.json 中的 publishexclude 来省略不是更有意义吗开发的东西。

我自己,我只想在发布之前运行 grunt 任务以生成生产文件集,然后我想不发布文件的开发版本。我不想运行 grunt 只是为了移动文件,这样我就可以在开发过程中使用它们,我不想每次编辑我的 js 文件的 dev/src 版本时都运行 grunt。

如果你引入 ckeditor 之类的东西,这种方法的问题会变得更加明显,这是我不想在文件系统中复制或移动太多的大量文件,最多我会移动它们一次 pre-发布以在我将其移动到生产文件夹时清除任何多余的文件。

在 MVC 5 中,没有将静态文件与代码分开的概念,Web 应用程序只是从同样具有服务器端代码的同一根应用程序目录中提供文件。当时在 /Content 文件夹中放置静态文件或在其他文件夹中放置 js 是有意义的。但在我看来,试图在 MVC6/aspnet5 中将静态资产保留在 wwwroot 之外似乎是在违背木纹。

通过将所有静态资产(包括它们的开发版本)保留在 wwwroot 之下,我有一个简单的工作流程,我可以在其中编辑一个 js 文件并刷新页面 as discussed in this question。这感觉就像我在使用框架而不是反对它。

【讨论】:

  • 我完全明白你的意思。现在我也明白了为什么他们选择将 bower 和 node 模块从 wwwroot 的外部移动到内部。每次我想更改我的 CSS 或 JavaScript 文件中的某些内容时,我都需要运行 grunt。这实际上是我不想做的事情。正如您所说,我想在发布时运行它们。我想在源代码管理方面,我们需要从 wwwroot 中排除一些文件夹,例如:node_modules、生成的文件、bower_components 等。我目前正在使用 Git,我想我只需将这些文件夹添加到我的 .gitignore ?您如何处理这些问题?
  • 是的,确切地说,在我的项目中,我使用 gitignore 来排除来自 npm/bower 的开发内容。我把我的自定义开发 js 东西放在另一个我确实想进入 repo 的文件夹中。我还从 gitignore 中排除了我的生产 js 文件夹,因为这是处理事情的地方。我使用 project.json 中的 publishexclude 来确保只发布生产内容。所以所有这些都在 wwwroot 之下,但被组织到子文件夹中。
  • 您还在使用这种方法还是找到了更好的选择?听起来您有wwwroot\dev\node_modules 并直接引用静态内容,因此您不需要每次都复制?因此,当您发布文件夹结构更改时,您可能需要更新任何引用?或者您是否保持相同的文件夹结构,例如排除所有node_modules,除了您需要的特定文件/文件夹?
  • 在 vs 项目模板中的 .bowerrc 文件指向 wwwroot/lib,就像 bower_components 的别名一样,因此我将其从 git 和发布输出中排除,但在开发期间使用指向该内容的直接链接并将其处理成wwwroot/js 用于生产。我目前没有使用 node_modules,但如果我使用相同的方式,它将是 wwwroot/node_modules,我会将其从 git 和发布中排除,并将我需要的内容从那里处理到 wwwroot/js。并不是说这是唯一的好方法,但对我来说很有意义
  • @NelsonRothermel 刚刚尝试了他们将 node_modules 保存在 wwwroot 之外的 spa 示例,并将所有源代码放在外面,并且只使用 webpack 处理文件。他们在源代码/打字稿所在的 wwwroot 之外也有一个 ClientApp 文件夹。所以也许另一种方法更适合 spa,但我的旧方法对 mvc 来说似乎还可以,并不是真正的对错只是取决于有多少客户端代码和个人喜好
猜你喜欢
  • 2010-09-16
  • 2016-03-24
  • 2010-10-09
  • 2017-04-14
  • 2010-10-16
  • 1970-01-01
  • 2014-11-23
  • 2012-06-29
  • 1970-01-01
相关资源
最近更新 更多