Централизовать node_modules в проекте с подпроектом
Можно ли настроить grunt так, чтобы у вас были требуемые модули в центральной точке?
У меня есть следующая структура проекта
-Project
-- subproject
-- subproject
-- subproject
Я создаю проект через grunt со всеми подпроектами, и я тоже могу построить каждый подпроект.
В настоящее время у меня есть Gruntfile.js, package.json и папка node_modules (~ 50mb) со всеми необходимыми модулями в каждом подпроекте и на корневом уровне.
Таким образом, можно иметь папку node_modules только на одном уровне, например. на корневом уровне и подпроекты относятся к node_modules на корневом уровне?
-Project
--subproject
--subproject
--subproject
--node_modules
Есть ли способ ссылаться на папку node_module через package.json или что-нибудь еще?
Edit:
Gruntfile.js(уровень подпроекта)
/*global module:false */
/*jshint node:true */
module.exports = function(grunt) {
"use strict";
// ================================================================================
// project configuration
// ================================================================================
grunt.initConfig({
pkg : grunt.file.readJSON('package.json'),
jshint: {
globals : {
d3:true,
Modernizr:true,
tempo:true
},
options: grunt.file.readJSON('.jshintrc')
},
csslint: {
subproject: {
src: 'css/**/*.css'
}
},
htmllint : {
subproject: {
src: 'html/**/*.html'
}
},
clean : [ 'output' ],
less : {
options: {
paths: ['./']
},
src: {
expand: true,
cwd: 'css/',
src: ['**/*.less'],
dest: 'css/',
ext: '.css'
}
},
copy: {
subproject: {
files: [
{src: ['img/**', 'js/**', 'folderX/**','!**/*.less'], dest: 'output/subproject/'}
]
}
}
});
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-html');
grunt.loadNpmTasks('grunt-css');
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-copy');
// ================================================================================
// default task
// ================================================================================
grunt.registerTask('default', ['clean', 'less', 'csslint', 'htmllint', 'copy']);
};
package.json(уровень подпрограммы)
{
"description": "subproject",
"title": "Lorem Ipsum",
"devDependencies": {
"grunt-contrib-watch": "~0.2.0",
"grunt-contrib-jshint": "~0.1.1",
"grunt-contrib-less": "~0.5.0",
"grunt-contrib-uglify": "~0.1.1",
"grunt-contrib-copy": "~0.4.0",
"grunt-contrib-qunit": "~0.1.1",
"grunt-css": "~0.5.4",
"grunt-contrib-clean": "~0.4.0",
"grunt-html": "~0.3.3",
"grunt-contrib-concat": "~0.1.3"
}
}
BR,
mybecks
Ответы
Ответ 1
Это работает из коробки. npm
ищет node_modules
в текущем каталоге и всех его родительских каталогах, а затем ищет глобальное местоположение.
Итак, вы можете это сделать:
-Project
--subproject1
---node_modules
--subproject2
--subproject3
--node_modules
subproject1
будет иметь доступ ко всем npms внутри Project/subproject1/node_modules
и Project/node_modules
, тогда как subproject2
и subproject3
будут находить только те внутри Project/node_modules
Update
Существует очень небольшая документальная функция, называемая коллекциями grunt. Для этого требуется немного настройки, но вам не понадобится копия всех ваших плагинов grunt в каждом подпроекте.
Здесь макет файла
-Project
--subproject1
---node_modules
----grunt-collection
-----package.json
--subproject2
...
--subproject3
...
--node_modules
---grunt
---grunt-contrib-concat
---grunt-contrib-jshint
---grunt-contrib-qunit
---grunt-contrib-watch
---grunt-html
---grunt-contrib-clean
---grunt-contrib-copy
---grunt-contrib-less
---grunt-contrib-uglify
---grunt-css
--package.json
Проект /package.json
{
"description": "subproject",
"version": "0.0.0",
"name": "Lorem",
"title": "Lorem Ipsum",
"devDependencies": {
"grunt": "*",
"grunt-contrib-watch": "~0.2.0",
"grunt-contrib-jshint": "~0.1.1",
"grunt-contrib-less": "~0.5.0",
"grunt-contrib-uglify": "~0.1.1",
"grunt-contrib-copy": "~0.4.0",
"grunt-contrib-qunit": "~0.1.1",
"grunt-css": "~0.5.4",
"grunt-contrib-clean": "~0.4.0",
"grunt-html": "~0.3.3",
"grunt-contrib-concat": "~0.1.3"
}
}
Проект /subproject 1/package.json
{
"description": "subproject",
"version": "0.0.0",
"name": "Lorem",
"title": "Lorem Ipsum",
"devDependencies": {
}
}
Вывод фрагмента Project/subproject1/Gruntfile.js (вам нужна только задача сбора grunt).
grunt.loadNpmTasks('grunt-collection');
// grunt.loadNpmTasks('grunt-contrib-jshint');
// grunt.loadNpmTasks('grunt-html');
// grunt.loadNpmTasks('grunt-css');
// grunt.loadNpmTasks('grunt-contrib-less');
// grunt.loadNpmTasks('grunt-contrib-copy');
Проект /subproject 1/ node_modules/grunt-collection/package.json
{
"description": "subproject",
"version": "0.0.0",
"name": "Lorem",
"title": "Lorem Ipsum",
"dependencies": {
"grunt-contrib-watch": "~0.2.0",
"grunt-contrib-jshint": "~0.1.1",
"grunt-contrib-less": "~0.5.0",
"grunt-contrib-uglify": "~0.1.1",
"grunt-contrib-copy": "~0.4.0",
"grunt-contrib-qunit": "~0.1.1",
"grunt-css": "~0.5.4",
"grunt-contrib-clean": "~0.4.0",
"grunt-html": "~0.3.3",
"grunt-contrib-concat": "~0.1.3"
},
"keywords": ["gruntcollection"]
}
Ключ состоит в создании в каждом из ваших подпроектов небольшого модуля с пакетом package.json, который включает в себя keyword
gruntcollection
и включает в себя зависимости, которые использует Grunfile.
Затем Grunt загрузит их с использованием той же стратегии require
, что означает, что они могут быть найдены в node_modules
вашего родительского проекта.
Предостережение: способ использования коллекции grunt с использованием тега зависимостей package.json, это означает, что вы не можете установить его с установкой npm, но вы должны иметь возможность хранить его в качестве источника.
Ответ 2
Я создал модуль npm load-grunt-parent-tasks, чтобы исправить проблему. Это было вызвано ответом на то, что Паскаль Беллонкл дал и использует взлом gruntcollection
.
Все, что вам нужно сделать, это выполнить модуль, передать его grunt
и объект конфигурации, и он сделает все остальное.
module.exports = function(grunt) {
require('load-grunt-parent-tasks')(grunt, {
config: 'package.json',
pattern: 'grunt-*',
scope: 'dependencies',
module: 'grunt-collection'
});
};
Вы можете отфильтровать задачи, которые вы хотите загрузить, на основе шаблона глобуса, который вы передаете на pattern
.
Вы можете проверить модуль на Npm: https://www.npmjs.org/package/load-grunt-parent-tasks
Ответ 3
Другое решение, найденное в https://github.com/gruntjs/grunt/issues/696
module.exports = function (grunt) {
grunt.file.expand('../node_modules/grunt-*/tasks').forEach(grunt.loadTasks);
}
Ответ 4
Ниже приведено обходное решение.
Измените Gruntfile.js.
module.exports = function (grunt) {
var cwd = process.cwd();
process.chdir(cwd+'/../');
require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);
process.chdir(cwd);
}