Magento 2は、Pub静的ファイルに対してデフォルトまたはプロダクションモードでSymlinkを使用します


11

状況:Magento 2の無料トライアルをいくつか実行していますが、VPSのHDスペースが限られています。このため、HDスペースを削減するために、Magentoにデフォルトまたはプロダクションモードでファイルをシンボリックリンクさせたいと考えています。サイトを最初に実行すると、デフォルトのMagento 2のインストールは約420mbであり、約770mbになるため、この350mbがコピーされたファイルであることに気付きました。

私は変更しました:app / 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>

これは問題なく動作し、サイトはデフォルトモードでもシンボリックリンクを適切に作成します。ただし、問題は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でこれらのファイルも生成するにはどうすればよいですか?


おそらく、CSSの問題にGulpまたはGruntを使用できます: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 2017年

@Tonmoyに感謝しますが、これとはまったく関係ありません。問題は、デフォルト/プロダクションモードのときにコピーではなくシンボリックリンクを使用しているため、ファイルが生成されないことです。
Kevin Chavez

4つのファイルがあるので、手動または.shスクリプトでこれらのシンボリックリンクを作成できます。
2017年

回答:


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は静的コンテンツを再生成します。

Magento 2.1.4で動作しました(styles-m.cssが生成され、他のファイルがシンボリックリンクされました)。

すべての魔法はで起こり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アイテムをループし、アセットをサポートする最初のステートジーを使用します。

プロダクションモードで機能させるにはどうすればよいですか?

免責事項:このハックにはコアファイルの編集が含まれます。注意してください。

すべて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の1行だけです。それがどのように機能するかについての説明にも感謝します。これで、インストールは770mbではなく482mbになり、VPS無料試用サーバーをアップグレードする必要がないため、費用を節約できます。
Kevin Chavez

どうぞよろしくお願いいたします。
コンスタンティンゲラシモフ2017年

StaticResource.phpだけを変更して、追加せずに元のapp / etc / di.xmlを保持するだけでは十分ではない<item name="asset" xsi:type="object">Magento\Framework\App\View\Asset\MaterializationStrategy\Copy</item> ですか?
LucScu

0

本番モードでない場合、Magento 2は一部の静的リソースのシンボリックリンクを作成しようとします。次の操作を行うと、その動作を変更できます。

  1. app / etc / di.xmlを開き、virtualType name = "developerMaterialization"セクションを見つけます。そのセクションには、変更または削除が必要な項目name = "view_preprocessed"があります。内容をMagento \ Framework \ App \ View \ Asset \ MaterializationStrategy \ SymlinkからMagento \ Framework \ App \ View \ Asset \ MaterializationStrategy \ Copyに変更することで変更できます

  2. pub / staticの下のファイルを削除します。.htaccessファイルは削除しないでください。


1
あなたは私の質問を理解していないと思います。限られたサーバーリソースでスペースを節約するために「コピー」したくありません。
Kevin Chavez
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.