Як використовувати npm з ASP.NET Core


118

Я використовую npm для управління jQuery, Bootstrap, Awesome Font Awesome та подібними клієнтськими бібліотеками, які мені потрібні для моєї програми ASP.NET Core.

Підхід, який працював для мене, розпочався із додавання файлу package.json до проекту, який виглядає приблизно так:

{
    "version": "1.0.0",
    "name": "myapp",
    "private": true,
    "devDependencies": {
  },
  "dependencies": {
    "bootstrap": "^3.3.6",
    "font-awesome": "^4.6.1",
    "jquery": "^2.2.3"
  }
}

npm відновлює ці пакети в папку node_modules, яка знаходиться на тому ж рівні, що і wwwroot в каталозі проекту:

введіть тут опис зображення

Оскільки ASP.NET Core обслуговує статичні файли з папки wwwroot, а node_modules немає, мені довелося внести кілька змін, щоб зробити цю роботу, першу: додавання app.UseFileServer безпосередньо перед app.UseStaticFiles в моєму запуску. CS файл:

app.UseFileServer(new FileServerOptions()
{
    FileProvider = new PhysicalFileProvider(
        Path.Combine(Directory.GetCurrentDirectory(), @"node_modules")), 
    RequestPath = new PathString("/node_modules"),
    EnableDirectoryBrowsing = true
});

app.UseStaticFiles();

і другий, включаючи node_modules в моїх публікаціяхOpitions у файлі project.json:

"publishOptions": {
  "include": [
    "web.config",
    "wwwroot",
    "Views",
    "node_modules"
  ]
},

Це працює в моєму середовищі розробки, і він також працює, коли я розгортаю його до мого екземпляру служби Azure App, статичні файли jquery, bootstrap та приголомшливі шрифти добре обслуговуються, але я не впевнений у цій реалізації.

Який правильний підхід для цього?

Це рішення з’явилося після збору безлічі бітів інформації з декількох джерел та спробування деяких, які не спрацювали, і здається, що дивним чином потрібно подавати ці файли з-за wwwroot.

Будь-яка порада буде дуже вдячна.


Може бути корисним посилання: blog.nbellocam.me/2016/03/14/asp-net-core-and-angular-2
adem caglin

На цьому посиланні є робочий приклад на ASP.NET Core w / npm : ievangelistblog.wordpress.com/2016/01/13/…
Девід Пайн

2
Одне, що сталося для мене, - це використовувати Bundler and Minifier- Вкажіть джерело "Зовнішнє wwwroot", і коли ви будуєте, він створює JS в wwwroot. Це правильний спосіб .. Ви не повинні подавати вміст з node_modules
Piotr Kula

Я б дуже відштовхував когось від статичного обслуговування node_modulesпапки. а) так не розроблена екосистема; б) це загроза безпеці, один із встановлених пакетів може витікати конфіденційну інформацію. Правильний спосіб - налаштувати будівельний конвеєр (grunt / gulp / node / webpack), який публікує файли в папку srcабо whateverпапку, призначену для обслуговування статичних фронтальних файлів
CervEd

Відповіді:


45

Публікуючи всю свою node_modulesпапку, ви розгортаєте набагато більше файлів, ніж вам насправді знадобиться у виробництві.

Натомість використовуйте інструмент для запуску завдань як частину свого процесу збирання, щоб упакувати ті потрібні файли та розгорнути їх у свою wwwrootпапку. Це також дозволить одночасно концентрувати та мінімізувати свої активи, а не обслуговувати кожну окрему бібліотеку.

Потім ви також можете повністю видалити FileServerконфігурацію і покластися на неї UseStaticFiles.

В даний час gulp - це вибір, який виконують завдання VS. Додайте gulpfile.jsдо кореня свого проекту та налаштуйте його для обробки статичних файлів при публікації.

Наприклад, ви можете додати такий scriptsрозділ до свого project.json:

 "scripts": {
    "prepublish": [ "npm install", "bower install", "gulp clean", "gulp min" ]
  },

