2012-10-17 19 views
9

Aktualnie konfiguruję skrypt automatycznej kompilacji (z ) dla projektu opartego na . Dlatego chciałbym uruchomić / na wszystkich wymaganych plikach przed konkatenacją i zminimalizowaniem go r.js. Ponieważ folder js zawiera wiele plików programistycznych, których nie chcę lintować, nie mogę po prostu przekazać js/**/*.js do JSLint. Moja pierwsza myśl polegała na uruchomieniu r.js z optimizer: 'none', zlepieniu połączonego pliku, a następnie zminimalizowaniu go, ale nie jest to opcja z dwóch powodów. Najpierw będzie zawierał biblioteki dostawców, których nie chcę lintować, a drugi znaleźć linię z błędem, znaleźć klasę, znaleźć odpowiedni plik js w folderze dev, naprawić go, ponownie uruchomić r.js i na koniec spleść znowu jest sposobem na wiele kłopotów dla naszego przepływu pracy. Tak więc szukam możliwości podpięcia linting do procesu optymalizatora r.js lub przynajmniej uzyskać listę drzewa zależności requirejs w jakiś sposób, że mogę parsować i przekazać go do lint. Lub jakiekolwiek rozwiązanie praktyczne do zautomatyzowanego procesu, wymyślisz.Korzystanie z narzędzia JSLint/Hint z wymagającymi programami roboczymi

+0

Coś https://github.com/jshint/jshint#ignoring-files-and-directories? –

Odpowiedz

1

Ta odpowiedź rodzaju omija Grunt, ale to powinno działać na to, co chcesz zrobić. Sposób, w jaki bym to zrobił, to spojrzenie na r.js i próba nadpisania funkcji, która odbiera ścieżkę do różnych ładowanych modułów, przechwycenie nazwy modułu i wklejenie plików podczas ładowania r.js i kompilowanie modułów. Zrobiłem to tak:

var requirejs = require('requirejs'); 
var options = {/*r.js options as JSON*/}; 
var oldNewContext = requirejs.s.newContext; 
requirejs.s.newContext = function(){ 
    var context = oldNewContext.apply(this, arguments); 
    var oldLoad = context.Module.prototype.load; 
    context.Module.prototype.load = function(){ 
     var module = oldLoad.apply(this, arguments); 

     if(/\.js$/.test(this.map.url) && !/^empty:/.test(this.map.url)) 
      console.log(this.map.url); 

     return module; 
    } 
    return context; 
} 
requirejs.optimize(options) 

Następnie po uruchomieniu requirejs.optimize na modułach, należy uzyskać wszystkie niepuste adresy URL JavaScript zalogowany do konsoli. Zamiast logować je do konsoli, można użyć adresów URL do zindeksowania plików.

+0

Myślę, że właśnie tego szukałem, przetestuję to jutro. –

2

Lint pierwszy, skompiluj później. Po prostu bądź konkretny o plikach, które chcesz spleść i użyj! Przedrostek zignorować konkretne pliki:

grunt.initConfig({ 
    lint: { 
    // Specify which files to lint and which to ignore 
    all: ['js/src/*.js', '!js/src/notthisfile.js'] 
    }, 
    requirejs: { 
    compile: { 
     options: { 
     baseUrl: 'js/src', 
     name: 'project', 
     out: 'js/scripts.js' 
     } 
    } 
    } 
}); 

// Load the grunt-contrib-requirejs module. 
// Do `npm install grunt-contrib-requirejs` first 
grunt.loadNpmTasks('grunt-contrib-requirejs'); 

// Our default task (just running grunt) will 
// lint first then compile 
grunt.registerTask('default', ['lint', 'requirejs']); 
+0

To zdecydowanie dobre podejście, ale IMHO bardzo powtarzalne, ponieważ musisz utrzymywać dwa pliki (main.js i grunt) i właśnie tego staram się unikać. ... jakkolwiek dziękuję za odpowiedź. –

2

