Magento 2 Utiliser Symlink en mode par défaut ou en mode production pour les fichiers statiques Pub


11

Situation: je lance des essais gratuits de Magento 2 et j'ai un espace HD limité sur le VPS. Pour cette raison, pour réduire l'espace HD, je souhaite que Magento crée un lien symbolique entre les fichiers en mode par défaut ou en mode production. J'ai remarqué qu'une installation par défaut de Magento 2 fait environ 420 Mo une fois que le site est lancé, il passe à environ 770 Mo, donc 350 Mo de fichiers sont copiés.

J'ai modifié: la ligne 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>

Cela fonctionne bien et le site créera correctement les liens symboliques même en mode par défaut. Cependant, le problème est que le css n'est pas créé ou que js-translation.json les fichiers qu'il doit créer mais ne le sont pas:

/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

La question est donc: comment faire pour que Magento génère également ces fichiers en mode par défaut ou en mode production et en utilisant des liens symboliques?


Vous pouvez peut-être utiliser Gulp ou Grunt pour le problème CSS: magento.stackexchange.com/questions/162906/… et examiner les différents modes du fichier js-translation.json? gist.github.com/antonmakarenko/7538216
B00MER

Merci, je grimperai à +100 si quelqu'un peut me donner étape par étape et vérifier que cela fonctionne.
Kevin Chavez

à l'intérieur du dossier pub / statique, il y a un fichier .htaccess, qui est responsable de réécrire l'url et de supprimer la 'version1488209436' de l'url et de fournir une url conviviale. Si .htaccess ne fonctionne pas correctement, seul ce type de problème s'est produit.
Tonmoy

merci @Tonmoy mais ce n'est pas du tout lié à cela. Le problème est que les fichiers ne sont pas générés car j'utilise des liens symboliques plutôt que de copier en mode par défaut / de production.
Kevin Chavez

Puisqu'il y a 4 fichiers, vous pouvez créer ces liens symboliques manuellement ou dans un script .sh.
obscur

Réponses:


5

app/etc/di.xml: ajouter un nouvel élément à 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>

En supposant que vous êtes en mode développeur, supprimez simplement le contenu de pub/staticet accédez à votre page dans le navigateur - magento régénérera le contenu statique.

a fonctionné pour moi dans Magento 2.1.4 (styles-m.css a été généré et d'autres fichiers ont un lien symbolique).

toute la magie opère dans 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 parcourt simplement les stategiesListéléments et utilise la première stratégie qui prend en charge l'actif.

Comment le faire fonctionner en mode production?

Avertissement: ce hack contient l'édition de fichiers de base. il faut se méfier.

tous testés sur magento 2.1.4

  1. supprimer le numéro de version des fichiers statiques dans Stores > Configuration > Advanced > Developer > Static Files Settings > No
  2. éditez vendor/magento/framework/App/StaticResource.phpet faites launchressembler la fonction à ceci:

    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. supprimer le contenu pub/staticet visiter l'URL de votre boutique dans un navigateur.


Merci cela a parfaitement fonctionné! Juste cette ligne dans le di.xml! J'apprécie également votre explication du fonctionnement. Maintenant, l'installation est de 482 Mo au lieu de 770 Mo, ce qui me fera économiser de l'argent sans avoir à mettre à niveau mon serveur d'essai gratuit VPS.
Kevin Chavez

vous êtes les bienvenus monsieur, je suis heureux que cela ait fonctionné pour vous.
Konstantin Gerasimov

n'est-il pas suffisant de modifier uniquement StaticResource.php et de conserver l'application d'origine / etc / di.xml sans l'ajouter <item name="asset" xsi:type="object">Magento\Framework\App\View\Asset\MaterializationStrategy\Copy</item> ?
LucScu

0

Lorsqu'il n'est pas en mode production, Magento 2 essaiera de créer des liens symboliques pour certaines ressources statiques. Vous pouvez modifier ce comportement en procédant comme suit.

  1. Ouvrez l'application / etc / di.xml et recherchez la section virtualType name = "developerMaterialization". Dans cette section, vous trouverez un nom d'élément = "view_preprocessed" qui doit être modifié ou supprimé. Vous pouvez le modifier en changeant le contenu de Magento \ Framework \ App \ View \ Asset \ MaterializationStrategy \ Symlink en Magento \ Framework \ App \ View \ Asset \ MaterializationStrategy \ Copy

  2. Supprimez les fichiers sous pub / static. Veuillez ne pas supprimer le fichier .htaccess.


1
Je ne pense pas que vous avez compris ma question, je ne veux pas "copier" je veux "symlink" pour économiser de l'espace avec les ressources limitées du serveur.
Kevin Chavez
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.