Який би працював із наступним gulpfile (за замовчуванням, коли ліси yo):

/// <binding Clean='clean'/>
"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 = {
    js: webroot + "js/**/*.js",
    minJs: webroot + "js/**/*.min.js",
    css: webroot + "css/**/*.css",
    minCss: webroot + "css/**/*.min.css",
    concatJsDest: webroot + "js/site.min.js",
    concatCssDest: webroot + "css/site.min.css"
};

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

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

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

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"]);

36
Я трохи розгублений, як це відповідь на запитання. Це майже саме те, що Microsoft має для налаштування Gulp тут ( docs.microsoft.com/en-us/aspnet/core/client-side/using-gulp ). Однак, наскільки я можу сказати, це не бере вміст з мого каталогу node_modules і не додає його до "lib" або робить його корисним для будь-якого з моїх файлів ... Я дуже новачок у цьому, настільки неймовірно переплутаному, здавалося б, неймовірно Складний новий світ веб-розробки ...
Джерард Вілкінсон

32
Ускладнено добре. Я готовий взагалі відмовитися від передового досвіду і просто працювати над API.
Люк Пуплетт

12
Це правильний підхід загалом, але відповідь залишає важливий крок: копіювання файлів із папки node_modules в папку wwwroot як завдання Gulp. Почніть з var nodeRoot = './node_modules/'; і додайте завдання, яке копіює потрібну папку з nodeRoot у відповідну підпапку webroot. Зараз немає часу на розробку, але якщо є інтерес, я можу додати деталі пізніше.
Дуг

32
Чому ніхто не поставив очевидного: "Чому ми повинні задавати це питання!" Чому ми навмисно встановлюємо файли там, де їх неможливо використовувати? Потім, оскільки наші файли недоступні, ми встановлюємо та налаштовуємо складну утиліту для копіювання їх у місце, де вони можуть бути використані. Це справді смішно.
Сем

8
Тому що інструментарій тут лайно, в основному. Використовувати npm - це просто використовувати npm, так само, як і для чого-небудь . Для ASP.NET Core немає нічого конкретного. Все входить, node_modulesтому що це робить npm. Завдання gulp необхідне для переміщення речей у потрібне місце, тобто там, де вони вам справді потрібні. Я думаю, що проблема полягає в тому, що Microsoft забезпечила таку прекрасну інтеграцію з Bower, але зараз Bower мертва (або, принаймні, вмирає), а Microsoft не надала жодного альтернативного інструментарію.
Кріс Пратт

41

введіть тут опис зображення

  • Використання npmдля управління клієнтськими бібліотеками - хороший вибір (на відміну від Bower або NuGet), ви думаєте в правильному напрямку :)
  • Розбити проекти на стороні сервера (ASP.NET Core) та на стороні клієнта (наприклад, Angular 2, Ember, React) в окремі папки (інакше ваш проект ASP.NET може мати багато шуму - тестові одиниці для коду на стороні клієнта, node_modules папка, збирати артефакти тощо). Професійні розробники, що працюють в одній команді з вами, вдячні вам за це :)
  • Відновіть npm-модулі на рівні рішення (подібно до того, як ви відновлюєте пакети через NuGet - не в папку проекту), таким чином ви можете мати тести для модулів та інтеграції в окремій папці (на відміну від тестів JavaScript на стороні клієнта всередині вашого Основний проект ASP.NET).
  • Використання може не знадобитися FileServer, оскільки StaticFilesповинно вистачити для обслуговування статичних файлів (.js, зображень тощо)
  • Використовуйте Webpack для з’єднання коду на стороні клієнта в один або кілька фрагментів (пакетів)
  • Можливо, вам не знадобиться Gulp / Grunt, якщо ви використовуєте пакет модулів, такий як Webpack
  • Пишіть сценарії автоматизації побудови в ES2015 + JavaScript (на відміну від Bash або PowerShell), вони працюватимуть міжплатформованими та будуть більш доступними для різноманітних веб-розробників (усі сьогодні говорять на JavaScript)
  • Перейменуйте wwwrootна public, інакше структура папки в Azure Web Apps буде заплутаною ( D:\Home\site\wwwroot\wwwrootпроти D:\Home\site\wwwroot\public)
  • Публікуйте лише зібраний вихід на веб-додатки Azure (ніколи не слід натискати node_modulesна сервер веб-хостингу). Дивіться tools/deploy.jsяк приклад.

