2013-11-21 4 views
4

Так у меня есть каталог файлов, где два из файлов находятся непосредственно внутри папки:Грунт-browserify aliasMapping два глубоких уровней

views/view1.js 
views/view2.js 

Но один вложен уровень глубже

views/other/view3.js 

I хотите скомпилировать их с grunt-browserify используя отображение псевдонима, так что я могу требовать от них, как:

require('view1')

require('view2')

require('other/view3')

Так что я настроить простое отображение в grunt-browserify конфигурации:

{ 
    expand: true, 
    cwd: 'views/', 
    src: ['**/*.js'], 
    dest: '' 
} 

Первые два файла require() штраф, но последний не может быть найден. Картирование псевдонима, которое я использую, выглядит только на одном уровне. Как я могу заставить его пойти на каждый уровень, который я ему даю?

+0

'**/*. Js' должен работать, вы могли бы запустить его с' -V' флагом? И, возможно, дайте нам номера версий пакетов, которые вы используете, включая узел. –

ответ

5

Весь вариант aliasMappings кажется сломанным, потому что я даже не могу заставить их пример отображения работать правильно. Я нашел другое решение, которое использует aliasify (kudos to byronwong для this code). Это как моя рабочая Gruntfile выглядит следующим образом:

var util = require('util'); 
var aliasify = require('aliasify'); 

module.exports = function(grunt) { 

    // takes grunt-browserify aliasMappings config and converts it into an aliasify config. 
    function configureAliasify(aliasMappings) { 
    var expandedAliases = {}; 
    aliases = util.isArray(aliasMappings) ? aliasMappings : [aliasMappings]; 
    aliases.forEach(function (alias) { 
     grunt.file.expandMapping(alias.src, alias.dest, {cwd: alias.cwd}).forEach(function(file) { 
     var expose = file.dest.substr(0, file.dest.lastIndexOf('.')); 
     expandedAliases[expose] = './' + file.src[0]; 
     }); 
    }); 

    return require('aliasify').configure({ 
     aliases: expandedAliases 
    }); 
    } 

    // Create alias mappings with aliasify 
    var aliasMappings = configureAliasify({ 
    cwd: 'views', 
    src: ['**/*.js'], 
    dest: '' 
    }); 

    // Project configuration. 
    grunt.initConfig({ 
    browserify: { 
     dist: { 
     files: { 
      'build/app.js': ['client/entry.js'] 
     }, 
     options: { 
      debug: true, 
      transform: [aliasMappings] 
     } 
     } 
    } 
    }); 

    // Load the plugin that provides the "browserify" task. 
    grunt.loadNpmTasks('grunt-browserify'); 

    // Default task(s). 
    grunt.registerTask('default', ['browserify']); 

}; 

Файл client/entry.js теперь может требовать, чтобы все файлы, которые существуют в каталоге views в качестве псевдонимов.

Обратите внимание, что в то время как вышеупомянутое решение работает, aliasify больше не поддерживается в поле «tagify». Однако tagify принципиально отличается от aliasify, поэтому не совсем уверен, как будет выглядеть решение, использующее этот lib.

Update: После некоторых более бесполезный я понял, что это не обязательно использовать aliasify или tagify. В основном нужна функция отображения, которая принимает aliasMapping и возвращает массив alias. Это более или менее то, что grunt-browserify следует делать с aliasMapping, но по какой-то причине он не работает. Это то, что я закончил с:

var util = require('util'); 

module.exports = function(grunt) { 

    // Takes grunt-browserify aliasMappings config and converts it into an alias array 
    function aliasMappingsToAliasArray(aliasMappings) { 
    var aliasArray = []; 
    aliases = util.isArray(aliasMappings) ? aliasMappings : [aliasMappings]; 
    aliases.forEach(function (alias) { 
     grunt.file.expandMapping(alias.src, alias.dest, {cwd: alias.cwd}).forEach(function(file) { 
     var expose = file.dest.substr(0, file.dest.lastIndexOf('.')); 
     aliasArray.push('./' + file.src[0] + ':' + expose); 
     }); 
    }); 
    return aliasArray; 
    } 

    // Project configuration. 
    grunt.initConfig({ 
    browserify: { 
     dist: { 
     files: { 
      'build/app.js': ['client/entry.js'] 
     }, 
     options: { 
      debug: true, 
      alias: aliasMappingsToAliasArray({ 
      cwd: 'shared', 
      src: ['**/*.js'], 
      dest: '' 
      }) 
     } 
     } 
    } 
    }); 

    // Load the plugin that provides the "browserify" task. 
    grunt.loadNpmTasks('grunt-browserify'); 

    // Default task(s). 
    grunt.registerTask('default', ['browserify']); 

}; 
+0

Ты потрясающий! Теперь я могу исправить все свои пути :-) – FakeRainBrigand

+0

Вы всегда рады! Пожалуйста, проверьте комментарий, который я добавил к проблеме github. Он не будет работать так, как ожидалось во время просмотра, так как он не обновляет сопоставления. Но если вы можете жить с этим, он будет работать нормально :) – mekwall

+0

@FakeRainBrigand Не забудьте принять этот ответ, если он ответил на ваш вопрос :) – mekwall

2

Это aliasMapping конфигурация теперь работает, как ожидалось в v2 бета.

Вы можете установить его с npm install [email protected]

+0

Вы могли бы привести пример. Я до сих пор не могу заставить его работать. – mrbinky3000

+0

aliasMapping был удален из grunt-браузера. Новая опция теперь [alias] (https://github.com/jmreidy/grunt-browserify#alias), которая на самом деле не является прямой заменой. Ознакомьтесь с обновленным кодом Marcus Ekwall, я использую подобный подход и отлично работает. –

Смежные вопросы