ASP.NET Core에서 npm을 사용하는 방법


117

npm을 사용하여 ASP.NET Core 애플리케이션에 필요한 jQuery, Bootstrap, Font Awesome 및 유사한 클라이언트 라이브러리를 관리하고 있습니다.

나를 위해 일한 접근 방식은 프로젝트에 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은 이러한 패키지를 프로젝트 디렉터리의 wwwroot와 동일한 수준에있는 node_modules 폴더로 복원합니다.

여기에 이미지 설명 입력

ASP.NET Core가 wwwroot 폴더의 정적 파일을 제공하고 node_modules가 거기에 없기 때문에이 작업을 수행하기 위해 몇 가지 변경 작업을 수행해야했습니다. cs 파일 :

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

app.UseStaticFiles();

두 번째는 project.json 파일의 publishOptions에있는 node_modules를 포함합니다.

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

이것은 내 개발 환경에서 작동하며 Azure App Service 인스턴스에 배포 할 때도 작동하며 jquery, 부트 스트랩 및 글꼴 멋진 정적 파일이 제대로 제공되지만이 구현에 대해 확신 할 수 없습니다.

이를위한 올바른 접근 방식은 무엇입니까?

이 솔루션은 여러 소스에서 많은 정보를 수집하고 작동하지 않는 일부를 시도한 후에 나 왔으며, 이러한 파일을 wwwroot 외부에서 제공해야하는 것은 약간 이상해 보입니다.

어떤 조언이라도 대단히 감사하겠습니다.



이 링크에 동작하는 예제가 ASP.NET 코어 w / NPM : ievangelistblog.wordpress.com/2016/01/13/...
데이비드 파인

2
나에게 발생한 한 가지는 Bundler and Minifier-소스 지정은 Outside wwwroot이고 빌드 할 때 JS를 wwwroot에 빌드하는 것입니다. node_modules에서 그 .. 당신은 적절한 방법으로 제공되어서는 안 콘텐츠
피오트르 쿨라

누구든지 정적으로 node_modules폴더를 제공하지 않도록 강력히 권장 합니다. a) 생태계가 설계된 방식이 아닙니다. b) 보안 위험이 있습니다. 설치된 패키지 중 하나가 민감한 정보를 유출 할 수 있습니다. 적절한 방법은 파일을 정적 프런트 엔드 파일 서비스 전용 src또는 whatever폴더에 게시하는 빌딩 파이프 라인 (grunt / gulp / node / webpack)을 설정하는 것입니다
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'에 추가하거나 내 파일에서 사용할 수 있도록 만들지 않는다고 말할 수있는 한 ... 나는 이것에 매우 익숙해 보이지만 믿을 수 없을만큼 혼란스러워 보입니다. 웹 개발의 복잡한 새로운 세계 ...
Gerard Wilkinson

32
복잡합니다. 프런트 엔드를 완전히 포기하고 API 작업 만 할 준비가되었습니다.
Luke Puplett 2016

12
이것은 일반적으로 올바른 접근 방식이지만 대답은 중요한 단계를 생략합니다. node_modules 폴더의 파일을 Gulp 작업으로 wwwroot 폴더로 복사하는 것입니다. var nodeRoot = './node_modules/'로 시작하십시오. 원하는 하위 폴더를 nodeRoot에서 webroot의 적절한 하위 폴더로 복사하는 작업을 추가합니다. 지금은 자세히 설명 할 시간이 없지만 관심이 있으면 나중에 세부 사항을 추가 할 수 있습니다.
Doug

32
"왜 우리가이 질문을해야합니까!" 파일을 사용할 수없는 위치에 의도적으로 파일을 설치하는 이유는 무엇입니까? 그런 다음 파일에 액세스 할 수 없기 때문에 정교한 유틸리티를 설치하고 구성하여 파일을 사용할 수있는 위치에 복사합니다. 정말 우스꽝 스럽습니다.
Sam

8
여기의 도구는 기본적으로 쓰레기이기 때문입니다. npm을 사용하는 것은 무엇이든 할 때와 마찬가지로 npm을 사용하는 입니다. ASP.NET Core와 관련된 것은 없습니다. node_modules그것이 npm이하는 일이기 때문에 모든 것이 들어갑니다 . 꿀꺽 꿀꺽 작업은 물건을 올바른 장소, 즉 실제로 필요한 곳으로 옮기는 데 필요합니다. 문제는 마이크로 소프트가 Bower와 아름다운 통합을 제공했지만, 이제 Bower가 죽었거나 (또는 ​​적어도 죽어 가고 있음) 마이크로 소프트가 대체 도구를 제공하지 않았다는 점이라고 생각합니다.
Chris Pratt