Відвідайте ASP.NET Core Starter Kit на GitHub (відмова: я автор)


2
Приємна відповідь, кудо за вашу роботу з надання громаді стартерного набору!
Девід Пайн

7
На початку цього року я успішно створив величезну публічну програму Angular для великого бренду Великобританії, і все ж навіть не міг зрозуміти більшість цієї відповіді. Я навіть не можу почати вивчати це як його всюди. Буквально криза кар’єри.
Люк Пуплетт

Це хороший підсумок роботи Do і Dont під час написання та управління сценаріями та файлами на стороні клієнта. Врятував мій час та дослідження. Кудо вам!
Sangeeta

На жаль, Visual Studio (тупо IMHO) розглядає каталог "wwwroot" спеціально, базуючись лише на його імені, надаючи йому спеціальний значок "веб-корінь" у провіднику рішень і позначаючи його вміст за замовчуванням як "None", а не "Content" . Якщо ви маєте намір помістити туди файли, які обслуговуються статично, і ви використовуєте Visual Studio, ви, ймовірно, повинні залишити ім'я як "wwwroot". Я згоден, що це погана назва.
Їжак

27

Встановіть Bundler та Minifier у розширення Visual Studio

Потім ви створюєте a bundleconfig.jsonі вводите таке:

// Configure bundling and minification for the project.
// More info at https://go.microsoft.com/fwlink/?LinkId=808241
[
 {
    "outputFileName": "wwwroot/js/jquery.min.js",
    "inputFiles": [
      "node_modules/jquery/dist/jquery.js"
    ],
    // Optionally specify minification options
    "minify": {
      "enabled": true,
      "renameLocals": false
    },
    // Optionally generate .map file
    "sourceMap": false
  }
]

Таким чином, bundler і minifier (заснований на gulp) має доступ до вихідних файлів (які слід виключити з Visual Studio, а також виключити з GIT) і додає їх у wwwroot, як зазначено

лише побічний ефект кожного разу, коли ви його збережете, він запустить це (але ви можете встановити його для запуску вручну)


4
Після того, як побачив, що Bower мертвий, і я більше не можу оновлювати Bootstrap без переходу на NPM, мені здається, це мій улюблений підхід. Gulp або Webpack здаються непосильними порівняно з цим простим рішенням, яке вже є в останніх шаблонах проектів MVC. Дякую, що поділились!
Метт Сандерс

1
Як тут обробляються зображення, на які посилається css? Я зіткнувся з проблемою із зображеннями, які все ще знаходяться в папці node_modules, куди як css та js були переміщені до www. Будь-яка ідея, як це виправити?
ВПП

1
Це IDE-агностик? Як це буде працювати, якщо хтось із вашої команди використовує код VS і як це відтворюється на складі компакт-диска?
Якоб Стамм

Коли ви встановлюєте пакет Bundler та Minifier NuGet, документи говорять, що він вводить цілі складання, які працюють під час збирання та очищення. Я гадаю, що коли це буде на місці, воно буде добре працювати незалежно від того, який IDE використовується, правда? Дивіться більше: docs.microsoft.com/en-gb/aspnet/core/client-side/…
Ciaran Gallagher

Пакетник корисний лише для вказівки цих сценаріїв поза середовищем розробки. На моїй сторінці _Layout мені все одно доведеться вручну посилатися на потрібні мені файли JS та CSS, але папка node_modules знаходиться поза веб-сайтом ... тому я не думаю, що це вирішує проблему належним чином, вам все одно потрібен скрипт Gulp для копіювання над необхідними файлами в папку wwwroot.
Ciaran Gallagher

