Asp.net core 使用ASP.NET核心从“project.json”中的发布中排除未缩小的文件

Asp.net core 使用ASP.NET核心从“project.json”中的发布中排除未缩小的文件,asp.net-core,publish,Asp.net Core,Publish,我正在尝试为project.json(ASP.NET Core 1.0/Full Framework)中的publishOptions找到适当的配置,以便不发布非精简文件 官方文件没有多大帮助: 搜索全局模式,并找到一些带有gulp示例的artilcles,我想出了这个wwwroot/js/***!(*.min.js),但它似乎不起作用 我的语法错了吗?或者,只是project.json和dotnet publish不支持这种语法 "publishOptions": { "include

我正在尝试为
project.json
(ASP.NET Core 1.0/Full Framework)中的
publishOptions
找到适当的配置,以便不发布非精简文件

官方文件没有多大帮助:

搜索全局模式,并找到一些带有
gulp
示例的artilcles,我想出了这个
wwwroot/js/***!(*.min.js)
,但它似乎不起作用

我的语法错了吗?或者,只是
project.json
dotnet publish
不支持这种语法

"publishOptions": {
    "include": [
        "wwwroot",
        "Views",
        "Areas/**/Views",
        "appsettings.json",
        "web.config"
    ],
    "exclude": [
        "wwwroot/lib",
        "wwwroot/js/**/*!(*.min.js)",
        "wwwroot/css/*.less",
        "wwwroot/_references.js"
    ],
    "includeFiles": [],
    "excludeFiles": []
},

JavaScript文件/库管理的典型工作流是使用gulp或grunt任务将必要的文件复制到
wwwroot
文件夹中,这可能发生在某些事件(预构建、后构建、项目打开、清理)上

在最新的工具中,默认的MVC不再包含gulpfile.js,因为最常见的用法是缩小和绑定js文件,即使没有使用外部库,因此gulp对新用户来说可能有点难以承受

但当您在解决方案资源管理器中右键单击
bundleconfig.json
文件并选择“Bundler&Minifier”>“Convert to Gulp”时,它可以很容易地恢复

这将在项目的根目录中创建
gulpfile.js
package.json
(nodejs依赖项),并将npm文件夹添加到解决方案资源管理器的“依赖项”部分。当您在Windows资源管理器中观看时,您将在项目根文件夹中看到一个
node\u modules
文件夹。npm将在那里下载所有软件包及其依赖项

生成的
gulpfile.js
如下所示,并且有一些预定义的任务。我不会将此文件用作示例,因为它强烈地基于
bundleconfig.json
及其结构,并使用我的
gulpfile.json
,它过去与旧模板一起提供

"use strict";

var gulp = require("gulp"),
    rimraf = require("rimraf"),
    concat = require("gulp-concat"),
    cssmin = require("gulp-cssmin"),
    uglify = require("gulp-uglify");

var webroot = "./wwwroot/";

var paths = {
    app: webroot + "app/",
    libs: webroot + "lib/",
    js: webroot + "js/**/*.js",
    minJs: webroot + "js/**/*.min.js",
    css: webroot + "css/**/*.css",
    minCss: webroot + "css/**/*.min.css",
    concatJsDest: webroot + "js/app.min.js",
    concatCssDest: webroot + "css/app.min.css"
};

gulp.task("clean:js", function (cb) {
    rimraf(paths.concatJsDest, cb);
});

gulp.task("clean:libs", function (cb) {
    rimraf(paths.libs, cb);
});

gulp.task("clean:css", function (cb) {
    rimraf(paths.concatCssDest, cb);
});

gulp.task("clean", ["clean:js", "clean:css", "clean:libs"]);

gulp.task("min:js", function () {
    return gulp.src([paths.js, "!" + paths.minJs], { base: "." })
        .pipe(concat(paths.concatJsDest))
        .pipe(uglify())
        .pipe(gulp.dest("."));
});

gulp.task("min:css", function () {
    return gulp.src([paths.css, "!" + paths.minCss])
        .pipe(concat(paths.concatCssDest))
        .pipe(cssmin())
        .pipe(gulp.dest("."));
});

gulp.task("min", ["min:js", "min:css"]);

gulp.task("libs", function (cb) {
    gulp.src([
        'bootstrap/**/*.js',
        'bootstrap/**/*.css',
        'jquery/**/*.js`, // we can also limit this to `jquery/dist/**/*.js to only include distribution files
        'jquery/**/*.css'
    ], {
        cwd: "node_modules/**"
    })
    .pipe(gulp.dest(paths.libs));
});

