Magento 2 Użyj Symlink w trybie domyślnym lub produkcyjnym dla plików statycznych pubu


11

Sytuacja: Prowadzę kilka darmowych wersji próbnych Magento 2 i mam ograniczoną przestrzeń HD na VPS. Z tego powodu, aby zmniejszyć ilość miejsca HD, chcę, aby Magento dowiązał pliki w trybie domyślnym lub produkcyjnym. Zauważyłem, że domyślna instalacja Magento 2 to około 420 MB po pierwszym uruchomieniu witryny, osiąga około 770 MB, więc 350 MB z tego jest kopiowanych plików.

Zmodyfikowałem wiersz: app / etc / di.xml:

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

do

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

Działa to dobrze, a strona prawidłowo utworzy dowiązania symboliczne, nawet w trybie domyślnym. Problem polega jednak na tym, że plik css nie został utworzony lub plik js-translation.json powinien utworzyć pliki, ale nie są to:

/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

Pytanie brzmi zatem: jak sprawić, by Magento generował te pliki również w trybie domyślnym lub produkcyjnym i używając dowiązań symbolicznych?


Być może mógłbyś użyć Gulpa lub Grunta do rozwiązania problemu CSS: magento.stackexchange.com/questions/162906/... i spojrzeć na różne tryby pliku js-translation.json? gist.github.com/antonmakarenko/7538216
— B00MER

Dzięki, zwiększę to do +100, jeśli ktoś może dać mi krok po kroku i sprawdzić, czy działa.
— Kevin Chavez,

w folderze pub / static znajduje się plik .htaccess, który jest odpowiedzialny za przepisanie adresu URL i usunięcie „wersji1488209436” z adresu URL oraz podanie adresu URL przyjaznego dla użytkownika. Jeśli .htaccess nie działa poprawnie, wystąpiły tylko tego typu problemy.
— Tonmoy,

dziękuję @Tonmoy, ale to wcale nie jest z tym związane. Problem polega na tym, że pliki nie generują się, ponieważ używam dowiązań symbolicznych zamiast kopiowania w trybie domyślnym / produkcyjnym.
— Kevin Chavez

Ponieważ istnieją 4 pliki, możesz utworzyć te dowiązania symboliczne ręcznie lub w skrypcie .sh.
— niejasne

Odpowiedzi:


5

app/etc/di.xml: dodaj nowy element do 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>

Zakładając, że jesteś w trybie programisty, po prostu usuń zawartość pub/statici przejdź do swojej strony w przeglądarce - magento zregeneruje zawartość statyczną.

pracował dla mnie w Magento 2.1.4 (wygenerowano styles-m.css, a inne pliki dowiązano symlinkowo).

cała magia dzieje się w 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 po prostu przegląda stategiesListprzedmioty i wykorzystuje pierwszą strategię, która obsługuje zasób.

Jak sprawić, by działał w trybie produkcyjnym?

Uwaga: ten hack zawiera edycję podstawowych plików. strzec się.

wszystkie przetestowane na Magento 2.1.4

  1. usuń numer wersji z plików statycznych w Stores > Configuration > Advanced > Developer > Static Files Settings > No
  2. edytuj vendor/magento/framework/App/StaticResource.phpi ustaw launchfunkcję tak:

    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. usuń zawartość pub/statici przejdź do adresu URL sklepu w przeglądarce.


Dziękuję, działało idealnie! Tylko ta jedna linia w pliku di.xml! Doceniam również twoje wyjaśnienie, jak to działa. Teraz instalacja wynosi 482 MB zamiast 770 MB, co pozwoli mi zaoszczędzić pieniądze bez konieczności aktualizacji mojego bezpłatnego serwera próbnego VPS.
— Kevin Chavez

Proszę bardzo, proszę pana. Cieszę się, że to zadziałało.
— Konstantin Gerasimov,

czy nie wystarczy modyfikować tylko plik StaticResource.php i zachować oryginalną aplikację / etc / di.xml bez dodawania <item name="asset" xsi:type="object">Magento\Framework\App\View\Asset\MaterializationStrategy\Copy</item> ?
— LucScu,

0

Gdy nie jest w trybie produkcyjnym, Magento 2 spróbuje utworzyć dowiązania symboliczne dla niektórych zasobów statycznych. Możesz zmienić to zachowanie, wykonując następujące czynności.

  1. Otwórz aplikację / etc / di.xml i znajdź sekcję virtualType name = "developerMaterialization". W tej sekcji znajdziesz nazwę elementu = „view_preprocished”, którą należy zmodyfikować lub usunąć. Możesz to zmienić, zmieniając zawartość z Magento \ Framework \ App \ View \ Asset \ MaterializationStrategy \ Symlink na Magento \ Framework \ App \ View \ Asset \ MaterializationStrategy \ Kopiuj

  2. Usuń pliki w obszarze pub / static. Nie usuwaj pliku .htaccess.


1
Nie sądzę, że zrozumiałeś moje pytanie, nie chcę „kopiować”. Chcę „symlinkować”, aby zaoszczędzić miejsce przy ograniczonych zasobach serwera.
— Kevin Chavez,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.