21

Я даю вам дві відповіді. npm у поєднанні з іншими інструментами є потужним, але вимагає певної роботи для налаштування. Якщо ви просто хочете завантажити деякі бібліотеки, ви можете замість цього використати Менеджер бібліотек (випущений у Visual Studio 15.8).

NPM (розширено)

Спочатку додайте package.json у корінь вашого проекту. Додайте наступний вміст:

{
  "version": "1.0.0",
  "name": "asp.net",
  "private": true,
  "devDependencies": {
    "gulp": "3.9.1",
    "del": "3.0.0"
  },
  "dependencies": {
    "jquery": "3.3.1",
    "jquery-validation": "1.17.0",
    "jquery-validation-unobtrusive": "3.2.10",
    "bootstrap": "3.3.7"
  }
}

Це змусить NPM завантажити Bootstrap, JQuery та інші бібліотеки, які використовуються в новому базовому проекті asp.net, у папку з назвою node_modules. Наступним кроком є ​​копіювання файлів у відповідне місце. Для цього ми будемо використовувати gulp, який також був завантажений NPM. Потім додайте новий файл у корінь вашого проекту під назвою gulpfile.js . Додайте наступний вміст:

/// <binding AfterBuild='default' Clean='clean' />
/*
This file is the main entry point for defining Gulp tasks and using Gulp plugins.
Click here to learn more. http://go.microsoft.com/fwlink/?LinkId=518007
*/

var gulp = require('gulp');
var del = require('del');

var nodeRoot = './node_modules/';
var targetPath = './wwwroot/lib/';

gulp.task('clean', function () {
    return del([targetPath + '/**/*']);
});

gulp.task('default', function () {
    gulp.src(nodeRoot + "bootstrap/dist/js/*").pipe(gulp.dest(targetPath + "/bootstrap/dist/js"));
    gulp.src(nodeRoot + "bootstrap/dist/css/*").pipe(gulp.dest(targetPath + "/bootstrap/dist/css"));
    gulp.src(nodeRoot + "bootstrap/dist/fonts/*").pipe(gulp.dest(targetPath + "/bootstrap/dist/fonts"));

    gulp.src(nodeRoot + "jquery/dist/jquery.js").pipe(gulp.dest(targetPath + "/jquery/dist"));
    gulp.src(nodeRoot + "jquery/dist/jquery.min.js").pipe(gulp.dest(targetPath + "/jquery/dist"));
    gulp.src(nodeRoot + "jquery/dist/jquery.min.map").pipe(gulp.dest(targetPath + "/jquery/dist"));

    gulp.src(nodeRoot + "jquery-validation/dist/*.js").pipe(gulp.dest(targetPath + "/jquery-validation/dist"));

    gulp.src(nodeRoot + "jquery-validation-unobtrusive/dist/*.js").pipe(gulp.dest(targetPath + "/jquery-validation-unobtrusive"));
});

Цей файл містить код JavaScript, який виконується під час збирання та очищення проекту. Це скопіює всі необхідні файли в lib2 ( не lib - ви можете легко змінити це ). Я використав таку ж структуру, що і в новому проекті, але змінити файли в інше місце легко. Якщо ви переміщуєте файли, переконайтеся, що ви також оновили _Layout.cshtml . Зауважте, що всі файли в каталозі lib2 будуть видалені після очищення проекту.

Якщо ви клацніть правою кнопкою миші на gulpfile.js , ви можете вибрати Explorer Runner Explorer . Звідси ви можете запустити глот вручну, щоб скопіювати чи очистити файли.

Gulp також може бути корисним для інших завдань, таких як мінімізація JavaScript та CSS-файлів:

https://docs.microsoft.com/en-us/aspnet/core/client-side/using-gulp?view=aspnetcore-2.1

Менеджер бібліотек (простий)