gulp.task("app", function (cb) {
    gulp.src([
        'app/**.js'
    ])
    .pipe(gulp.dest(paths.app));
});

gulp.task("default", ['clean', 'libs']);
它看起来比实际情况更复杂。有几个小型任务(
min:js
min:css
)和一个普通小型任务
min
,它们只是按顺序运行所有其他任务

wwwroot
删除输出文件的清除任务。从模板转换时,它只删除默认的
wwwroot/js/site.min.js
文件

由于默认模板中没有使用javascript库,除了
wwwroot/lib
文件夹中的内容之外,包不会以这种方式处理

因此,您可能希望的第一件事是从npm获取引导和jquery,而不是模板提供的静态版本。因此,我们将依赖项添加到
package.json

{
  "name": "app",
  "version": "0.0.0",
  "private": true,
  "dependencies": {
    "bootstrap": "3.3.6",
    "jquery": "2.2.0"
  },
  "devDependencies": {
    "gulp": "3.8.11",
    "gulp-concat": "2.5.2",
    "gulp-cssmin": "0.1.7",
    "gulp-uglify": "1.2.0",
    "rimraf": "2.2.8"
  }
}
例如,上面
gulpfile.js
中的
libs
任务将把包的所有必需文件复制到
wwwroot
。我说是必需的,因为在包中经常有用于调试和其他工作的未绑定文件,我们通常不希望在
wwwroot
中使用这些文件(它们可能会变得很大)

它将在
node_modules
文件夹中的引导文件夹中查找所有
*.js
*.css
文件,并将它们复制到
path.libs
,该文件夹配置为
wwwroot/lib/

app
任务对我们自己的代码执行相同的操作<代码>清除清除文件夹和(即从调试切换到发布版本之前或发布之前)

最后,您可以将任务绑定到某些VS事件。您需要打开“任务运行器资源管理器”视图(视图>其他窗口>任务运行器资源管理器)。在这里,您可以选择一个任务并右键单击它,然后“绑定”并选择其中一个绑定(构建前、构建后、清理、Projct打开)。它们很能自我解释,“干净”的意思是当你做“构建>干净的解决方案”时

现在是出版部分。发布应用程序时,可以运行某些命令(通过dotnet或visualstudio)

project.json
中有一个脚本部分

"scripts": {
  "prepublish": [ "npm install", "bower install", "gulp clean", "gulp min", "gulp libs" ],
  "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
}
每个条目“prepublish”都是一个要执行的命令。在本例中,在发布开始之前,将首先执行
npm安装
,以恢复所有
npm
依赖项。然后
bower install
安装由bower管理的依赖项(如果不使用bower,请将其删除,并通过npm执行所有操作)

接下来的三个命令很有趣,它们将执行gulp任务。我们还可以通过添加“发布”任务来简化此过程

这将把发布所需的所有文件复制到wwwroot文件夹中,发布文件,然后调用“postpublish”脚本

这是一个粗略的介绍。它有一个学习曲线,但是一旦你让它工作起来,它就会改变整个工作流程


这里没有介绍的是添加一个
watch
任务,它可以查看某个文件夹(我通常使用项目根目录中的
app
文件夹),当那里的任何文件发生更改时,运行
app
任务,这样我们的代码就会被缩小并复制到
wwwroot
,并且在调试它时可用

一个简单的选择是:

  • 将未统一的源重命名为*.debug.js和*.debug.css

  • 它们现在更容易排除:

  • 
    “出版选项”:{
    “包括”:[
    “wwwroot”
    ],
    “排除”:[
    “wwwroot/***.debug.*”
    ]
    }
    

    IMHO未显示的源应突出并看起来异常。它更值得使用一个文件名,而不是精简代码


    这还使生成输出文件与.Net生成配置的其余部分保持一致。它清楚地表明,您的调试版本可能包含额外的日志记录和调试实用程序,而不是用于生产。

    无论如何,您不应该首先将它们放在那里,而应该使用gulp来清除日志记录和调试实用程序
    "scripts": {
      "prepublish": [ "npm install", "bower install", "gulp clean", "gulp min", "gulp libs" ],
      "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
    }
    
    gulp.task("publish", ['clean', 'libs', 'min']);
    
    "scripts": {
      "prepublish": [ "npm install", "bower install", "gulp publish" ],
      "postpublish": [ "dotnet publish-iis --publish-folder %publish:OutputPath% --framework %publish:FullTargetFramework%" ]
    }