2014-11-19 16 views
12

Kodumu biraz daha iyi organize etmek için /gulp klasöründe gulpfile.js dosyamı birkaç dosyaya böldüm. Ama şimdi debug (boolean) değişkenini, dahil olmakta olan gulp komutunun davranışını değiştirecek dosyalara aktarmak istiyorum (en sonunda komut satırı argümanlarını kullanacağım, ama şimdilik sadece bir değişkenle çalışmayı istiyorum).Node.js: global değişkeni require() ile eklenmiş bir dosyaya nasıl geçiririm?

Bu kurulumda, yeoman açısal/gulp paketinde gördüğüm bir yöntemi kullanarak, require-dir adında bir npm modülü kullanıyorsunuz (bu, /gulp klasöründe bulunan tüm * .js dosyalarını yükler. belirlenen gulp görevler kümesi).

gulpfile.js: Böyle bir şey yüklemek istiyorum

var gulp = require('gulp'), 
    run = require('run-sequence'), 
    debug = true; 

require('require-dir')('./gulp'); 

gulp.task('default', ['build', 'server', 'watch', '...']); 

...

yudum/build.js: Yani

var gulp = require('gulp'), 
    plumber = require('gulp-plumber'), 
    ...; 

gulp.task('build', function() { 
    console.log(debug); 
}); 

Ben komut gulp koşmak , default görevini çalıştırır, build.js'yi yükler ve sonra execut build gulp görevi. Ancak maalesef, debug undefined olduğu görülüyor.

Bunu nasıl çalıştırabilirim?

Sadece module.exports() ve düğümün require() yöntemi kullanılarak bakıyordu, ama sonra ana gulpfile.js dosyasından çalıştırılabilir diye (içinde, ilan dahil dosyanın içine yudum görevi nasıl çözemedim

istenen dizi).

Kimse yardım edebilir mi? Teşekkürler

cevap

9

Normal modül yolu, gerçekten. Ben sadece tüm değişkenler tek nesne oluşturmak

... 
var loadGulp = require('require-dir/gulp'); 
... 
var debug = true; 
loadGulp(debug); 
+1

Teorik olarak 'loadGulp()' yöntemini çalıştırdıktan sonra, gulp görevi kaydedilmeli, bu yüzden 'gulp.start ('build')' yi çalıştırabiliyor olmalı ve kullanılabilir olacak ...? – BuildTester1

+1

doğru. 'require (' require-dir/gulp ') 'işlemi artık bir işlevi yükler ve bu işlevleri çalıştırmak artık gulp görevini kaydeder, daha sonra başkaları gibi çağrılabilir. –

+0

İhtiyaç duyma dosyasının kendi kendine içe aktarılması için bir yol var mı? Bu yüzden bu fonksiyonu çağırmam gerekmez mi? yani. 'require ('gulp/build.js');' yerine build = require ('gulp/build.js') 'yerine? – BuildTester1

6

Node.js, global adında tek bir global değişken sunar; bu, aslında tüm modüllerde aynı örnektir (her modülde farklı olan module'un aksine). global'daki değerleri ayarlayarak gerçekten global hale gelirler. Ek bir bonus olarak, global. ile global değişkenlere önek erişimine ihtiyacınız yoktur. Hem global.foo hem de yalnızca foo, kapsamda foo adlı başka bir değişkeniniz olmadığı sürece eşdeğerdir.

+0

bu gerçekten kötü bir fikir, e özel olarak başka bir modül küresel duruma geçer. Küresel durumu asla kirletmemelisiniz, sadece modülünüzü çalıştırmanız gereken tam işlevli fonksiyonu elde etmek için argümanlarınızı ilettiğiniz bir jeneratör işlevini döndürmeniz yeterlidir. –

+0

Genel olarak globals'tan olabildiğince kaçınmak istediğinizi kesinlikle kabul etsem de, hem yararlı hem de uygun olduğu zamanlar vardır. Bu, Node'da nasıl yapılacağını bilmek kullanışlı olduğunu söyledi. –

+0

bu, böyle zamanlardan biri değildir. –

1

: o zaman

module.exports = function(debug) { 
    "use strict"; 

    var gulp = require('gulp'), 
     plumber = require('gulp-plumber'), 
     ...; 

    gulp.task('build', function() { 
    console.log(debug); 
    }); 
}; 

ve gibi ana dosyadaki diyoruz: Hemen aslında doğru gerektirir-muktedir modülüne şey ihraç değil o gulp/build.js dosyayı değiştirmek İçinde bir modül olarak dışa aktarıyorum, böylece tüm görev dosyalarım boyunca kullanabilirim. Örneğin

js/görevler/

module.exports = { 
    myBool: true 
}; 

js/görevler/sos variables.js.js

var gulp = require('gulp'), 
    $ = require('gulp-load-plugins')(), 
    log = $.util.log, 
    vars = require('./variables'); 

gulp.task('sass', function() { 
    log('myBool: ' + vars.myBool); // logs "myBool: true" 
    vars.myBool = false; 
}); 

js/görevler/build.js

var gulp = require('gulp'), 
    $ = require('gulp-load-plugins')(), 
    log = $.util.log, 
    vars = require('./variables'); 

gulp.task('build', function() { 
    log('myBool: ' + vars.myBool); // logs "myBool: false" 
}); 

/gulpfile.js Sonra

sen/her yerden bu değişkenleri set alabilirsiniz:

var gulp = require('gulp'), 
    $ = require('gulp-load-plugins')(), 
    runSequence = require('run-sequence'), 
    vars = require('./js/tasks/variables'), 
    requireDir = require('require-dir')('./js/tasks'); 

gulp.task('production', function(){ 
    runSequence('sass', 'build'); 
}); 
İlgili konular