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?

Kevin Chavez
źródło
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.

Konstantin Gerasimov
źródło
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.

Gulszan
źródło
1
Nie sądzę, że zrozumiałeś moje pytanie, nie chcę „kopiować”. Chcę „symlinkować”, aby zaoszczędzić miejsce przy ograniczonych zasobach serwera.
Kevin Chavez,