Magento 2不允许使用符号链接链接模块


10

我已经使用符号链接将本地开发模块(单独的git repo)添加到了Magento 2,在我点击PHTML模板之前,它一直运行良好。经过大量调试后,我发现Magento 2文件系统类(Magento\Framework\Filesystem\Directory\Read)使用一种isExists()结合了getAbsolutePath()调用的方法来查看PHTML模板是否存在。但是,该getAbsolutePath()方法检查Magento 2文件系统中是否存在相对路径,如果不存在,则将Magento 2根目录作为前缀。它。就我而言,该模块位于/git/AMagento所在的单独的存储库中/site/B,此行为将检查中是否存在PHTML模板/site/B/git/A

简而言之:无论系统配置设置“允许符号链接”处于打开状态,都不会拾取Magento 2根文件系统外部的PHTML模板。似乎该设置有效,但前提是该符号链接的源仍在Magento 2文件系统中。

还有其他人遇到过吗?在外部git repo中处理开发的最佳方法是什么?


50/50错误/功能。我说提出问题
benmarks 2015年

@benmarks这是一个已知问题,存在工作问题,请参阅我的答案
Alex Paliarush

Answers:


9

如果您对模块使用composer路径存储库,则可能会出现骇人的解决方法。

registration.php认沽:

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'Module_Name',
    isset($file) ? dirname($file) : __DIR__
);

这会将您的模块注册在Magento的根供应商目录中的符号链接路径下,而不是其实际路径下。


1
在我升级到Magento 2.3之前,该解决方案一直对我有效(我收到“无效的模板文件...”错误)。知道如何解决吗?
Pini

抱歉,没有。当您不使用symlink时,您确定这有效吗?如果是这样,您将不得不调试M2.3如何加载模板。也许还有另一个问题?
fsw

它在没有符号链接的情况下工作。
Pini

我在开发过程中使用Vagrant。我链接/vagrant/app/code/Vendor//var/www/shop/app/code/Vendor。这为我解决了!
BugHunterUK

我回来了。此解决方案不起作用。当我用它符号链接模块代码时,模块的adminhtml路由将无法工作。我通过删除符号链接并将文件复制到app / code目录中来确认这一点。插件随后工作了。您可以通过创建此模块并对其进行符号链接来进行确认:devdocs.magento.com/guides/v2.3/ext-best-practices / ... ...您将遇到与我相同的问题。
BugHunterUK

4

还应该可以操纵registration.php指向您的dev根目录。

为了确保它已被加载,您必须在引导过程中的某处执行registration.php。

最简单的方法(无需通过composer安装)是将其手动添加到vendor / composer / autoload_files.php。

我还考虑过为此编写模块。该模块对于集成测试环境也很有用(用于动态添加和删除模块,而无需将其复制到某处)。

===更新===

至此,我编写了模块: http //github.com/davidverholen/magento2-dynamic-component-registry

我也认为应该可以使用相对符号链接来链接模块


3

可以通过Stores => Configuration => Advanced => Developer => Template Settings启用/允许符号链接(就像在Magento 1.x中一样):

配置选项

(我没有测试此设置是否有效)

您还可以使用子模块,这样就不需要符号链接。

为了进行开发,我在单独的目录中开发模块,并使用PHPStorm将其复制到Magento 2的开发安装中。


1
谢谢。我提到的设置确实是“模板设置”下的“允许符号链接”设置。在Magento 1.x下它可以很好地工作,但是现在在Magento 2下,文件需要位于Magento根目录内,因此不仅需要在文件系统上的任何位置。无论如何,我会没事的-我可能会使用子模块:)
Jisse Reitsma 2015年

Jisse,只是想一想...在生成构建工件时,您也可以使用composer组装单独的模块,这样可以避免git子模块可能遇到的一些问题,尽管这可能会增加构建的复杂性处理。AFAIK,这是Magento推荐的处理方式。
Bryan'BJ'Hoffpauir Jr.

谢谢,PHPStorm选项已经为我解决了它,但是正如@ alex-paliurush指出的那样,在某些情况下,解决方法根本行不通。我将改为添加PR。
Jisse Reitsma,2015年

也感谢Bryan的建议。但是,composer非常适合与生产站点打交道,但是我一直在寻找开发定制模块的更好方法。Composer尚未发挥作用,因为它是首先分发我需要在Magento 2中开发的代码的方式,因此composer总是后面有各种提交。话虽如此,PhpStorm(和其他IDE)已经提供了解决方案。因此,唯一剩下的问题是生产站点受到此符号链接限制的影响,然后您的论点开始了:)
Jisse Reitsma 2015年

3

如果您使用PHP Storm开发,只需将第二个存储库复制到Magento项目根目录。然后创建必要的符号链接以启用模块。PHP Storm将把该项目视为多根项目,并将识别两个存储库。您可以选择同步和异步(默认)存储库管理策略

当使用符号链接将EE(或任何其他模块)链接到CE时,也会发生此问题。根本原因是将registration.php基本模块路径计算为目录的实际路径(在您的情况下,该路径位于Magento项目外部)。这就是为什么相对路径计算不正确,然后绝对路径也不正确的原因。如果将第二个存储库放在Magento根目录下,则相对路径将指向实际文件路径(而不是symlink),但仍会找到它,因此一切正常。

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.