41

여기에 이미지 설명 입력

  • npm클라이언트 측 라이브러리를 관리하는 데 사용 하는 것이 좋은 선택입니다 (Bower 또는 NuGet과 반대). 올바른 방향으로 생각하고 있습니다. :)
  • 서버 측 (ASP.NET Core) 및 클라이언트 측 (예 : Angular 2, Ember, React) 프로젝트를 별도의 폴더로 분할 (그렇지 않으면 ASP.NET 프로젝트에 많은 노이즈가있을 수 있음-클라이언트 측 코드, node_modules에 대한 단위 테스트) 폴더, 빌드 아티팩트 등). 당신과 같은 팀에서 일하는 프런트 엔드 개발자는 그것에 대해 감사 할 것입니다 :)
  • 솔루션 수준에서 npm 모듈을 복원합니다 (프로젝트 폴더가 아닌 NuGet을 통해 패키지를 복원하는 방법과 유사 함). 이렇게하면 별도의 폴더에서 단위 및 통합 테스트를 수행 할 수 있습니다 (클라이언트 측 JavaScript 테스트를 내부에 두는 것과는 반대). ASP.NET Core 프로젝트).
  • 사용은 필요하지 않을 수 있으며 정적 파일 (.js, 이미지 등)을 제공하는 FileServerStaticFiles충분해야합니다.
  • Webpack을 사용하여 클라이언트 측 코드를 하나 이상의 청크 (번들)로 묶습니다.
  • Webpack과 같은 모듈 번 들러를 사용하는 경우 Gulp / Grunt가 필요하지 않을 수 있습니다.
  • ES2015 + JavaScript로 빌드 자동화 스크립트를 작성합니다 (Bash 또는 PowerShell과 반대). 크로스 플랫폼에서 작동하고 다양한 웹 개발자가 더 쉽게 액세스 할 수 있습니다 (요즘은 모두 JavaScript를 사용합니다).
  • 이름 wwwroot을로 바꾸십시오 public. 그렇지 않으면 Azure Web Apps의 폴더 구조가 혼란스러워집니다 ( D:\Home\site\wwwroot\wwwrootvs D:\Home\site\wwwroot\public).
  • 컴파일 된 출력 만 Azure Web Apps에 게시합니다 ( node_modules웹 호스팅 서버로 푸시해서는 안 됨 ). tools/deploy.js예를 참조하십시오 .

GitHub의 ASP.NET Core Starter Kit 방문 (고지 사항 : 저자입니다)


2
좋은 답변입니다. 커뮤니티에 스타터 키트를 제공하는 작업에 대한 찬사입니다!
David Pine

7
올해 초 영국의 주요 브랜드를위한 거대한 공개 Angular 앱을 성공적으로 구축했지만이 답변의 대부분을 이해할 수 없었습니다. 나는 그것을 모든 곳에서 배우기 시작할 수도 없습니다. 말 그대로 경력 위기를 겪고 있습니다.
Luke Puplett 2016

이것은 클라이언트 측 스크립트와 파일을 작성하고 관리하는 동안해야 할 일과하지 말아야 할 일을 잘 요약 한 것입니다. 시간과 연구를 절약했습니다. 당신에게 명성!
Sangeeta

안타깝게도 Visual Studio (멍청하게 IMHO)는 이름 만 기반으로 "wwwroot"디렉터리를 특별히 처리하여 솔루션 탐색기에 특수 "웹 루트"아이콘을 제공하고 기본적으로 "Content"가 아닌 "None"으로 해당 콘텐츠를 표시합니다. . 정적으로 제공되는 파일을 거기에 넣고 Visual Studio를 사용하는 경우 이름을 "wwwroot"로 두어야합니다. 나는 그것이 나쁜 이름이라는 데 동의합니다.
Jez

27

설치 Bundler를하고 Minifier을 비주얼 스튜디오 확장에

그런 다음 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
  }
]

따라서 번 들러 및 minifier (gulp 기반)는 소스 파일 (Visual Studio에서 제외되고 GIT에서도 제외되어야 함)에 액세스 할 수 있으며 지정된대로 wwwroot에 넣습니다.

