2014-11-17 14 views
5

Tôi đang cố gắng biên dịch gulp và xem các tệp TypeScript. Đây là những gì tôi đã có cho đến nayGulpfile có hiệu quả biên dịch chỉ thay đổi các tệp TypeScript

var tsProject = plugins.typescript.createProject(
{ 
    removeComments: false, 
    target: 'ES5', 
    module: 'amd', 
    noExternalResolve: false, 
    noImplicitAny: false, 
}); 

var typescriptGlob = [ 
    presentationScriptsDir + '**/*.ts', 
    definitelyTypedDefinitions 
]; 

gulp.task("compile-typescript", function() { 
    return gulp.src(typescriptGlob) 
     .pipe(plugins.typescript(tsProject)) 
     .pipe(gulp.dest(presentationScriptsDir)); 
}); 

gulp.task("watch-typescript", function() { 
    return gulp.watch(typescriptGlob, ["compile-typescript"]); 
}); 

Tôi đang sử dụng gulp-typescript.

Tuy nhiên, vì chúng ta có hàng trăm file nguyên cảo Tôi không muốn biên dịch lại tất cả các file mỗi khi một trong số họ thay đổi. Đoạn mã trên làm thế (tôi có thể nói vì watch-typescript mất ít nhất nhiều thời gian như các compile-typescript)

Tôi đã cố gắng sử dụng gulp-changed, như thế này

gulp.task("compile-typescript", function() { 
    return gulp.src(typescriptGlob) 
     .pipe(plugins.changed(presentationScriptsDir, {extension: '.js'})) 
     .pipe(plugins.typescript(tsProject)) 
     .pipe(gulp.dest(presentationScriptsDir)); 
}); 

Đó thực sự lọc ra các file không thay đổi. Nhưng sau đó trình biên dịch bản ghi báo cáo lỗi vì nó chỉ nhận được một tệp duy nhất, mà thiếu các khai báo kiểu mà nó thường nhận được từ các tệp khác.

Tôi không muốn đặt cờ noExternalResolve thành true, vì sau đó rất nhiều loại kiểm tra sẽ không được thực hiện, điều này sẽ đánh bại rất nhiều lý do sử dụng TypeScript ở vị trí đầu tiên.

Làm thế nào tôi có thể viết gulpfile này tốt hơn?

Trả lời

7

Các nguyên cảo trình biên dịch không đi qua các biên dịch và liên kết các giai đoạn riêng biệt giống như hầu hết các trình biên dịch ngôn ngữ làm. Vì vậy, nó thực sự không thể thực hiện biên dịch gia tăng.

Giống như bạn nói, để có được những loại kiểm tra, trình biên dịch cần phải nạp và ít nhất tái phân tích tất cả các file mà có thể được tham chiếu.

gì chúng tôi đã thực hiện trong dự án của chúng tôi là sử dụng hỗ trợ Visual Studio để "biên dịch trên lưu" đó sẽ tạo ra các tập tin .js đối với chúng tôi trong khi chúng tôi đang phát triển và gỡ lỗi. (Rõ ràng cơ chế đó sử dụng tính năng noExternalResolve). Sau đó, chúng tôi dựa vào quy trình thử nghiệm đơn vị của chúng tôi và máy chủ tích hợp liên tục để chạy một trình biên dịch TypeScript thông thường để nhận tất cả cú pháp và lỗi nhập.

Vì vậy, tôi muốn đề nghị để chạy đồng hồ của bạn với cờ noExternalResolve mà còn bao gồm một bước trong công việc của bạn để chạy đầy đủ các nguyên cảo biên dịch tại các điểm quan trọng. Có lẽ bạn có thể chỉ định một tệp "gốc" nhất định bắt đầu biên dịch đầy đủ khi nó được thay đổi hoặc có thể bạn tìm thấy một số sự kiện khác xảy ra không quá thường xuyên mà bạn có thể sử dụng để kích hoạt biên dịch thông thường.

+0

@ mike-shenk Chúng tôi cũng đã định cấu hình trình chỉnh sửa của mình để sử dụng cờ noResolve để biên dịch nhanh. Tuy nhiên, chúng tôi đang sử dụng mô-đun amd và cách tiếp cận này bị hỏng trong một trường hợp. Nếu chúng tôi nhập tệp và chỉ sử dụng nhập đó để mở rộng một lớp, tệp đó sẽ không được đưa vào javascript được phát ra. Điều này là do TS với noResolve sẽ giả định rằng "mở rộng" là để mở rộng một giao diện chứ không phải một lớp, vì vậy nó sẽ bỏ qua việc nhập đó. Bạn có thấy điều tương tự không? – Breck

Các vấn đề liên quan