Jak rozszerzyć domyślną konfigurację Magento 2 Grunt bez dotykania / edytowania podstawowych plików, takich jak Gruntfile.js
i dev/tools/grunt/configs/themes.js
?
Jak rozszerzyć domyślną konfigurację Magento 2 Grunt bez dotykania / edytowania podstawowych plików, takich jak Gruntfile.js
i dev/tools/grunt/configs/themes.js
?
Odpowiedzi:
Stworzenie nowego motywu dla Magento 2 może być wyzwaniem, nawet jeśli wcześniej miałeś doświadczenie z Magento. Przyzwoici programiści nie zmieniają podstawowych plików Magento, ale zamiast tego tworzą „opakowania”, więc w przyszłości instalując łatki i wykonując aktualizacje, nie będziesz mieć sytuacji, gdy wszystkie twoje zmiany zostaną zastąpione lub niepoprawnie scalone.
Rozszerz pliki Gruntfile.js i themes.js
Załóżmy, że utworzyłeś nowy motyw i jak wiemy z dokumentacji Magento 2 doc , będziesz musiał zmienić plik dev/tools/grunt/configs/themes.js
dodając motyw do listy, aby Grunt mógł skompilować / symlink / skopiować css / mniej plików do pub/static
folderu.
Krok 1: Utwórz /dev/tools/grunt/configs/themes.yourthemename.js
plik, który rozszerza domyślny themes.js
plik jako
'use strict';
var defaultThemes = require('./themes'),
_ = require('underscore');
var yourTheme = {
yourthemename: {
area: 'frontend',
name: '<vendor>/<yourthemename>',
locale: 'en_US',
files: [
'css/main',
],
dsl: 'less'
}
};
module.exports = _.extend(defaultThemes, yourTheme);
Krok 2: Rozszerz za Gruntfile.js
pomocą plikuGruntfile.yourthemename.js
'use strict';
var defaultGruntfile = require('./Gruntfile'),
_ = require('underscore');
var yourthemeGruntfile = {};
yourthemeGruntfile.themes = require('./dev/tools/grunt/configs/themes.yourthemename');
module.exports = _.extend(defaultGruntfile, yourthemeGruntfile);
Krok 3: Teraz możesz uruchomić zadania Grunt dla swojego motywu, takie jak:
grunt --gruntfile=Gruntfile.yourthemename.js clean:yourthemename
grunt --gruntfile=Gruntfile.yourthemename.js exec:yourthemename
grunt --gruntfile=Gruntfile.yourthemename.js less:yourthemename
grunt --gruntfile=Gruntfile.yourthemename.js watch:yourthemename
exec:yourthemename
, dostajesz Warning: Required config property "clean.yourthemename" missing. Used --force, continuing.
? Dziwne, że jestem w stanie wyczyścić mój motyw za pomocą clean:yourthemename
polecenia, ale wydaje mi się, że exec
polecenie powinno to zrobić bez błędu.
dev/tools/grunt/configs
wykonać require('./themes')
, przykłady clean.js
i exec.js
wewnątrz tego katalogu configs. Co prowadzi mnie do wniosku, że w tych plikach będzie brakować naszego nowo dodanego motywu themes.yourthemename.js
. Mimo to ta konfiguracja działa, po prostu nie mogę ustalić przyczyny mojego Required config property "clean.yourthemename" missing.
błędu ...
Kiedy rozwiązanie Jev Mokustyova ci nie pasuje, możesz wypróbować dwie alternatywy:
Podczas instalacji magento/magento2-base
pakietu plik Gruntfile.js
i folder dev/tools
zostaną skopiowane z pakietu do folderu głównego, zastępując wszystkie istniejące pliki, spowodowane przez podstawowe composer.json
mapowanie Magento2 (patrz vendor/magento/magento2-base/composer.json
w projekcie):
{
"extra": {
"map": [
[
"dev/tools",
"dev/tools"
],
[
"Gruntfile.js",
"Gruntfile.js"
]
]
}
}
Możesz umieścić swoje wersje Gruntfile.js
i dev/tools/grunt/configs/themes.js
gdzieś (umieściliśmy je w naszej strukturze katalogu kompilacji build/tools/grunt/
).
Teraz istnieje możliwość dodania dodatkowych poleceń lub skryptów przed lub po określonych zdarzeniach Composer. Moglibyśmy dołączyć do post-install-cmd
wydarzenia Kompozytora, aby skopiować nasze wersje tych plików na podstawowe Magento. Powinieneś dodać to do swojego projektu composer.json
:
{
"scripts": {
"post-install-cmd": "cp -vfp build/tools/grunt/Gruntfile.js . && cp -vfp build/tools/grunt/themes.js dev/tools/grunt/configs/"
}
}
To pokaże ci:
> cp -vfp build/tools/grunt/Gruntfile.js . && cp -vfp build/tools/grunt/themes.js dev/tools/grunt/configs/ ‘build/tools/grunt/Gruntfile.js’ -> ‘Gruntfile.js’ ‘build/tools/grunt/themes.js’ -> ‘dev/tools/grunt/configs/themes.js’
Podobnie jak magento/magento2-base
pakiet mapuje pliki do katalogu głównego projektu (jak opisano powyżej), możesz to zrobić sam.
Możesz umieścić swój motyw w osobnym pakiecie kompozytora. W tym celu musisz utworzyć osobne repozytorium. Dokumenty Magento już opisują ten proces: patrz „Zrób swój motyw jako pakiet kompozytora”
Teraz dodaj to do composer.json
pliku swojego motywu :
{
"extra": {
"map": [
[
"dev/tools/grunt/configs/themes.js",
"dev/tools/grunt/configs/themes.js"
],
[
"Gruntfile.js",
"Gruntfile.js"
]
]
}
}
Upewnij się, że pierwsza ścieżka wskazuje właściwą lokalizację w pakiecie motywów. Ścieżki są względne od położenia composer.json
pliku motywu .
Ostrzeżenie:
oba rozwiązania zastępują podstawowe pliki. Może to powodować problemy z łatkami lub aktualizacjami. Podczas łatania i uaktualniania zawsze powinieneś sprawdzić, co będzie zmieniane i zastosować te zmiany w swoich kopiach tych podstawowych plików.
Ponieważ jestem pewien, że wiele osób rozszerzy kompozycję nadrzędną zamiast całkowicie budować kompozycję od podstaw, oto nieco inna składnia themes.yourThemeName.js
pliku. Zamiast całkowicie definiować od podstaw konfigurację naszego motywu, dziedziczymy go od rodzica, a następnie dołączamy / modyfikujemy to, co nowe / inne.
W tym przykładzie dziedziczymy z konfiguracji pustej, ustawiając nazwę motywu i dodając dodatkowe pliki główne naszego motywu. Zaletą tego jest to, że nie trzeba specjalnie deklarować wszystkich plików z kompozycji nadrzędnej. Może to być korzystne dla osób rozszerzających temat nadrzędny, które okresowo otrzymują aktualizacje. (Użycie pustego miejsca jako mojego przykładowego scenariusza tutaj prawdopodobnie nie jest najodpowiedniejszą sytuacją, ale znaczenie mają tu zastosowane tu pojęcia).
'use strict';
// If your theme's parent has it's own "themes.someOtherName.js" file,
// require that file instead of Magento's native "themes.js" file.
var defaultThemes = require('./themes'),
_ = require('underscore');
// Update "blank" to the name of your parent theme's Grunt config.
// Update "<vendor>/<yourThemeName>"
var yourThemeNameConfig = _.extend(defaultThemes.blank, {name:'<vendor>/<yourThemeName>'});
// Change this to add your root files, add more as necessary
yourThemeNameConfig.files.push('css/new-file');
// Change "yourThemeName" to what you want to reference in your Grunt command.
module.exports = _.extend(defaultThemes, { yourThemeName: yourThemeNameConfig });