CLI中的MAGE_DIRS引导程序参数


10

在中pub/index.php,以下代码用于为媒体和静态资产设置更改URL以省略“ / pub”:

$params[Bootstrap::INIT_PARAM_FILESYSTEM_DIR_PATHS] = [
    DirectoryList::PUB => [DirectoryList::URL_PATH => ''],
    DirectoryList::MEDIA => [DirectoryList::URL_PATH => 'media'],
    DirectoryList::STATIC_VIEW => [DirectoryList::URL_PATH => 'static'],
    DirectoryList::UPLOAD => [DirectoryList::URL_PATH => 'media/upload'],
];
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $params);

不幸的是,在CLI脚本(bin/magento)中没有这样的东西。

Magento\Setup\Mvc\Bootstrap\InitParamListener用以下代码找到了该类:

$initParams = $application->getServiceManager()->get(self::BOOTSTRAP_PARAM);
$directoryList = $this->createDirectoryList($initParams);

但是我不知道这个Zend Service Manager在哪里检索数据以及如何影响它。

我的具体问题是,索引器必须生成完整的URL,并且当前这样做的地方就像http://magento.local/pub/media/...我需要的那样http://magento.local/media/...

如何告诉CLI虚拟主机指向的pub“发布”不应该是URL的一部分?

理想情况下,该方法无需依赖其他CLI参数或环境变量即可工作。


2
最近有报道称这是一个错误:github.com/magento/magento2/issues/8868
Scott Buchanan

1
我发现您可以使用类似的参数进行设置--magento-init-params=MAGE_DIRS[media][uri]=media。这实际上适用于所有命令(通过单步执行代码可以明显看出),但是setup:名称空间外部的命令错误地给出了该选项不存在的错误。
Scott Buchanan

@ScottSB并不是我所希望的,但是仍然是一个有趣的发现,谢谢!
Fabian Schmengler '04

Answers:


6

经过艰苦的努力,我找到了使用环境变量的解决方案,我知道这不是您想要的。您可以使用以下环境变量来设置参数(用$APP_ROOT实际的Magento根替换):

env \
    "MAGE_DIRS[base][path]=$APP_ROOT" \
    "MAGE_DIRS[pub][uri]=" \
    "MAGE_DIRS[media][uri]=media" \
    "MAGE_DIRS[static][uri]=static" \
    "MAGE_DIRS[upload][uri]=media/upload" \
    bin/magento indexer:reindex

请注意,必须如上所述指定基本路径,因为当您使用环境变量时,您的MAGE_DIRS定义会覆盖包含该基本路径的初始默认值。但是,它将与中的完整默认配置合并\Magento\Framework\App\Filesystem\DirectoryList

归功于首席建筑师本人的这个回答,他使我充满了气味:

如何将Magento的“ var”目录更改为Magento 2中的其他位置?


您如何使用环境变量?这些是否像引用的答案一样被添加到VHOST中?
哈里

@harri我不明白你的问题。因为这是在谈论CLI命令,所以虚拟主机无关,因为不涉及Web服务器。如图所示,环境变量直接在命令行上传递(在这种情况下,env格式中的参数最后FOO=bar被设置为命令的环境变量bin/magento)。
Scott Buchanan

嗯,我通过cron运行的方法遇到了这个问题,所以不确定是否可以通过bin / magento cron在crontab中运行此方法吗?
哈里

只需将我的答案中的内容替换indexer:reindexcron:run(当然也仍然要更新$ APP_ROOT)。然后将整个东西放到crontab中。不知道crontab是否喜欢换行符,因此您可以将它们替换为空格(在这种情况下,删除尾随的反斜杠)。
Scott Buchanan

我认为更好的解决方案是magento.stackexchange.com/a/174503/41325
A.Maksymiuk


3

我找到了另一种MAGE_DIRS通过CLI 设置的方法,只需复制

/vendor/magento/framework/App/Filesystem/DirectoryList.php

/lib/internal/Magento/Framework/App/Filesystem/DirectoryList.php 

现在,您可以更改所有内部文件的默认目录。


thx这帮助我更改了cli和webapp的缓存文件夹; D
ZFNerd 18-10-22

实际上,我相信这是此问题的最佳解决方案。Magento官方指南建议使用/ lib / internal自定义内核。 devdocs.magento.com/guides/v2.3/architecture/archi_perspectives/…–
A.Maksymiuk

@ A.Maksymiuk我相信您误会了该页面。值得注意的是,那里的代码对于扩展开发人员可能有用,但是建议直接在此处自定义核心。在页面的前面,它说:“尽管要扩展Magento,也必须知道如何调用Framework库,但是绝对不要修改Framework文件。”
Scott Buchanan
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.