gulp - فایلهای تایپینگ TypeScript ایجاد یا کپی نمیشوند
وقتی من tsc را از خط فرمان اجرا میکنم، فایلهای .js، .map و .d.ts من ایجاد میشوند:
C:\Users\{user}\Documents\My Projects\BEPS\angular2-soap>tsc -version
Version 1.8.10
...اما وقتی من تابع Gulp زیر را فراخوانی میکنم، همه چیز کار میکند به جز این که فایلهای .d.ts ایجاد یا در دایرکتوری ./app/ کپی نمیشوند:
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;
});
قطعهای از فایل package.json من:
"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"
},
فایل tsconfig.json من:
{
"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"
]
}
من فکر میکردم که همه کاری که باید انجام دهم استفاده از لوله dts برای ارسال فایلهای تایپ به ./app/ است
چه چیزی را از دست دادهام/چه کاری را اشتباه انجام میدهم؟ ممنون!
تلاش برای اعمال پیشنهاد از 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/'))
]);
});
من هنگام دسترسی به tsResults.dts با خطا مواجه میشوم:
TypeError: Cannot read property 'pipe' of undefined
حدس من این است که جریان sourcemaps است که استفاده میشود (نه جریان typescript)... آیا این منطقی است؟ اگر چنین است، چه کاری میتوانم انجام دهم تا آن را درست کنم؟
کد زیر هم فایلهای .js و هم .d.ts را ایجاد میکند - زیرا نمیخواهد فایلهای .map را نیز ایجاد کند:
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/'))
]);
});
پاسخ شماره ۱
موارد زیر اثری را که به دنبالش هستم ایجاد میکند - اما نیاز دارد که فایلهای منبع .ts دو بار کامپایل شوند (یک بار برای تولید فایلهای .js و .map و یک بار برای تولید فایلهای .d.ts)
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
]);
});
من از این رویکرد ناراضی هستم به دلیل تکراری بودن آن - پیشنهادهای بهینهسازی خوش آمدیده است.
پاسخ شماره ۲
من فکر میکنم شما نیاز دارید از چیزی مانند merge استفاده کنید تا هم فایلهای js و هم فایلهای تعریف نوع را بنویسید. ممکن است اشتباه کنم اما معتقدم جریان بعد از اولین gulp.dest() شما بسته میشود، بنابراین هیچ چیزی از طریق لوله dts ارسال نمیشود. فایل readme مربوط به gulp typescript را نگاه کنید. در زیر بخش استفاده پایه.
بهروزرسانی: من توانستم با استفاده از فایل tsconfig شما، مورد زیر را اجرا کنم. با این حال، من فقط از یک فایل منبع تایپاسکریپت استفاده میکردم. این فایلهای .js، .d.ts و .map را تولید کرد.
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/'))
]);
});
