回答:
Magento 2の新しいテーマを作成することは、以前にMagentoを使用した経験があるとしても、困難な場合があります。まともな開発者はコアMagentoファイルを変更せず、代わりに「ラッパー」を作成します。そのため、将来のパッチのインストールや更新では、すべての変更が上書きされたり、誤ってマージされたりすることはありません。
Gruntfile.jsおよびthemes.jsファイルを拡張する
新しいテーマを作成したとしましょう。ドキュメントMagento 2のドキュメントからわかるようにdev/tools/grunt/configs/themes.js
、テーマをリストに追加するファイルを変更する必要があるため、Gruntはpub/static
フォルダーにファイルをコンパイル/シンボリックリンク/ CSS /レスファイルをコンパイルできます。
ステップ1:/dev/tools/grunt/configs/themes.yourthemename.js
デフォルトのthemes.js
ファイルを次のように拡張するファイルを作成します
'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);
ステップ2:Gruntfile.js
ファイルで拡張Gruntfile.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);
ステップ3:これで、次のようなテーマのGruntタスクを実行できます。
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
はあなたが得ますWarning: Required config property "clean.yourthemename" missing. Used --force, continuing.
か?clean:yourthemename
コマンドでテーマをクリーンアップできるのは奇妙ですが、exec
コマンドでエラーなしにこれを実行できるはずです。
dev/tools/grunt/configs
実行require('./themes')
、例があるclean.js
とexec.js
内部のconfigsディレクトリいます。これにより、これらのファイルにはから新しく追加されたテーマがなくなると思いますthemes.yourthemename.js
。それでもこの設定は機能しますが、Required config property "clean.yourthemename" missing.
エラーの原因を特定できません...
ときJEV Mokrousovのソリューションは、あなたに合わない、あなたが試みることができる2つの選択肢があります:
magento/magento2-base
パッケージのインストール中に、ファイルGruntfile.js
とフォルダーdev/tools
がパッケージからルートフォルダーにコピーされ、Magento2ベースcomposer.json
マッピング(vendor/magento/magento2-base/composer.json
プロジェクトで参照)が原因で既存のファイルが上書きされます。
{
"extra": {
"map": [
[
"dev/tools",
"dev/tools"
],
[
"Gruntfile.js",
"Gruntfile.js"
]
]
}
}
Gruntfile.js
とのdev/tools/grunt/configs/themes.js
どこかにバージョンを配置できます(これらはのビルドディレクトリ構造内に配置しましたbuild/tools/grunt/
)。
これで、特定のComposerイベントの前または後に追加のコマンドまたはスクリプトを追加する可能性があります。Composerのpost-install-cmd
イベントにフックして、これらのファイルのバージョンをMagentoのコアファイルにコピーできます。これをプロジェクトのに追加する必要がありますcomposer.json
:
{
"scripts": {
"post-install-cmd": "cp -vfp build/tools/grunt/Gruntfile.js . && cp -vfp build/tools/grunt/themes.js dev/tools/grunt/configs/"
}
}
これはあなたを表示します:
> 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’
magento/magento2-base
パッケージがファイルをプロジェクトのルートにマッピングするように(上記のように)、これも自分で行うことができます。
テーマを別のComposerパッケージに入れることができます。このためには、別のリポジトリを作成する必要があります。Magentoのドキュメントはすでにこのプロセスを説明しています:「テーマをComposerパッケージにする」を参照してください
これをテーマのcomposer.json
ファイルに追加します。
{
"extra": {
"map": [
[
"dev/tools/grunt/configs/themes.js",
"dev/tools/grunt/configs/themes.js"
],
[
"Gruntfile.js",
"Gruntfile.js"
]
]
}
}
最初のパスがテーマパッケージ内の正しい場所を指していることを確認してください。パスは、テーマのcomposer.json
ファイルの場所からの相対パスです。
警告:
どちらのソリューションもコアファイルを上書きしています。これにより、パッチまたはアップグレードの問題が発生する可能性があります。パッチを適用してアップグレードするときは、何が変更されるかを常に確認し、これらの変更をこれらのコアファイルのコピーに適用する必要があります。
多くの人が完全にテーマを最初から構築するのではなく、親テーマを拡張することに気づくと思いthemes.yourThemeName.js
ます。ここでは、ファイルに提供される若干異なる構文をいくつか示します。テーマの構成を最初から完全に定義するのではなく、親から継承して、新しいもの/異なるものを追加/変更します。
この例では、ブランクの構成から継承し、テーマ名を設定し、テーマの追加ルートファイルを追加しています。これの利点は、親テーマからすべてのファイルを具体的に宣言する必要がないことです。定期的に更新を受け取る親テーマを拡張する人にとって、これは有益な場合があります。(ここでの私のシナリオ例としてブランクを使用することは、おそらく最も適切な状況ではありませんが、ここで適用される概念が重要です)。
'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 });