Magento 2 Gunakan Symlink Dalam Mode Default atau Produksi untuk File Pub Statis

11

Situasi: Saya menjalankan beberapa percobaan gratis Magento 2 dan memiliki ruang HD terbatas pada VPS. Untuk alasan ini mengurangi ruang HD saya ingin Magento symlink file dalam mode default atau produksi. Saya telah memperhatikan bahwa instalasi Magento 2 default adalah sekitar 420mb setelah situs pertama kali berjalan, ia mencapai sekitar 770mb sehingga 350mb dari ini adalah file yang disalin.

Saya telah memodifikasi: baris app / etc / di.xml:

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

untuk

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

Ini berfungsi dengan baik dan situs akan membuat symlink dengan benar bahkan ketika dalam mode default. Namun masalahnya adalah bahwa css tidak dibuat atau js-translation.json file yang harus dibuat tetapi tidak:

/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

Jadi pertanyaannya adalah: bagaimana cara membuat Magento juga menghasilkan file-file ini ketika dalam mode default atau produksi dan menggunakan symlink?

Kevin Chavez
sumber
Mungkin Anda dapat menggunakan Gulp atau Grunt untuk untuk masalah CSS: magento.stackexchange.com/questions/162906/… dan melihat ke mode yang berbeda untuk file js-translation.json? gist.github.com/antonmakarenko/7538216
B00MER
Terima kasih, saya akan menaikkan ini ke +100 jika seseorang dapat memberi saya langkah demi langkah dan memverifikasinya berfungsi.
Kevin Chavez
di dalam pub / folder statis ada file .htaccess, yang bertanggung jawab untuk menulis ulang url dan menghapus 'version1488209436' dari url dan memberikan url yang ramah pengguna. Jika .htaccess tidak berfungsi dengan baik, maka hanya masalah seperti ini yang terjadi.
Tonmoy
terima kasih @Tonmoy tetapi tidak ada hubungannya sama sekali. Masalahnya adalah bahwa file tidak menghasilkan karena saya menggunakan symlink daripada menyalin saat dalam mode default / produksi.
Kevin Chavez
Karena ada 4 file daripada Anda dapat membuat symlink secara manual atau dalam skrip .sh.
tidak jelas

Jawaban:

5

app/etc/di.xml: tambahkan item baru ke 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>

Dengan asumsi Anda berada dalam mode pengembang cukup hapus konten pub/staticdan pergi ke halaman Anda di browser - magento akan membuat ulang konten statis.

bekerja untuk saya di Magento 2.1.4 (styles-m.css dihasilkan dan file lain disinkronkan).

semua keajaiban terjadi di 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 hanya membolak-balik stategiesListitem dan menggunakan stategy pertama yang mendukung aset.

Bagaimana membuatnya bekerja dalam mode produksi?

Penafian: peretasan ini mengandung pengeditan file inti. Waspadalah.

semua diuji pada magento 2.1.4

  1. hapus nomor versi dari file statis di Stores > Configuration > Advanced > Developer > Static Files Settings > No
  2. edit vendor/magento/framework/App/StaticResource.phpdan buat launchfungsinya seperti ini:

    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. hapus konten pub/staticdan kunjungi url toko Anda di browser.

Konstantin Gerasimov
sumber
Terima kasih ini berhasil! Hanya satu baris di di.xml! Saya juga menghargai penjelasan Anda tentang cara kerjanya. Sekarang instal adalah 482mb bukannya 770mb yang akan menghemat uang saya tanpa harus meng-upgrade server percobaan gratis VPS saya.
Kevin Chavez
Terima kasih banyak, tuan. Saya senang itu berhasil untuk Anda.
Konstantin Gerasimov
bukankah hanya cukup memodifikasi StaticResource.php saja dan menyimpan aplikasi asli /etc/di.xml tanpa menambahkan <item name="asset" xsi:type="object">Magento\Framework\App\View\Asset\MaterializationStrategy\Copy</item> ?
LucScu
0

Ketika tidak dalam mode produksi, Magento 2 akan mencoba membuat symlink untuk beberapa sumber daya statis. Anda dapat mengubah perilaku itu dengan melakukan hal berikut.

  1. Buka aplikasi / etc / di.xml dan temukan bagian virtualType name = "developerMaterialization". Di bagian itu Anda akan menemukan nama item = "view_preproses" yang perlu dimodifikasi atau dihapus. Anda dapat memodifikasinya dengan mengubah konten dari Magento \ Framework \ App \ View \ Asset \ MaterializationStrategy \ Symlink ke Magento \ Framework \ App \ View \ Asset \ MaterializationStrategy \ Copy

  2. Hapus file di bawah pub / statis. Tolong jangan hapus file .htaccess.

Gulshan
sumber
1
Saya tidak berpikir Anda mengerti pertanyaan saya, saya tidak ingin "menyalin" Saya ingin "symlink" untuk menghemat ruang dengan sumber daya server yang terbatas.
Kevin Chavez