Magento 2 Verwenden Sie Symlink im Standard- oder Produktionsmodus für statische Pub-Dateien

11

Situation: Ich führe einige kostenlose Testversionen von Magento 2 durch und habe nur begrenzten HD-Speicherplatz auf dem VPS. Aus diesem Grund möchte ich, dass Magento die Dateien im Standard- oder Produktionsmodus mit Symlink verknüpft, um den HD-Speicherplatz einzuschränken. Ich habe festgestellt, dass eine Standardinstallation von Magento 2 ungefähr 420 MB beträgt, sobald die Site zum ersten Mal ausgeführt wird. Sie beträgt ungefähr 770 MB, sodass 350 MB davon kopierte Dateien sind.

Ich habe geändert: app / etc / di.xml Zeile:

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

zu

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

Dies funktioniert in Ordnung und die Site erstellt die Symlinks auch im Standardmodus ordnungsgemäß. Das Problem ist jedoch, dass das CSS nicht erstellt wird oder die Datei js-translation.json die Dateien sind, die erstellt werden sollen, aber nicht:

/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

Die Frage ist also: Wie kann ich Magento dazu bringen, diese Dateien auch im Standard- oder Produktionsmodus zu generieren und Symlinks zu verwenden?

Kevin Chavez
quelle
Vielleicht könnten Sie Gulp oder Grunt für das CSS-Problem verwenden: magento.stackexchange.com/questions/162906/… und die verschiedenen Modi für die Datei js-translation.json untersuchen? gist.github.com/antonmakarenko/7538216
B00MER
Danke, ich werde dies auf +100 erhöhen, wenn mir jemand Schritt für Schritt geben und überprüfen kann, ob es funktioniert.
Kevin Chavez
Im pub / static-Ordner befindet sich eine .htaccess-Datei, die dafür verantwortlich ist, die URL neu zu schreiben, 'version1488209436' aus der URL zu entfernen und eine benutzerfreundliche URL bereitzustellen. Wenn .htaccess nicht ordnungsgemäß funktioniert, sind nur diese Probleme aufgetreten.
Tonmoy
danke @Tonmoy, aber es hat überhaupt nichts damit zu tun. Das Problem ist, dass die Dateien nicht generiert werden, da ich im Standard- / Produktionsmodus Symlinks verwende und nicht kopiere.
Kevin Chavez
Da es 4 Dateien gibt, können Sie diese Symlinks manuell oder in einem .sh-Skript erstellen.
obskure

Antworten:

5

app/etc/di.xml: Neues Element hinzufügen zu 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>

Angenommen, Sie befinden sich im Entwicklermodus, löschen Sie einfach den Inhalt von pub/staticund gehen Sie im Browser zu Ihrer Seite. Magento generiert den statischen Inhalt neu.

arbeitete für mich in Magento 2.1.4 (styles-m.css wurde generiert und andere Dateien wurden symlinked).

Die ganze Magie geschieht in 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 durchläuft nur stategiesListElemente und verwendet die erste Strategie, die das Asset unterstützt.

Wie funktioniert es im Produktionsmodus?

Haftungsausschluss: Dieser Hack enthält die Bearbeitung von Kerndateien. in acht nehmen.

alle auf magento 2.1.4 getestet

  1. Entfernen Sie die Versionsnummer aus statischen Dateien in Stores > Configuration > Advanced > Developer > Static Files Settings > No
  2. Bearbeiten vendor/magento/framework/App/StaticResource.phpund launchFunktion so aussehen lassen:

    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. Löschen Sie den Inhalt von pub/staticund besuchen Sie die URL Ihres Shops in einem Browser.

Konstantin Gerasimov
quelle
Danke, das hat perfekt funktioniert! Nur diese eine Zeile in der di.xml! Ich freue mich auch über Ihre Erklärung, wie es funktioniert. Jetzt beträgt die Installation 482 MB anstelle von 770 MB, wodurch ich Geld sparen kann, ohne meinen kostenlosen VPS-Testserver aktualisieren zu müssen.
Kevin Chavez
Sie sind herzlich willkommen, Sir. Ich bin froh, dass es für Sie funktioniert hat.
Konstantin Gerasimov
reicht es nicht aus, nur StaticResource.php zu ändern und die ursprüngliche App / etc / di.xml beizubehalten, ohne sie hinzuzufügen <item name="asset" xsi:type="object">Magento\Framework\App\View\Asset\MaterializationStrategy\Copy</item> ?
LucScu
0

Wenn Magento 2 nicht im Produktionsmodus ist, versucht es, Symlinks für einige statische Ressourcen zu erstellen. Sie können dieses Verhalten folgendermaßen ändern.

  1. Öffnen Sie die App / etc / di.xml und suchen Sie den Abschnitt virtualType name = "developerMaterialization". In diesem Abschnitt finden Sie einen Elementnamen = "view_preprocessed", der geändert oder gelöscht werden muss. Sie können es ändern, indem Sie den Inhalt von Magento \ Framework \ App \ View \ Asset \ MaterializationStrategy \ Symlink in Magento \ Framework \ App \ View \ Asset \ MaterializationStrategy \ Copy ändern

  2. Löschen Sie die Dateien unter pub / static. Bitte löschen Sie die .htaccess-Datei nicht.

Gulshan
quelle
1
Ich glaube nicht, dass Sie meine Frage verstanden haben. Ich möchte nicht "kopieren". Ich möchte "symlink", um Platz mit den begrenzten Serverressourcen zu sparen.
Kevin Chavez