Magento 2 Use Symlink en modo predeterminado o de producción para archivos estáticos de pub

11

Situación: estoy ejecutando algunas pruebas gratuitas de Magento 2 y tengo espacio limitado en HD en el VPS. Por esta razón, para reducir el espacio en HD, quiero que Magento vincule los archivos en modo predeterminado o en modo de producción. Me di cuenta de que una instalación predeterminada de Magento 2 es de aproximadamente 420mb una vez que el sitio se ejecuta por primera vez, llega a alrededor de 770mb, por lo que 350mb de esto son archivos copiados.

He modificado: línea app / etc / di.xml:

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

a

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

Esto funciona bien y el sitio creará correctamente los enlaces simbólicos incluso en el modo predeterminado. Sin embargo, el problema es que el css no se crea o el js-translation.json los archivos que debe crear pero no son:

/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

Entonces la pregunta es: ¿cómo hago para que Magento también genere estos archivos cuando está en modo predeterminado o en producción y usando enlaces simbólicos?

Kevin Chavez
fuente
Tal vez podría usar Gulp o Grunt para el problema de CSS: magento.stackexchange.com/questions/162906/… y buscar en los diferentes modos para el archivo js-translation.json. gist.github.com/antonmakarenko/7538216
B00MER
Gracias, subiré esto a +100 si alguien me puede dar paso a paso y verificar que funciona.
Kevin Chavez
dentro de la carpeta pub / static hay un archivo .htaccess, que es responsable de reescribir la url y eliminar 'version1488209436' de la url y proporcionar una url fácil de usar. Si .htaccess no funciona correctamente, solo se produjo este tipo de problemas.
Tonmoy
gracias @Tonmoy pero no está relacionado con esto en absoluto. El problema es que los archivos no se generan porque estoy usando enlaces simbólicos en lugar de copiar mientras estoy en modo predeterminado / producción.
Kevin Chavez el
Como hay 4 archivos, puede crear esos enlaces simbólicos manualmente o en un script .sh.
oscuro

Respuestas:

5

app/etc/di.xml: agregar nuevo elemento a 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>

Suponiendo que está en modo desarrollador, simplemente elimine el contenido pub/staticy vaya a su página en el navegador: magento regenerará el contenido estático.

funcionó para mí en Magento 2.1.4 (styles-m.css se generó y otros archivos se vincularon).

toda la magia sucede en 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 simplemente recorre los stategiesListelementos y usa la primera estrategia que admite el activo.

¿Cómo hacer que funcione en modo de producción?

Descargo de responsabilidad: este truco contiene edición de archivos principales. tener cuidado.

todo probado en magento 2.1.4

  1. eliminar el número de versión de los archivos estáticos en Stores > Configuration > Advanced > Developer > Static Files Settings > No
  2. editar vendor/magento/framework/App/StaticResource.phpy hacer que la launchfunción se vea así:

    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. elimine el contenido pub/staticy visite la URL de su tienda en un navegador.

Konstantin Gerasimov
fuente
Gracias esto funcionó perfectamente! ¡Solo esa línea en el di.xml! También agradezco su explicación de cómo funciona. Ahora la instalación es de 482 MB en lugar de 770 MB, lo que me ahorrará dinero al no tener que actualizar mi servidor de prueba gratuito VPS.
Kevin Chavez
de nada señor, me alegro de que le haya funcionado.
Konstantin Gerasimov
¿no es suficiente modificar solo StaticResource.php y mantener la aplicación original / etc / di.xml sin agregar <item name="asset" xsi:type="object">Magento\Framework\App\View\Asset\MaterializationStrategy\Copy</item> ?
LucScu
0

Cuando no está en modo de producción, Magento 2 intentará crear enlaces simbólicos para algunos recursos estáticos. Puede cambiar ese comportamiento haciendo lo siguiente.

  1. Abra la aplicación / etc / di.xml y busque la sección virtualType name = "developerMaterialization". En esa sección, encontrará un elemento nombre = "view_preprocessed" que debe modificarse o eliminarse. Puede modificarlo cambiando el contenido de Magento \ Framework \ App \ View \ Asset \ MaterializationStrategy \ Symlink a Magento \ Framework \ App \ View \ Asset \ MaterializationStrategy \ Copy

  2. Eliminar los archivos en pub / static. No elimine el archivo .htaccess.

Gulshan
fuente
1
No creo que haya entendido mi pregunta, no quiero "copiar". Quiero "hacer un enlace simbólico" para ahorrar espacio con los recursos limitados del servidor.
Kevin Chavez el