Клацніть правою кнопкою миші проект та виберіть Управління клієнтськими бібліотеками . Файл libman.json тепер відкритий. У цьому файлі ви вказуєте, яку бібліотеку та файли використовувати та де їх слід зберігати локально. Дійсно просто! Наступний файл копіює бібліотеки за замовчуванням, які використовуються при створенні нового проекту ASP.NET Core 2.1:

{
  "version": "1.0",
  "defaultProvider": "cdnjs",
  "libraries": [
    {
      "library": "jquery@3.3.1",
      "files": [ "jquery.js", "jquery.min.map", "jquery.min.js" ],
      "destination": "wwwroot/lib/jquery/dist/"
    },
    {
      "library": "jquery-validate@1.17.0",
      "files": [ "additional-methods.js", "additional-methods.min.js", "jquery.validate.js", "jquery.validate.min.js" ],
      "destination": "wwwroot/lib/jquery-validation/dist/"
    },
    {
      "library": "jquery-validation-unobtrusive@3.2.10",
      "files": [ "jquery.validate.unobtrusive.js", "jquery.validate.unobtrusive.min.js" ],
      "destination": "wwwroot/lib/jquery-validation-unobtrusive/"
    },
    {
      "library": "twitter-bootstrap@3.3.7",
      "files": [
        "css/bootstrap.css",
        "css/bootstrap.css.map",
        "css/bootstrap.min.css",
        "css/bootstrap.min.css.map",
        "css/bootstrap-theme.css",
        "css/bootstrap-theme.css.map",
        "css/bootstrap-theme.min.css",
        "css/bootstrap-theme.min.css.map",
        "fonts/glyphicons-halflings-regular.eot",
        "fonts/glyphicons-halflings-regular.svg",
        "fonts/glyphicons-halflings-regular.ttf",
        "fonts/glyphicons-halflings-regular.woff",
        "fonts/glyphicons-halflings-regular.woff2",
        "js/bootstrap.js",
        "js/bootstrap.min.js",
        "js/npm.js"
      ],
      "destination": "wwwroot/lib/bootstrap/dist"
    },
    {
      "library": "list.js@1.5.0",
      "files": [ "list.js", "list.min.js" ],
      "destination": "wwwroot/lib/listjs"
    }
  ]
}

Якщо ви переміщуєте файли, переконайтеся, що ви також оновили _Layout.cshtml .


2
Менеджер бібліотеки - ніколи про нього не чув, але саме це мені потрібно! Це має бути правильна відповідь.
codeMonkey

