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
,并且在调试它时可用 一个简单的选择是:
“出版选项”:{
“包括”:[
“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%" ]
}