gulp - TypeScript-typfiler skapas/ kopieras inte


När jag kör tsc från kommandoraden skapas mina .js, .map och .d.ts-filer:

C:\Users\{user}\Documents\My Projects\BEPS\angular2-soap>tsc -version
Version 1.8.10

...men när jag anropar följande Gulp-funktion fungerar allt förutom att .d.ts-filerna inte skapas/kopieras till ./app/-mappen:

gulp.task('compile-typescript', function () {
    var sourcemaps = require('gulp-sourcemaps');
    var typescript = require('gulp-typescript');
    var typescriptCompiler = typescript({typescript: require('typescript')});
    var typescriptProject = typescript(typescript.createProject('tsconfig.json'));

    var tsResults = gulp.src(['!./src/**/spec*.ts', './src/**/*.ts'])
        .pipe(typescriptProject)
        .pipe(sourcemaps.init())
        .pipe(sourcemaps.write('../map/'))
        .pipe(gulp.dest('./app/'))
        .pipe(typescriptCompiler).dts.pipe(gulp.dest('./app/'));

    return tsResults;
});

utdrag från min package.json-fil:

"devDependencies": {
   "autoprefixer": "6.3.6",
   "concurrently": "2.0.0",
   "cssnano": "3.5.2",
   "del": "2.2.0",
   "gulp": "3.9.1",
   "gulp-ext-replace": "0.3.0",
   "gulp-imagemin": "2.4.0",
   "gulp-postcss": "6.1.0",
   "gulp-sourcemaps": "1.6.0",
   "gulp-typescript": "2.13.0",
   "http-server": "0.9.0",
   "jasmine-core": "2.4.1",
   "karma": "0.13.22",
   "karma-chrome-launcher": "0.2.3",
   "karma-jasmine": "0.3.8",
   "karma-spec-reporter": "0.0.26",
   "lite-server": "2.2.0",
   "postcss": "5.0.19",
   "postcss-scss": "0.1.7",
   "precss": "^1.3.0",
   "run-sequence": "1.1.5",
   "systemjs": "0.19.26",
   "typescript": "latest",
   "typings": "0.8.1"
 },

min tsconfig.json-fil:

{
  "compileOnSave": true,
  "compilerOptions": {
    "target": "ES5",
    "module": "System",
    "moduleResolution": "node",
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "removeComments": true,
    "noImplicitAny": true,
    "declaration": true,
    "sourceMap": true,
    "mapRoot": "map/",
    "diagnostics": true
  },
  "exclude": [
    "node_modules",
    "typings"
  ]
}

Jag trodde att allt jag behövde göra var att använda dts-pipen för att skicka typfilerna till ./app/

Vad missar jag/gör fel? Tack!

Försöker använda förslaget från t34t5:

gulp.task('compile-typescript', function () {
    var sourcemaps = require('gulp-sourcemaps');
    var typescript = require('gulp-typescript');
    var project = typescript.createProject('tsconfig.json', {declaration: true});
    var merge = require('merge2');

    var tsResults = gulp.src(['!./src/**/spec*.ts', './src/**/*.ts'])
        .pipe(sourcemaps.init())
        .pipe(typescript(project))
        .pipe(sourcemaps.write('../map/'));

    return merge([
        tsResults.dts.pipe(gulp.dest('./app/')),
        tsResults.js.pipe(gulp.dest('./app/'))
    ]);
});

Jag får ett fel när jag försöker öppna tsResults.dts:

TypeError: Cannot read property 'pipe' of undefined

Min gissning är att sourcemaps-strömmen är det som används (inte typescript-strömmen)... låter det vettigt? Om så är fallet, vad kan jag göra för att åtgärda det?

Följande genererar både .js och .d.ts-filerna - eftersom det inte försöker generera .map-filer också:

gulp.task('compile-typescript', function () {
    var typescript = require('gulp-typescript');
    var project = typescript.createProject('tsconfig.json', {declaration: true});
    var merge = require('merge2');

    var tsResults = gulp.src(['!./src/**/spec*.ts', './src/**/*.ts'])
        .pipe(typescript(project));

    return merge([
        tsResults.dts.pipe(gulp.dest('./app/')),
        tsResults.js.pipe(gulp.dest('./app/'))
    ]);
});

Svar #1

Följande uppnår den effekt som jag söker - men det kräver att .ts-källfilerna kompileras två gånger (en gång för att generera .js- och .map-filerna och en gång för att generera .d.ts-filerna)

gulp.task('compile-typescript', function () {
    var sourcemaps = require('gulp-sourcemaps');
    var typescript = require('gulp-typescript');
    var merge = require('merge2');

    var src = gulp.src(['!./src/**/spec*.ts', './src/**/*.ts']);
    var dst = gulp.dest('./app/');

    var jsMap = src.pipe(typescript(typescript.createProject('tsconfig.json')))
                   .pipe(sourcemaps.init())
                   .pipe(sourcemaps.write('../map/'));

    var dts = src.pipe(typescript(typescript.createProject('tsconfig.json')));

    return merge([
        jsMap.pipe(dst),   // writes .js and .map files
        dts.dts.pipe(dst)  // writes .d.ts files
    ]);
});

Jag är missnöjd med detta tillvägagångssätt på grund av överflödigheten - optimeringsförslag är välkomna.

Svar #2

Jag tror att du skulle behöva använda något som merge för att skriva både js-filerna och typdefinitionsfilerna. Jag kan ha fel men jag tror att streamen stängs efter din första gulp.dest() så inget skickas genom dts-pipen. Titta på readme-filen för gulp typescript. Under avsnittet grundläggande användning.

UPPDATERING: Jag kunde få följande att fungera med din tsconfig-fil. Jag använde dock bara en enda TypeScript-källfil. Detta genererade .js-, .d.ts- och .map-filerna.

gulp.task('compile-typescript', function () {
    var typescript = require('gulp-typescript');
    var project = typescript.createProject('tsconfig.json', {declaration: true});
    var merge = require('merge2');

    var tsResults = gulp.src(['!./src/**/spec*.ts', './src/**/*.ts'])
        .pipe(sourcemaps.init())
        .pipe(typescript(project);

    return merge([
        tsResults.dts.pipe(gulp.dest('./app/')),
        tsResults.js.pipe(sourcemaps.write('./app/')).pipe(gulp.dest('./app/'))
    ]);


});