Импорт ng2-bootstrap изменяет мою структуру выходного каталога tsc

У меня следующая структура папок

dist
src
  module1
    m1.ts
  module2
    m2.ts
.tsconfig.json
...

У меня tsc настроен вывод на dist/js, поэтому после запуска npm run tsc у меня есть следующее:

dist
    js
      module1
          m1.js
      module2
          m2.js
src
...

После долгой борьбы мне удалось интегрировать ng-bootstrap в свой проект.

Если я import из ng2-bootstrap где-то в своем приложении, например:

import { ACCORDION_DIRECTIVES } from 'ng2-bootstrap/components/accordion';

и запустите npm run tsc мои изменения в структуре папок на:

dist
    js
      node_modules
          ng2-bootstrap
             components
                accordian
                ...
      src
          module1
             m1.js
          module2
             m2.js
src
....

Почему это происходит?

Я в том числе: <script src="/vendor/ng2-bootstrap/bundles/ng2-bootstrap.js"></script> в свой index.html

Я могу сделать это с angular2 <script src="/vendor/angular2/bundles/angular2.dev.js"></script> и import {Component} from 'angular2/core', и это не создает папку dist/js/node_modules/angular2

Обновить

Вот содержимое моего tsconfig.json

{
  "compilerOptions": {
    "target": "ES5",
    "outDir": "./dist/js",
    "module": "system",
    "moduleResolution": "node",
    "sourceMap": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": false,
    "noImplicitAny": false
  },
  "exclude": [
    "node_modules",
    "dist",
    "typings/main",
    "typings/main.d.ts"
  ]
}

person Shawn Northrop    schedule 26.02.2016    source источник
comment
Не могли бы вы дать нам свой tsconfig.json? Спасибо!   -  person Thierry Templier    schedule 26.02.2016
comment
Также, возможно, стоит упомянуть, у меня "rootDir": "./src" установлен в tsconfig.json, и это было нормально до "import .. from "ng2-bootstrap..", тогда я получал ошибку ..node_modules/ng2-bootstrap/components/accordion.ts' is not under 'rootDir' 'src'. при запуске npm run tsc   -  person Shawn Northrop    schedule 26.02.2016
comment
ссылка на эту структуру репо. github.com/MrPardeep/Angular2-DatePicker выглядит так же, как структура этого репо   -  person Pardeep Jain    schedule 26.02.2016
comment
У меня точно такая же проблема. Импорт ng2-bootstrap создает в моей папке dist node_modules как родственника src (который скомпилированный контент переходит непосредственно в dist, если нет импорта ng2-bootstrap). Я предлагаю вознаграждение, чтобы привлечь внимание парней, пишущих на машинке.   -  person Zielu    schedule 08.03.2016


Ответы (1)


Я нашел решение. Очевидно, исходные файлы .ts находятся в том же каталоге, что и .d.ts. и поэтому компилирует эти файлы. (Я читал это где-то по пути, и я не уверен, почему это происходит), однако решение состоит в том, чтобы удалить все .ts igoring *.d.ts файлы в node_modules/ng2-bootstrap

Я создал node script для этого:

// ./scripts/hack-remove-files.js

var fs = require('fs-extra')
var glob = require("glob");

var options = { ignore: '**/*.d.ts'};

glob("node_modules/ng2-bootstrap/**/*.ts", options, function (er, files) {
    for(i in files){
        removeFile(files[i]);
    }
});

glob("node_modules/ng2-file-upload/**/*.ts", options, function (er, files) {
    for(i in files){
        removeFile(files[i]);
    }
});

removeFile = function(file){
    fs.remove(file, function (err) {
        if (err) return console.error(err)
    })
}

Я запускаю это как postinstall скрипт в npm:

"scripts": {
   ...
   "postinstall": "typings install && node ./scripts/hack-remove-files.js",
}

Это нужно сделать только 1 раз, после скачивания пакета.

другой подход к командной строке:

find node_modules/ng2-bootstrap -name '*.ts' | grep -v '\.d\.ts$' | xargs rm

РЕДАКТИРОВАТЬ

Я обнаружил исходную проблему, в которой все это упоминается: https://github.com/valor-software/ng2-bootstrap/issues/128

person Shawn Northrop    schedule 08.03.2016