wolę nie przesłanianie metod r.js, albo można utworzyć niechcianą zależność od konkretnej wersji (musisz zaktualizować swój kod powinien r.js zmiany)

Jest to kod używam dla w tym samym celu, wykorzystując funkcję require na onBuildRead oraz fakt, że obiekty w javascriptu są przekazywane przez odniesienie. Upewniam się, że najpierw uruchamiam wymaganą kompilację, a następnie podświetlam źródła plików js.

Wadą jest to, że będziesz lint po zakończeniu kompilacji. Dla mojej konfiguracji to nie problem.

module.exports = function(grunt) { 



var jsHintOptions = { 
     options: { 
      curly: true, 
      eqeqeq: true, 
      eqnull: true, 
      browser: true, 
      globals: { 
       jQuery: true 
      } 
     }, 
     all: [] // <--- note this is empty! We'll fill it up as we read require dependencies 
    }; 

var requirejsOptions = { 
     compile: { 
      options: { 
       paths: { 
        "jquery": "empty:" 
       }, 
       baseUrl: "./", 
       name: "src/mypackage/main", 
       mainConfigFile: "src/mypackage/main.js", 
       out: 'build/mypackage/main.js', 
       onBuildRead: function (moduleName, path, contents) { 
        jsHintOptions.all.push(path); // <-- here we populate the jshint path array 
        return contents; 
       } 
      } 
     } 
    }; 

grunt.initConfig({ 
    pkg: grunt.file.readJSON('packages/mypackage.package.json'), 
    requirejs: requirejsOptions, 
    jshint: jsHintOptions 
}); 

// load plugin that enabled requirejs 
grunt.loadNpmTasks('grunt-contrib-requirejs'); 

// load code quality tool 
grunt.loadNpmTasks('grunt-contrib-jshint'); 


grunt.registerTask('default', ['requirejs', 'jshint']); // <-- make sure your run jshint AFTER require 
}; 
0

Zamiast zadanie lint, zainstalować obciążenia i skonfigurować grunt-contrib-jshint. Ma opcję ignores ignorowania określonych plików lub ścieżek plików.

Oto moje zadanie:

jshint: { 
    options: { 
     // options here to override JSHint defaults 
     boss : true, // Suppress warnings about assignments where comparisons are expected 
     browser : true, // Define globals exposed by modern browsers (`document`, `navigator`) 
     curly : false, // Require curly braces around blocks 
     devel : false, // Define `console`, `alert`, etc. (poor-man's debugging) 
     eqeqeq : false, // Prohibit the use of `==` and `!=` in favor of `===` and `!==` 
     "-W041" : false, // Prohibit use of `== ''` comparisons 
     eqnull : true, // Suppress warnings about `== null` comparisons 
     immed : true, // Prohibit the use of immediate function invocations w/o wrapping in parentheses 
     latedef : true, // Prohibit the use of a var before it's defined 
     laxbreak: true, // Suppress warnings about possibly unsafe line breaks 
     newcap : true, // Require you to capitalize names of constructor functions 
     noarg : true, // Prohibit the use of `arguments.caller` and `arguments.callee` 
     shadow : true, // Suppress warnings about var shadowing (declaring a var that's declared somewhere in outer scope) 
     sub  : true, // Suppress warnings about using `[]` notation, e.g. `person['name']` vs. `person.name` 
     trailing: true, // Trailing whitespace = error 
     undef : false, // Prohibit the use of explicitly undeclared variables 
     unused : false, // Warn when you define and never use your variables 
     white : false, // Check JS against Douglas Crawford's coding style 
     jquery : true, // Define globals exposed by jQuery 
     // Define global functions/libraries/etc. 
     globals : { 
      amplify : true 
     }, 
     ignores: [ 
      'src/app/templates/template.js', 
      'src/scripts/plugins/text.min.js' 
     ] 
    }, 
    gruntfile: { 
     src: 'Gruntfile.js' 
    }, 
    app: { 
     src: 'src/app/**/*.js' 
    }, 
    scripts: { 
     src: 'src/scripts/**/*.js' 
    } 
}