Magento 2 ใช้ Symlink ในโหมด Default หรือ Production สำหรับไฟล์ Pub Static


11

สถานการณ์: ฉันกำลังทดลอง Magento 2 ฟรีและมีพื้นที่ HD จำกัด ใน VPS ด้วยเหตุนี้เพื่อลดพื้นที่ HD ฉันต้องการให้ Magento symlink ไฟล์ในโหมดเริ่มต้นหรือโหมดการผลิต ฉันสังเกตว่าการติดตั้ง Magento 2 ที่เป็นค่าเริ่มต้นนั้นอยู่ที่ประมาณ 420mb เมื่อไซต์แรกรันมันจะไปที่ประมาณ 770mb ดังนั้น 350mb ในการคัดลอกไฟล์

ฉันได้แก้ไข: บรรทัดแอพ / 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>

สิ่งนี้ใช้ได้ดีและเว็บไซต์จะสร้าง symlink อย่างเหมาะสมแม้ว่าจะอยู่ในโหมดเริ่มต้นก็ตาม อย่างไรก็ตามปัญหาคือว่า css ไม่ได้ถูกสร้างขึ้นหรือ js-translation.json ไฟล์ที่ควรสร้าง แต่ไม่มี:

/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

ดังนั้นคำถามคือฉันจะทำให้ Magento สร้างไฟล์เหล่านี้ได้อย่างไรเมื่ออยู่ในโหมดเริ่มต้นหรือโหมดการใช้งานจริงและใช้ symlink


บางทีคุณสามารถใช้ Gulp หรือ Grunt ในการแก้ไขปัญหา CSS: magento.stackexchange.com/questions/162906/และดูโหมดต่างๆสำหรับไฟล์ js-translation.json? gist.github.com/antonmakarenko/7538216
B00MER

ขอบคุณฉันจะทำตาม +100 ถ้ามีคนให้ฉันทีละขั้นตอนและตรวจสอบการทำงาน
Kevin Chavez

ภายในโฟลเดอร์ pub / static มีไฟล์. htaccess ซึ่งมีหน้าที่รับผิดชอบในการเขียน url ใหม่และลบ 'version1488209436' ออกจาก url และระบุ URL ที่เป็นมิตรต่อผู้ใช้ หาก. htaccess ทำงานไม่ถูกต้องจะเกิดปัญหาประเภทนี้ขึ้นเท่านั้น
Tonmoy

ขอบคุณ @Tonmoy แต่มันไม่เกี่ยวข้องกับเรื่องนี้เลย ปัญหาคือไฟล์ไม่ได้สร้างเพราะฉันใช้ symlink มากกว่าการคัดลอกในขณะที่อยู่ในโหมดเริ่มต้น / การผลิต
Kevin Chavez

เนื่องจากมี 4 ไฟล์มากกว่าที่คุณสามารถสร้าง symlink เหล่านั้นด้วยตนเองหรือในสคริปต์. sh
ปิดบัง

คำตอบ:


5

app/etc/di.xml: เพิ่มรายการใหม่ไปที่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>

สมมติว่าคุณอยู่ในโหมดผู้พัฒนาเพียงลบเนื้อหาpub/staticและไปที่หน้าของคุณในเบราว์เซอร์ - วีโอไอพีจะสร้างเนื้อหาคงที่

ทำงานให้ฉันใน Magento 2.1.4 (styles-m.css ถูกสร้างขึ้นและไฟล์อื่น ๆ มี symlinked)

ความมหัศจรรย์ทั้งหมดเกิดขึ้นใน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 วนลูปผ่านstategiesListไอเท็มและใช้ stategy แรกที่รองรับสินทรัพย์

วิธีทำให้มันใช้งานได้ในโหมดการผลิต

คำเตือน:แฮ็คนี้มีการแก้ไขไฟล์หลัก ระวัง.

ทดสอบทั้งหมดใน magento 2.1.4

  1. ลบหมายเลขรุ่นจากไฟล์คงที่ใน Stores > Configuration > Advanced > Developer > Static Files Settings > No
  2. แก้ไขvendor/magento/framework/App/StaticResource.phpและทำให้launchฟังก์ชันมีลักษณะดังนี้:

    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. ลบเนื้อหาpub/staticและเยี่ยมชม URL ร้านค้าของคุณในเบราว์เซอร์


ขอบคุณมันทำงานได้อย่างสมบูรณ์แบบ! เพียงแค่หนึ่งบรรทัดใน di.xml! นอกจากนี้ฉันขอขอบคุณที่คุณอธิบายว่ามันทำงานอย่างไร ตอนนี้การติดตั้งคือ 482mb แทนที่จะเป็น 770mb ซึ่งจะช่วยให้ฉันประหยัดเงินโดยไม่ต้องอัพเกรดเซิร์ฟเวอร์ทดลองใช้ VPS ฟรีของฉัน
Kevin Chavez

คุณยินดีต้อนรับคุณมากฉันดีใจที่มันทำงานให้คุณ
Konstantin Gerasimov

มันไม่ได้เป็นเพียงการปรับเปลี่ยนพอเพียง StaticResource.php และเก็บต้นฉบับ app / etc / di.xml โดยไม่ต้องเพิ่ม<item name="asset" xsi:type="object">Magento\Framework\App\View\Asset\MaterializationStrategy\Copy</item> ?
LucScu

0

เมื่อไม่อยู่ในโหมดการผลิต Magento 2 จะพยายามสร้าง symlink สำหรับแหล่งข้อมูลคงที่ คุณสามารถเปลี่ยนพฤติกรรมดังกล่าวได้โดยทำสิ่งต่อไปนี้

  1. เปิดแอพ / etc / di.xml และค้นหาส่วน virtualType name = "developerMaterialization" ในส่วนนั้นคุณจะพบชื่อรายการ = "view_preprocessed" ที่ต้องแก้ไขหรือลบ คุณสามารถแก้ไขได้โดยการเปลี่ยนเนื้อหาจาก Magento \ Framework \ App \ View \ Asset \ MaterializationStrategy \ Symlink เป็น Magento \ Framework \ App \ View \ Asset \ Materialization MaterialStrategy \ Copy

  2. ลบไฟล์ภายใต้ pub / static โปรดอย่าลบไฟล์. htaccess


1
ฉันไม่คิดว่าคุณเข้าใจคำถามของฉันฉันไม่ต้องการ "คัดลอก" ฉันต้องการ "symlink" เพื่อประหยัดพื้นที่ด้วยทรัพยากรเซิร์ฟเวอร์ที่ จำกัด
เควินชาเวซ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.