Необходимо ли MSBuild переносить файлы .ts в зависимости Angular2 (в node_modules) для работы Angular2?

#node.js #asp.net-mvc #angular #typescript #msbuild

#node.js #asp.net-mvc #angular #typescript #msbuild

Вопрос:

Фона

У меня есть ASP.NET Проект MVC, интегрированный с Angular2. Согласно Angular.io краткое руководство по запуску — я создал папку в моем файле решения со структурой Angular2 по умолчанию…

 ├── app
|   └── ...
├── node_modules
|   └── ...
├── typings
|   └── ...
| systemjs.config.js
| tsconfig.json
| typings.json
| package.json
  

… и package.json файла по умолчанию:

 "dependencies": {
  "@angular/common": "2.0.0",
  "@angular/compiler": "2.0.0",
  "@angular/core": "2.0.0",
  "@angular/forms": "2.0.0",
  "@angular/http": "2.0.0",
  "@angular/platform-browser": "2.0.0",
  "@angular/platform-browser-dynamic": "2.0.0",
  "@angular/router": "3.0.0",
  "@angular/upgrade": "2.0.0",
  "core-js": "^2.4.1",
  "reflect-metadata": "^0.1.3",
  "rxjs": "5.0.0-beta.12",
  "systemjs": "0.19.27",
  "zone.js": "^0.6.23",
  "angular2-in-memory-web-api": "0.0.20",
  "bootstrap": "^3.3.6"
},
"devDependencies": {
  "concurrently": "^2.2.0",
  "lite-server": "^2.2.2",
  "typescript": "^2.0.2",
  "typings":"^1.3.2"
}
  

Затем я использовал npm install команду для установки зависимостей Angular2 в node_modules папку.

Проблема

Корень моей проблемы заключается в том, что MSBuild пытается скомпилировать каждый .ts файл во всем проекте.1 К ним относятся .ts файлы, которые он находит в node_modules папке. Это приводит к множеству ошибок и предотвращает сборку / публикацию решения.2

Вопрос

Я могу решить проблему, удалив все tsconfig.json файлы, за исключением одного на корневом уровне моего проекта — если это так, MSBuild прекратит попытки скомпилировать зависимости AngularJS в node_modules .

Но целесообразно ли это? Будут ли зависимости Angular2 работать корректно, если их tsconfig.json файлы будут удалены, а их файлы Typescript не будут скомпилированы? Будет ли SystemJS в любом случае компилировать файлы Typescript?

1 Я использую Microsoft.Typescript.MSBuild пакет NuGet для переноса .ts файлов (tsc.exe версии v2.0.3) и NodeJS версии 6.x.

2 Я думаю, это потому, что до установки зависимостей Angular2 у меня есть один tsconfig.json файл в корне моего проекта, но впоследствии он node_modules содержит около десяти разных tsconfig.json файлов — например, node_modulesbrowser-syncnode_modulesrxtstsconfig.json .

Комментарии:

1. Я использую Asp.net MVC и angular2 вместе. Однако я никогда не разрабатываю проект ng2 с использованием Visual Studio (меня слишком раздражали такого рода проблемы). Скорее, я создаю свой проект с помощью angular-cli; разрабатываю проект в Visual Studio Code (что потрясающе). ЗАТЕМ, когда приходит время сборки для производства, я запускаю «ng build -prod» и использую gulp, чтобы скопировать все из папки «prod» в мой asp.net Проекта MVC. Не тот ответ, который вы искали, но подумали, что это может быть полезно.

Ответ №1:

Будут ли зависимости Angular2 работать корректно, если их файлы tsconfig.json будут удалены, а их файлы Typescript не будут скомпилированы?

Сторонние библиотеки уже распространяются как файлы JS. Это верно для любой сторонней библиотеки. Библиотеки, которые поддерживают TypeScript «из коробки», будут включать в себя файлы определения TypeScript (эти файлы заканчиваются на .d.ts ). Когда мы компилируем наши приложения, они компилируются по отношению к файлу определения, не к исходному ( .ts ) файлу. Файл определения предоставляет типизацию, достаточную для компиляции TypeScript. Нам никогда не придется касаться фактического исходного кода

Возможно, вы также заметили, что некоторые сторонние библиотеки JS не поддерживают TypeScript из коробки (.т. е. не распространяют набор текста в библиотеке). В этом случае нам нужно установить внешние сторонние типизации. Например, скажем, что мы используем Moment JS. Если вы установите npm install momemt , вы заметите, что модуль не имеет файла typings. Итак, если мы хотим использовать Moment в TypeScript, мы бы это сделали npm install @types/moment , и это предоставило бы нам типизацию для Moment.

Также, если вы хотите создать свою собственную библиотеку TypeScript, что бы вы сделали, это добавили compilerOptions.declaration: true в свой tsconfig.json файл. Когда проект будет скомпилирован, он создаст файлы определений для вас, так что вам не нужно записывать их вручную.

Вот как сторонние библиотеки используются / должны использоваться в TypeScript. Если бы мы не использовали файлы определений и всегда импортировали исходный код, то исходный код всегда компилировался бы, независимо от того, исключаете вы его из tsconfig или нет, поскольку от этого зависит код, который мы пишем. Поэтому вместо этого мы зависим от файлов определения. Когда вы импортируете в свой код проекта, то, что вы импортируете, на самом деле является файлом определения, а не исходным файлом.

Комментарии:

1. Это отвечает на часть моего вопроса — я слышал, что файлы .ts не нужно компилировать. Что насчет tsconfig.json файлов? MSBuild компилирует каждый .ts файл, в котором он находит tsconfig.json , даже в node_modulesbrowser-syncnode_modulesrxtstsconfig.json

2. Этого не должно быть, если вы исключаете node_modules. Если это произойдет, это может быть специфическая проблема IDE (или любой другой MSBuild)

3. Я могу исключить node_modules из корня tsconfig — имеет смысл. Однако переход к tsconfig файлам зависимостей отдельных проектов Angular2 (которые используются MSBuild) и перезапись их всех с помощью exclude s кажется опасным.

4. Я не знаю, я не использую MSBuild. Но при использовании глобального компилятора typescript от node у меня никогда не возникало проблем с использованием других файлов tsconfig.

5. 1, и это полностью имеет смысл в контексте экосистемы NodeJS. Однако мой вопрос на самом деле касается поведения MSBuild, когда оно пытается напоминать NodeJS, поэтому я соответствующим образом отредактировал заголовок своего вопроса.

Ответ №2:

Вам не следует компилировать файлы TypeScript в node_modules. Чтобы убедиться, что вы этого не сделаете, добавьте следующее в ваш файл tsconfig:

 "exclude": [
    "node_modules"
  ],
  

Публикация библиотеки в виде TypeScript считается плохой практикой, поскольку потребителю пришлось бы воссоздавать всю среду сборки, чтобы использовать ее — типы и все остальное. Потенциально вам также придется настроить таргетинг на определенную версию компилятора TypeScript.

Комментарии:

1. Так почему бы и нет? Я уже знаю, как исключить их из компиляции. Задокументирована ли где-нибудь причина этого?

2. Код, предоставляемый сторонними библиотеками, уже скомпилирован, вам не нужно делать это самостоятельно, и вы не должны

3. Я добавил еще немного информации