Magento 2 Используйте Symlink в стандартном или производственном режиме для статических файлов пабов

11

Ситуация: я провожу несколько бесплатных испытаний Magento 2 и у меня ограничено HD-пространство на VPS. По этой причине, чтобы урезать HD-пространство, я хочу использовать символическую ссылку Magento для файлов в стандартном или производственном режиме. Я заметил, что установка Magento 2 по умолчанию составляет около 420 МБ, а при первом запуске сайта она достигает 770 МБ, поэтому 350 МБ это скопированные файлы.

Я изменил: app / etc / di.xml строка:

 <item name="default" xsi:type="object">Magento\Framework\App\View\Asset\MaterializationStrategy\Copy</item>

в

 <item name="default" xsi:type="object">Magento\Framework\App\View\Asset\MaterializationStrategy\Symlink</item>

Это работает нормально, и сайт будет правильно создавать символические ссылки даже в режиме по умолчанию. Однако проблема в том, что css не создан или js-translation.json - файлы, которые он должен создать, но это не так:

/pub/static/version1488209436/frontend/Magento/luma/en_US/css/styles-m.css

/pub/static/version1488209436/frontend/Magento/luma/en_US/css/styles-l.css

/pub/static/version1488209436/frontend/Magento/luma/en_US/css/print.css

/pub/static/version1488209436/frontend/Magento/luma/en_US/js-translation.json

Таким образом, вопрос заключается в следующем: как заставить Magento также генерировать эти файлы в стандартном или производственном режиме и с использованием символических ссылок?

Кевин Чавес
источник
Возможно, вы могли бы использовать Gulp или Grunt для решения проблемы CSS: magento.stackexchange.com/questions/162906/… и посмотреть различные режимы для файла js-translation.json? gist.github.com/antonmakarenko/7538216
B00MER
Спасибо, я увеличу это до +100, если кто-то может дать мне шаг за шагом и убедиться, что это работает.
Кевин Чавес,
внутри папки pub / static есть файл .htaccess, который отвечает за переписывание URL-адреса, удаление «version1488209436» из URL-адреса и предоставление удобного для пользователя URL-адреса. Если .htaccess не работает должным образом, то возникли проблемы только этого типа.
Тонмой
спасибо @Tonmoy, но это никак не связано с этим. Проблема в том, что файлы не генерируются, потому что я использую символические ссылки, а не копирую их в режиме по умолчанию / режиме производства.
Кевин Чавес
Поскольку существует 4 файла, вы можете создать эти символические ссылки вручную или в сценарии .sh.
неясный

Ответы:

5

app/etc/di.xml: добавить новый элемент в stategiesList:

<virtualType name="developerMaterialization" type="Magento\Framework\App\View\Asset\MaterializationStrategy\Factory">
    <arguments>
        <argument name="strategiesList" xsi:type="array">
            <item name="view_preprocessed" xsi:type="object">Magento\Framework\App\View\Asset\MaterializationStrategy\Symlink</item>
            <item name="default" xsi:type="object">Magento\Framework\App\View\Asset\MaterializationStrategy\Symlink</item>
/* ++ */    <item name="asset" xsi:type="object">Magento\Framework\App\View\Asset\MaterializationStrategy\Copy</item>
        </argument>
    </arguments>
</virtualType>

Если вы находитесь в режиме разработчика, просто удалите содержимое pub/staticи перейдите на свою страницу в браузере - magento восстановит статический контент.

работал для меня в Magento 2.1.4 (сгенерированы styles-m.css, а другие файлы стали символическими).

вся магия происходит в vendor/magento/framework/App/View/Asset/MaterializationStrategy/Factory.php:

public function create(Asset\LocalInterface $asset)
{   
    if (empty($this->strategiesList)) {
        $this->strategiesList[] = $this->objectManager->get(self::DEFAULT_STRATEGY);
    }   

    foreach ($this->strategiesList as $strategy) {
        if ($strategy->isSupported($asset)) {
            return $strategy;
        }   
    }   

    throw new \LogicException('No materialization strategy is supported');
}   

Magento просто перебирает stategiesListпредметы и использует первую стратегию, которая поддерживает актив.

Как заставить его работать в производственном режиме?

Отказ от ответственности: этот хак содержит редактирование основного файла. берегитесь.

все проверено на magento 2.1.4

  1. удалить номер версии из статических файлов в Stores > Configuration > Advanced > Developer > Static Files Settings > No
  2. отредактируйте vendor/magento/framework/App/StaticResource.phpи сделайте launchфункцию похожей на это:

    public function launch()
    {   
    // disabling profiling when retrieving static resource
    \Magento\Framework\Profiler::reset();
    $appMode = $this->state->getMode();
    /*if ($appMode == \Magento\Framework\App\State::MODE_PRODUCTION) {
        $this->response->setHttpResponseCode(404);
    } else {*/
        $path = $this->request->get('resource');
        $params = $this->parsePath($path);
        $this->state->setAreaCode($params['area']);
        $this->objectManager->configure($this->configLoader->load($params['area']));
        $file = $params['file'];
        unset($params['file']);
        $asset = $this->assetRepo->createAsset($file, $params);
        $this->response->setFilePath($asset->getSourceFile());
        $this->publisher->publish($asset);
    /*}*/
    return $this->response;
    }   
  3. удалите содержимое pub/staticи перейдите по ссылке вашего магазина в браузере.

Константин Герасимов
источник
Спасибо, это сработало отлично! Только эта строка в di.xml! Также я ценю ваше объяснение того, как это работает. Теперь установка составляет 482 МБ вместо 770 МБ, что сэкономит мне деньги, не требуя обновления моего бесплатного VPS-сервера.
Кевин Чавес,
пожалуйста, сэр, я рад, что это сработало для вас.
Константин Герасимов
Разве недостаточно просто изменить только StaticResource.php и сохранить исходное приложение / etc / di.xml без добавления <item name="asset" xsi:type="object">Magento\Framework\App\View\Asset\MaterializationStrategy\Copy</item> ?
LucScu
0

Когда не в производственном режиме, Magento 2 попытается создать символические ссылки для некоторых статических ресурсов. Вы можете изменить это поведение, выполнив следующие действия.

  1. Откройте app / etc / di.xml и найдите раздел virtualType name = "developerMaterialization". В этом разделе вы найдете элемент name = "view_preprocessed", который необходимо изменить или удалить. Вы можете изменить его, изменив содержимое из Magento \ Framework \ App \ View \ Asset \ MaterializationStrategy \ Symlink на Magento \ Framework \ App \ View \ Asset \ MaterializationStrategy \ Copy

  2. Удалите файлы в разделе pub / static. Пожалуйста, не удаляйте файл .htaccess.

Gulshan
источник
1
Я не думаю, что вы поняли мой вопрос, я не хочу «копировать», я хочу «символическую ссылку», чтобы сэкономить пространство с ограниченными ресурсами сервера.
Кевин Чавес