1
Щоб уникнути помилок глотка я повинен був змінити перший рядок завдання за замовчуванням в файлі , gulpfile.jsщоб gulp.task('default', function (done) {потім додати в якості останнього рядка в цій функції наступного: В done();іншому випадку я хотів би отримати повідомлення про помилкуThe following tasks did not complete: Did you forget to signal async completion?
Манфред

7

Замість того, щоб намагатися обслуговувати папку модулів вузлів, ви також можете скористатися Gulp для копіювання того, що вам потрібно для wwwroot.

https://docs.asp.net/en/latest/client-side/using-gulp.html

Це теж може допомогти

Visual Studio 2015 ASP.NET 5, завдання Gulp не копіювати файли з node_modules


4
Мені дуже подобається друге посилання, здається знайомим якось. ;)
Девід Пайн

1
Це не дуже зручно, коли ви змішуєте вихідні файли веб-додатків ASP.NET Core з модулями npm та виведенням коду на стороні клієнта. Саме тому команда ASP.NET видаляє Gulp, package.json з шаблонів проектів ASP.NET MVC за замовчуванням.
Костянтин Таркус

Я не знаю, що. Коли я був у VS Live в березні, вони все про це думали, але відтоді це сильно змінилося.
Dave_750

6

Який правильний підхід для цього?

Існує маса «правильних» підходів, ви просто вирішите, який найкраще відповідає вашим потребам. Схоже, ви нерозумієте, як користуватися node_modules...

Якщо ви знайомі з NuGet, вам слід подумати про npm як про його колегу. Де node_modulesкаталог схожий на binкаталог для NuGet . Ідея полягає в тому, що цей каталог є просто загальним місцем для зберігання пакетів, на мою думку, краще взяти dependencyна себе потрібні вам пакунки, як ви це робили в package.json. Потім скористайтесь інструментом для запуску завдань, Gulpнаприклад, для копіювання потрібних файлів у потрібне wwwrootмісце.

Про це я ще в січні написав повідомлення в блозі, де розповідаю про npm , Gulp і цілу купу інших деталей, які є актуальними і сьогодні. Крім того, хтось звернув увагу на моє запитання, яке я задав, і в кінцевому підсумку відповів собі тут , що, мабуть, корисно.

Я створив таке, Gistщо показує gulpfile.jsприклад.

У вашому Startup.csвипадку все ще важливо використовувати статичні файли:

app.UseStaticFiles();

Це забезпечить доступ вашої програми до того, що їй потрібно.


3
"Я написав про це в блозі ще в січні, в якому деталізував npm, Gulp та цілу купу інших деталей, які є актуальними і сьогодні". той факт, що з січня по червень, і ви повинні згадати, як і раніше є актуальним, - це саме моя проблема з тим, що я намагаюся навчитися вивчати будь-яку з цих матеріалів. Я занадто багато вчився вже, не витрачаючи часу на модні. Не винен Давид, ви дуже допомагаєте, але мені не подобається цей ефемерний новий світ.
Люк Пуплетт

5

Набагато простіший підхід полягає у використанні пакета OdeToCode.UseNodeModules Nuget. Я щойно тестував його за допомогою .Net Core 3.0. Все, що вам потрібно зробити, - це додати пакет до рішення та посилатися на нього у методі Налаштування класу Startup:

app.UseNodeModules();

Про це я дізнався із чудового курсу створення веб-програми з ASP.NET Core, MVC, Entity Framework Core, Bootstrap та Angular Pluralsight від Шона Уайлдермута.


1
А як додати пакети npm?
Лука Циглер

Існує кілька способів додати npm пакети до вашого проекту. Я вважаю за краще просто ввести їх у файл package.json під вузлом залежностей, як пояснено тут: stackoverflow.com/a/49264424/5301317
Mariusz Bialobrzeski

@MariuszBialobrzeski Дякуємо за обмін. Це акуратне рішення.
Sau001

@MariuszBialobrzeski Чи потрібно було зробити щось додаткове, щоб розгорнути статичний вміст з node_modules у ваших трубопроводах DevOps? Або ви перевірили в папці node_modules?
Sau001

1
@ Sau001 На жаль, у мене ніколи не було можливості працювати з трубопроводами DevOps. Папка node_modules, як правило, стає досить великою, тому я, безумовно, уникати перевірки, якщо це можливо.
Маріуш Білобжеський

1

Шон Уайлдермут має хороший путівник тут: https://wildermuth.com/2017/11/19/ASP-NET-Core-2-0-and-the-End-of-Bower

Стаття посилається на gulpfile на GitHub, де він реалізував стратегію в статті. Ви можете просто скопіювати та вставити більшу частину вмісту gulpfile у свій, але не забудьте додати відповідні пакети в package.json під devDependitions: gulp gulp-uglify gulp-concat rimraf merge-stream


1

Я знайшов кращий спосіб керувати пакетами JS у своєму проекті з бігунами завдань NPM Gulp / Grunt. Мені не подобається ідея мати NPM з іншим шаром бібліотеки javascript для управління "автоматизацією", і моя вимога номер один полягає в тому, щоб просто запустити оновлення npm, не турбуючись про те, чи потрібно мені запускати файли gulp, якщо він успішно скопіював усе і навпаки.

NPM спосіб:

  • Мініфіксатор JS вже вбудований в ядро ​​ASP.net, шукайте bundleconfig.json, щоб це не було проблемою для мене (не компілюючи щось на замовлення)
  • Хороша річ у NPM полягає в тому, що це хороша структура файлів, тому я завжди можу знайти заздалегідь складені / мінімізовані версії залежностей під node_modules / module / dist
  • Я використовую сценарій node_modules / .hooks / {eventname} NPM, який обробляє копії / оновлення / видалення файлів Project / wwwroot / lib / module / dist / .js, ви можете знайти тут документацію https: // docs.npmjs.com/misc/scriptsоновлю сценарій, який використовую для git, коли він буде більш відшліфований) мені не потрібні додаткові запуски завдань ( .js інструменти, які мені не подобаються) що забезпечує мій проект чистим та простим.

Спосіб пітона:

https://pypi.python.org/pyp ... але в цьому випадку джерела потрібно підтримувати вручну


1

Вибачте про тривалість цієї публікації.

Це робочий приклад з використанням ASP.NET Core версії 2.5.

Щось слід зазначити, що project.json є застарілим ( див. Тут ) на користь .csproj . Проблема з .csproj . Файл - це велика кількість функцій, і той факт, що для його документації немає центрального місця ( див. тут ).

Ще одна річ, у цьому прикладі працює ядро ​​ASP.NET в контейнері Docker Linux (альпійський 3.9); тому шляхи будуть відображати це. Він також використовує gulp ^ 4.0. Однак з деякою модифікацією він повинен працювати з більш старими версіями ASP.NET Core, Gulp, NodeJS, а також без Docker.

Але ось відповідь:

Тут можна переглянути справжній робочий приклад gulpfile.js

// ROOT and OUT_DIR are defined in the file above. The OUT_DIR value comes from .NET Core when ASP.net us built.
const paths = {
    styles: {
        src: `${ROOT}/scss/**/*.scss`,
        dest: `${OUT_DIR}/css`
    },
    bootstrap: {
        src: [
            `${ROOT}/node_modules/bootstrap/dist/css/bootstrap.min.css`,
            `${ROOT}/node_modules/startbootstrap-creative/css/creative.min.css`
        ],
        dest: `${OUT_DIR}/css`
    },
    fonts: {// enter correct paths for font-awsome here.
        src: [
            `${ROOT}/node_modules/fontawesome/...`,
        ],
        dest: `${OUT_DIR}/fonts`
    },
    js: {
        src: `${ROOT}/js/**/*.js`,
        dest: `${OUT_DIR}/js`
    },
    vendorJs: {
        src: [
            `${ROOT}/node_modules/jquery/dist/jquery.min.js`
            `${ROOT}/node_modules/bootstrap/dist/js/bootstrap.min.js`
        ],
        dest: `${OUT_DIR}/js`
    }
};

// Copy files from node_modules folder to the OUT_DIR.
let fonts = () => {
    return gulp
        .src(paths.styles.src)
        .pipe(gulp.dest(paths.styles.dest));
};

// This compiles all the vendor JS files into one, jsut remove the concat to keep them seperate.
let vendorJs = () => {
    return gulp
        .src(paths.vendorJs.src)
        .pipe(concat('vendor.js'))
        .pipe(gulp.dest(paths.vendorJs.dest));
}

// Build vendorJs before my other files, then build all other files in parallel to save time.
let build = gulp.series(vendorJs, gulp.parallel(js, styles, bootstrap));

module.exports = {// Only add what we intend to use externally.
    default: build,
    watch
};

Додайте ціль у файл .csproj . Зауважте, ми також додали дозор, щоб спостерігати та виключати, якщо ми скористаємося dotnet run watchкомандою.

app.csprod

  <ItemGroup>
    <Watch Include="gulpfile.js;js/**/*.js;scss/**/*.scss" Exclude="node_modules/**/*;bin/**/*;obj/**/*" />
  </ItemGroup>

  <Target Name="BuildFrontend" BeforeTargets="Build">
    <Exec Command="yarn install" />
    <Exec Command="yarn run build -o $(OutputPath)" />
  </Target>

Тепер, коли dotnet run buildце запущено, він також буде встановлювати та створювати модулі вузлів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.