在VCS下,Magento 2项目的首选结构是什么?


15

当我开始一个新的M2项目时,我要做的第一件事是通过composer安装核心:

composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition

现在,我可以在下编写我的自定义模块和主题app/code。然后,我composer.*将整个app/code文件夹添加到我的VCS中。到目前为止,一切都很好。

假设现在我想为我的项目使用一些构建工具,比如说Grunt或Gulp。

  1. 如果我自己提交Gruntfile.js,克隆仓库后magento/magento2-base运行时,它将被程序包覆盖composer install

  2. 如果我提交了我gulpfile.js,我真的不能在a中定义我的依赖package.json,因为它也会被magento/magento2-base

  3. 如果我决定使用Magento的Grunt设置并希望通过编辑/dev/tools/grunt(例如themes.js)下的文件来自定义它,则不能,因为我的更改将被覆盖magento/magento2-base

我的理解是,您实际上无法在文档根目录中做很多事情。对于这个问题,当然有很多解决方案:

  • 我可以git checkout -在安装后立即运行以重置自己的文件
  • 我可以将构建文件存储在专用文件夹中,/build例如
  • 我可以使用其他构建工具,例如Phing,Ant或Rake(尽管我的前端开发人员不会那么高兴)
  • 我可以替换magento/magento2-base为具有针对核心文件的自定义映射的自定义包(虽然不是最佳选择,但是,这是一个选择)

我个人不喜欢所有这些选项,因此我想知道是否有一种首选或更好的方法来实现我要做的事情。

有人有同样的问题吗?您是如何解决的?您如何在VCS下构建项目?

更新

与项目设置有关的一个额外要点。在实验中,我注意到Magento作曲家安装程序具有文件覆盖标志:

"extra": {
    "magento-force": "override"
}

如果我没记错的话,它在内部被视为布尔值,因此我尝试将其设置false为跳过重写。当我运行时composer install,由于文件已存在,安装失败。基本上,如果我不让Magento覆盖文件,就无法安装。

那么,该标志的目的是什么?是否只想对我进行检查?老实说,这对我来说没有多大意义,但也许有人可以阐明这个话题。


我很想知道其他人的回答。理想情况下,我认为我们希望将Magento Core保留在主仓库之外,并将其限制在我们创建的模板以及我们添加或修改的任何自定义插件中。然后在构建时,我们引用核心+我们的项目存储库,并从存储库构建应用程序工件。这是我最近在M1上一直使用的方法,我想知道Magento的官方建议是否要在完全支持Composer的情况下对M2做类似的事情。
布莱恩(Bryan'BJ')Hoffpauir

在较新的M2版本中Gruntfile.jsgulpfile.jspackage.json问题已解决。问题解决在这个问题上仍然适用于新的Magento 2个版本,当你需要改变themes.jsindex.php.htaccess为实例。
7ochem '18

Answers:


4

简而言之,我们正在寻找需要定制的文件。例如,如果人们需要修改index.php,请找出如何将Magento随附的标准文件与本地自定义需求分开。一旦实现,就有可能有一个“所有项目都可以使用的真正的.gitignore”。也就是说,使用.gitignore可以轻松地将整个项目目录提交给Git,这是“ composer install”将为您获取的所有内容(而在安装补丁或升级时,“ composer update”将替换的所有内容)。

从长远来看,目标是尽可能缩短.gitignore。例如,将更多内容推送到“ vendor”目录下的模块中。

然后

  1. 对于您不想在项目之间共享的所有内容,请将其保留在应用程序/代码下并在主项目存储库中提交。
  2. 您希望本地开发的所有内容都可以更轻松地在项目之间共享,放在单独的GIT存储库中并通过composer安装,这样最终可以归到“供应商”之下。(可以是本地作曲家仓库,也可以直接从GIT安装。)

这样,您仍然可以从上至下git提交整个项目树,捕获composer.json和composer.lock文件(仅提交应用程序/代码不会)。.gitignore将排除“ vendor”目录和其他不需要的文件。

这使您在其他讨论中提到的两全其美。当前的痛苦是.gitignore文件的长度和复杂性,补丁程序安装目前消除了一些本地自定义(例如,在index.php中)。短期解决方法-从.gitignore中删除index.php,并在安装补丁程序时检查丢失的更改(git diff),然后手动重新应用。


好的,所以您会在不久的将来更改一些内容,太好了!我想知道这个"magento-force": "override"标志是否可能有用。目前,它并没有完全按照我的期望进行。万一您编辑或扩展了您的index.php或任何其他“核心”文件,只需告诉Magento不要覆盖您的更改即可。有什么意义吗?
fmrng

3

有一个简单的解决方案可以解决您的问题:不要更改核心文件;)Magento基于扩展代码而不更改代码。

第一件事是,您不应该将整个应用程序/代码文件夹放在一个vcs存储库中。每个Magento组件(模块,主题等)都应该是一个存储库。

如果要更改/扩展前端,则应创建一个新主题并将该主题视为您的grunt项目,而不是整个Magento2实例。

要在您的项目中安装主题,您可以通过composer轻松地直接从vcs存储库中提取主题