저장할 때마다 부작용만이 실행됩니다 (그러나 수동으로 실행하도록 설정할 수 있음)


4
Bower가 죽고 NPM으로 전환하지 않고는 더 이상 Bootstrap을 업데이트 할 수없는 것을 본 후 이것이 제가 가장 좋아하는 접근 방식 인 것 같습니다. Gulp 또는 Webpack은 이미 최신 MVC 프로젝트 템플릿에있는이 간단한 솔루션에 비해 과도하게 보입니다. 공유 해주셔서 감사합니다!
Matt Sanders

1
CSS에서 참조 된 이미지는 여기서 어떻게 처리됩니까? css 및 js가 www로 이동 한 node_modules 폴더에 여전히 이미지 문제가 있습니다. 이 문제를 해결하는 방법을 알고 계십니까?
VPP

1
IDE와 무관합니까? 팀 중 일부가 VS Code를 사용하는 경우 어떻게 작동하며 CD 빌드 파이프 라인에서 어떻게 작동합니까?
Jacob Stamm

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 은 강력하지만 설정하려면 약간의 작업이 필요합니다. 일부 라이브러리 만 다운로드하려는 경우 대신 Library Manager (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이 새 asp.net 핵심 프로젝트에서 사용되는 Bootstrap, JQuery 및 기타 라이브러리를 node_modules라는 폴더에 다운로드합니다. 다음 단계는 파일을 적절한 위치에 복사하는 것입니다. 이를 위해 NPM에서 다운로드 한 gulp를 사용합니다. 그런 다음 프로젝트 루트에 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 를 마우스 오른쪽 버튼으로 클릭 하면 Task Runner Explorer를 선택할 수 있습니다 . 여기에서 수동으로 gulp를 실행하여 파일을 복사하거나 정리할 수 있습니다.

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
Library Manager-들어 본 적이 없지만 정확히 필요한 것입니다! 정답이어야합니다.
codeMonkey

1
내가 파일에 기본 작업의 첫 번째 라인을 변경했다 꿀꺽 오류 방지하기 gulpfile.jsgulp.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 팀이 기본 ASP.NET MVC 프로젝트 템플릿에서 Gulp, package.json을 제거하는 이유입니다.
콘스탄틴 Tarkus

난 몰랐어. 지난 3 월 VS Live에 갔을 때는 모두 다했는데 그 이후로 많이 바뀌 었어요.
Dave_750

6

이를위한 올바른 접근 방식은 무엇입니까?

"올바른"접근 방식이 많이 있으며, 귀하의 요구에 가장 적합한 제품군을 결정하기 만하면됩니다. 사용 방법을 오해하는 것 같습니다 node_modules...

NuGet에 익숙하다면 npm 을 클라이언트 측 대응 물로 생각해야합니다 . 어디 node_modules디렉토리는 같다 bin대한 디렉토리 NuGet . 아이디어는이 디렉토리가 패키지를 저장하는 일반적인 위치 일뿐입니다. 제 생각 dependency에는 .NET Framework에서했던 것처럼 필요한 패키지 를 가져 오는 것이 좋습니다 package.json. 그런 다음 Gulp예를 들어 작업 실행기를 사용하여 필요한 파일을 원하는 wwwroot위치 에 복사하십시오 .

저는 1 월에 npm , Gulp 및 오늘날에도 여전히 관련이있는 기타 세부 사항을 자세히 설명 하는 블로그 게시물을 작성했습니다 . 또한 누군가가 내 질문에 관심을 불러 일으켰고 궁극적으로 여기 에서 스스로 대답했습니다 .

I가 생성 Gist하는 표시를 gulpfile.js예시한다.

당신의에서 Startup.cs이 정적 파일을 사용하는 게 중요합니다 :

app.UseStaticFiles();

이렇게하면 애플리케이션이 필요한 항목에 액세스 할 수 있습니다.


3
"나는 1 월에 npm, Gulp 및 오늘날에도 여전히 관련이있는 기타 세부 사항을 자세히 설명하는 블로그 게시물을 작성했습니다." 1 월부터 6 월까지 당신이 언급해야하는 사실이 여전히 관련성이 있다는 사실은 바로이 날아 다니는 물건을 배우고 싶어하는 제 문제입니다. 패션에 시간을 낭비하지 않고 이미 배울 것이 너무 많습니다. 당신 잘못이 아니에요, 당신은 매우 도움이되지만 저는이 일시적인 신세계를 좋아하지 않습니다.
누가 복음 Puplett

5

훨씬 간단한 방법은 OdeToCode.UseNodeModules Nuget 패키지 를 사용하는 입니다. 방금 .Net Core 3.0으로 테스트했습니다. 솔루션에 패키지를 추가하고 Startup 클래스의 Configure 메서드에서 참조하기 만하면됩니다.

app.UseNodeModules();

Shawn Wildermuth 의 뛰어난 ASP.NET Core, MVC, Entity Framework Core, Bootstrap 및 Angular Pluralsight를 사용 하여 웹 앱 빌드 과정에서 이에 대해 배웠습니다 .


1
그리고 npm 패키지를 어떻게 추가합니까?
Luca Ziegler 19

프로젝트에 npm 패키지를 추가하는 방법에는 여러 가지가 있습니다. 여기에 설명 된대로 종속성 노드 아래의 package.json 파일에 입력하는 것을 선호합니다. stackoverflow.com/a/49264424/5301317
Mariusz Bialobrzeski

@MariuszBialobrzeski 공유해 주셔서 감사합니다. 이것은 깔끔한 솔루션입니다.
Sau001

@MariuszBialobrzeski DevOps 파이프 라인의 node_modules에서 정적 콘텐츠를 배포하기 위해 추가 작업을해야 했습니까? 아니면 node_modules 폴더를 확인 했습니까?
Sau001

1
@ Sau001 불행히도 DevOps 파이프 라인으로 작업 할 기회가 없었습니다. node_modules 폴더는 꽤 커지는 경향이 있으므로 가능하면 체크인을 피할 것입니다.
Mariusz Bialobrzeski


1

NPM Gulp / Grunt 태스크 러너를 사용하여 프로젝트에서 JS 패키지를 관리하는 더 좋은 방법을 찾았습니다. 나는 "자동화"를 처리하기 위해 자바 스크립트 라이브러리의 다른 레이어가있는 NPM을 가지고 있다는 생각이 마음에 들지 않습니다. 내 가장 중요한 요구 사항은 꿀꺽 꿀꺽 작업을 실행해야 할 경우 다른 걱정없이 npm 업데이트를 간단하게 실행하는 것입니다. 모든 것을 성공적으로 복사했다면 그 반대의 경우도 마찬가지입니다.

NPM 방식 :

  • JS minifier는 이미 ASP.net 코어에 번들로 포함되어 있으므로 bundleconfig.json을 찾으십시오. 그래서 이것은 나에게 문제가되지 않습니다 (사용자 정의 컴파일하지 않음)
  • NPM의 좋은 점은 좋은 파일 구조를 가지고 있기 때문에 node_modules / module / dist 아래에서 항상 미리 컴파일 된 / 최소화 된 버전의 종속성을 찾을 수 있다는 것입니다.
  • Project / wwwroot / lib / module / dist / .js 파일 의 복사 / 업데이트 / 삭제를 처리하는 NPM node_modules / .hooks / {eventname} 스크립트를 사용 하고 있습니다. 여기에서 설명서를 찾을 수 있습니다. https : // docs.npmjs.com/misc/scripts (좀 더 다듬어지면 git에 사용하는 스크립트를 업데이트하겠습니다) 추가 작업 실행자가 필요하지 않습니다 (좋지 않는 .js 도구). 내 프로젝트를 깨끗하고 간단하게 유지합니다.

파이썬 방식 :

https://pypi.python.org/pyp ...하지만이 경우 소스를 수동으로 유지해야합니다.


1

이 게시물의 길이를 용서하십시오.

이것은 ASP.NET Core 버전 2.5를 사용하는 실제 예제입니다.

주목할 점은 project.json.csproj 를 선호하여 더 이상 사용되지 않는다는 것입니다 ( 여기 참조 ) . .csproj 문제 . 파일은 많은 양의 기능이며 문서화를위한 중앙 위치가 없다는 사실입니다 ( 여기 참조 ).

한 가지 더,이 예제는 Docker Linux (alpine 3.9) 컨테이너에서 ASP.NET 코어를 실행하고 있습니다. 경로가이를 반영합니다. 꿀꺽 꿀꺽 ^ 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 파일에 대상 을 추가 합니다. 명령 을 활용하는 경우 감시 및 제외 할 Watch 도 추가했습니다 .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실행 되면 노드 모듈도 설치 및 빌드됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.