Centralizacja modułów węzła w projekcie za pomocą podprojektu
Czy można skonfigurować grunt w taki sposób, że wymagane moduły znajdują się w centralnym punkcie?
Mam następującą strukturę projektu
-Project
-- subproject
-- subproject
-- subproject
Buduję projekt poprzez grunt ze wszystkimi podprojektami i mogę zbudować każdy podprojekt dla siebie. Obecnie mam Gruntfile.js, paczka.json & folder node_modules (~50MB) ze wszystkimi wymaganymi modułami w każdym podprojekcie i na poziomie głównym.
Czy więc możliwe jest posiadanie katalogu node_modules tylko na jednym poziomie, dla np. na poziomie root i podprojekty odnoszą się do node_modules na poziomie root?
-Project
--subproject
--subproject
--subproject
--node_modules
Czy istnieje sposób na odwołanie się do folderu node_module za pomocą pakietu.json czy coś jeszcze?
Edit:
Gruntfile.js (poziom podprojektu)
/*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']);
};
Pakiet.JSON (poziom subproejct)
{
"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
4 answers
To działa po wyjęciu z pudełka. npm
szuka node_modules
w bieżącym katalogu i wszystkich jego katalogach nadrzędnych, a następnie szuka w lokalizacji globalnej.
Więc możesz nawet to zrobić:
-Project
--subproject1
---node_modules
--subproject2
--subproject3
--node_modules
subproject1
będzie miał dostęp do wszystkich npm wewnątrz Project/subproject1/node_modules
i Project/node_modules
, podczas gdy subproject2
i subproject3
znajdą tylko te wewnątrz Project/node_modules
Update
Istnieje bardzo niewiele udokumentowanych cech zwanych zbiorami Grunta. Wymaga trochę konfiguracji, ale nie będziesz potrzebował kopii wszystkich Twoje wtyczki grunt w każdym podprojektie.
Oto układ pliku
-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
Projekt / pakiet.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"
}
}
Projekt / podproject1 / pakiet.json
{
"description": "subproject",
"version": "0.0.0",
"name": "Lorem",
"title": "Lorem Ipsum",
"devDependencies": {
}
}
Project / subproject1 / Gruntfile.js fragment (potrzebujesz tylko zadania grunt-collection).
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');
Project / subproject1/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"]
}
Kluczem jest stworzenie w każdym podprojektie małego modułu z paczka.json, który obejmuje keyword
gruntcollection
i zawiera zależności, których używa Twój Grunfile.
Grunt załaduje je używając tej samej strategii require
, co oznacza, że można je znaleźć w node_modules
twojego projektu nadrzędnego.
Zastrzeżenie: sposób, w jaki kolekcja grunt działa, używając znacznika zależności pakietu.json, oznacza to, że nie można go zainstalować za pomocą npm install, ale powinieneś być w stanie przechowywać kontrolę źródła.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-06 19:33:59
Stworzyłem moduł npm load-grunt-parent-task, aby rozwiązać problem. Został zainspirowany odpowiedzią, którą dał Pascal Belloncle i używa hakera gruntcollection
.
Wszystko, co musisz zrobić, to zażądać modułu, przekazać go grunt
i obiekt config, a on zrobi resztę.
module.exports = function(grunt) {
require('load-grunt-parent-tasks')(grunt, {
config: 'package.json',
pattern: 'grunt-*',
scope: 'dependencies',
module: 'grunt-collection'
});
};
Możesz filtrować zadania gruntowe, które chcesz załadować na podstawie wzorca globbingu, który przekazujesz pattern
.
Możesz sprawdzić moduł na Npm: https://www.npmjs.org/package/load-grunt-parent-tasks
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:00:02
Inne rozwiązanie, Znalezione w https://github.com/gruntjs/grunt/issues/696
module.exports = function (grunt) {
grunt.file.expand('../node_modules/grunt-*/tasks').forEach(grunt.loadTasks);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-09 09:51:48
Poniżej znajduje się proste obejście.
Zmień Plik Gruntfile.js.
module.exports = function (grunt) {
var cwd = process.cwd();
process.chdir(cwd+'/../');
require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);
process.chdir(cwd);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-09 09:28:14