好吧,该app/code文件夹专门用于自定义Magento。我对当前M2的理解是,它将app/code取代app/code/localM1中的内容,并且可以通过composer在下的社区模块进行安装vendor。我们有一些项目带有大量的模块,还有几个主题。您的建议将无法管理。
fmrng

嘿,我们以这种方式管理包含100多个组件的项目。关键是保持模块较小,并管理模块之间的作曲家依赖性。您可以根据自己的需要克隆magento项目存储库,然后将所有组件添加到您的项目中
David Verholen

如果您对当前的设置感到满意,那就很好。老实说,我觉得这很麻烦。这意味着您有100多个git存储库,并且每次更改某些内容时都必须打开一个特定项目,提交更改并运行composer update。那你在哪里提交composer.lock呢?如果您有10个以上的开发人员在同一个项目上工作,结果可能会很混乱。当然,我们确实有很多通过composer安装的通用模块(甚至包括主题),但是为清楚起见,应在同一存储库中对特定于项目的代码进行版本控制。
fmrng

我并不是说您做错了,我觉得我的口味有些复杂。出于兴趣,您如何使用这种设置检查您的回购历史记录?你怎么能使用的功能,如git blamegit log当代码分散在多个组件?您是否运行集成测试以确保一切正常?
fmrng

去年,我们在内部进行了讨论,自从我们决定将其设为1repo = 1module以来,部署就变得非常简单。重点是您不会作任何一点改动就对作曲家进行更新。开发人员在开发环境中工作,并在那里直接更改文件。完成后,他们可以将其标记为Alpha,Beta或发行候选。这样,几个开发人员可以同时在下一个时间处理多个项目,您可以进行作曲家更新,并获取所有更改。有很多很棒的工具来组织vcs和composer软件包。
数百个

2

好的,看来我为自己要实现的目标找到了更好的解决方案。在中composer.json,可以指定Magento Composer安装程序应忽略哪些文件。如果我不想Gruntfile.js被覆盖,则可以使用以下配置简单地指定它:

"extra": {
    "magento-deploy-ignore": {
        "magento/magento2-base": [
            "/Gruntfile.js",
            "/package.json"
        ]
    }
}

现在,我可以扩展标准安装以适合我的需求。


该解决方案似乎并不“升级安全”。如果Magento会对您忽略的这些文件进行更改,那么您将不会知道,或者您会忘记这些文件。您正在使用自己的版本,该版本将永远不会包含这些新更改。请检查我的回答以得到我的建议。
7ochem '18

2

不幸的是,虽然最初的目的是达到预期的目标,但是可接受的答案只能用于排除放置在根目录中的文件和目录,因为如果我们要排除放置在子目录中的文件(例如dev/tools/grunt/configs/themes.js,添加一个新主题,并希望使用Magento Grunt任务),将其置于“ magento-deploy-ignore”配置中,它将阻止所有父目录(即dev及其所有子目录)的部署。

发生这种情况是因为处理“ magento-deploy-ignore”(\MagentoHackathon\Composer\Magento\Deploystrategy\DeploystrategyAbstract::isDestinationIgnored)的方法strpos用于将目标路径与排除列表进行匹配,因此每个父路径将始终返回true。


我知道,我可以在测试中看到这一点,但是由于我们使用的是不同的构建工作流程,因此对我们的atm来说效果很好。您能找到更好的选择吗?
fmrng '16

我们在管道的构建阶段开始对文件进行检出,然后停止使用所有内置的Grunt任务,因此atm没问题。
詹娜罗·维特里

顺便说一句,我们开始评估fork magento-composer-installer来增强“ magento-deploy-ignore”行为,如果问题再次出现,我们可以按照以下路径进行
Gennaro Vietri 16'7/

0

使用补丁

我使用的是创建和应用补丁。当我们需要更改时dev/tools/grunt/configs/themes.jsindex.php或者.htaccess将更改应用于文件的临时副本并从中创建补丁(build/首先创建目录):

$ cp dev/tools/grunt/configs/themes.js dev/tools/grunt/configs/themes.js.tmp
  # Now Make changes in .tmp file
$ diff -u3 dev/tools/grunt/configs/themes.js dev/tools/grunt/configs/themes.js.tmp | sed 's/\.tmp//' > build/themes.patch
$ mv dev/tools/grunt/configs/themes.js.tmp dev/tools/grunt/configs/themes.js

然后,我们可以使该补丁在运行时自动应用,composer install或者update通过scriptscomposer.json文件部分添加te命令来自动应用此补丁:

{
    "scripts": {
        "post-install-cmd": "patch -i build/themes.patch dev/tools/grunt/configs/themes.js",
        "post-update-cmd": "patch -i build/themes.patch dev/tools/grunt/configs/themes.js"
    }
}

(也可以将上述patch ...命令放在bash脚本中,假设build/themes_patch.sh从Composer调用该脚本,以便该脚本可重用或手动执行)

升级安全!:D

此解决方案是升级安全的!您不会在不尊重原始文件的情况下直接更改核心文件。您正在将修补程序应用于原始的Magento2文件。当该文件由于要升级而更改时,该修补程序将失败,并且您知道必须仔细查看新更改并创建新的修补程序。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.