【问题标题】:Elixir versioning public pathElixir 版本控制公共路径
【发布时间】:2015-06-11 17:28:27
【问题描述】:

我正在尝试使用 Elixir 的 version() 方法,而我的“公共”文件夹是 public_html(而不是默认的“公共”方法)。

我对我的 css 文件进行版本控制,它会生成一个构建文件夹,其中包含 public_html 中的清单

elixir.config.cssOutput = 'public_html/css';
elixir.config.jsOutput = 'public_html/js';

elixir(function(mix) {

    mix.styles([
        'vendor/normalize.css',
        'app.css'
    ], null, 'public_html/css');

    mix.version('public_html/css/all.css');

});

在我的刀片模板中我使用

<link href="{{ elixir("css/all.css") }}" rel="stylesheet">

问题是 'public/build' 文件夹中的 elixir 函数搜索。如何更改它以便搜索 public_html 文件夹?

提前谢谢你

【问题讨论】:

  • 有什么办法不改变 elixir 配置文件中的公共路径?我必须在 /node_modules/laravel-elixir/ingredients/version.js 中更改它才能工作!
  • elixir() 使用public_path(),因此您需要覆盖path.public,如我链接的帖子中所示

标签: laravel laravel-5 blade laravel-elixir


【解决方案1】:

您忘记覆盖 gulpfile.js 文件中的 publicDir 文件夹,这会将 build 文件夹指向 elixir 用来确定版本哈希的正确位置。

elixir.config.publicDir = 'public_html';

完成此操作后,您必须覆盖 Laravel 中的 public_path,Laravel 5 的推荐方法是转到公共文件夹中的 index.php

下面

$app = require_once __DIR__.'/../bootstrap/app.php';

添加

// set the public path to this directory
$app->bind('path.public', function() {
    return __DIR__;
});

【讨论】:

  • 谢谢,我已经找到了解决方案,但忘记更新这个帖子了。还是谢谢!
  • 我添加了这些行,但似乎没有解决问题,它仍然创建公共目录(而不是 public_html)
  • 你还需要按照 Lordcash 的说法添加elixir.config.publicPath = 'public_html';
  • 现在的方法似乎是使用 php elixir 函数的第二个参数,例如elixir("app.js", "") 默认值为build。将其设置为空字符串“将其移回”到public
  • .. 或 public_html 在这种情况下。
【解决方案2】:

你需要做的就是这个

var elixir = require('laravel-elixir');
elixir.config.publicDir = 'public_html';
elixir.config.publicPath = 'public_html';

【讨论】:

  • 虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。
【解决方案3】:

elixir() 中没有用于更改公共路径的选项:

function elixir($file)
    {
        static $manifest = null;

        if (is_null($manifest))
        {
            $manifest = json_decode(file_get_contents(public_path().'/build/rev-manifest.json'), true);
        }

        if (isset($manifest[$file]))
        {
            return '/build/'.$manifest[$file];
        }

        throw new InvalidArgumentException("File {$file} not defined in asset manifest.");
    }

只有几个选项。您可以通过将其添加到 App\Providers\AppServiceProvider 来更改公共路径

public function register()
    {
        $this->app->bind('path.public', function() {
          return base_path().'/public_html';
        });
    }

或者您可以创建自己的 elixir 函数或辅助类

例子:

    function my_own_elixir($file,$path=public_path())
            {
                static $manifest = null;

                if (is_null($manifest))
                {
                    $manifest = json_decode(file_get_contents($path.'/build/rev-manifest.json'), true);
                }

                if (isset($manifest[$file]))
                {
                    return '/build/'.$manifest[$file];
                }

                throw new InvalidArgumentException("File {$file} not defined in asset manifest.");
            }

那么你可以稍后在视图中使用它:

{{my_own_elixir('/css/all.css',$path='path to public_html')}}

希望在以后的 elixir 版本中能够包含这个未来。 :)

【讨论】:

  • 路径不是硬编码,它使用 Laravel 全局配置的public_path,这是有道理的。它可以很容易地被覆盖。无需编写自己的函数。 (您也不必创建新的服务提供者,而只需使用 AppServiceProvider 即可)
猜你喜欢
  • 2017-01-20
  • 1970-01-01
  • 2021-05-27
  • 2012-08-08
  • 2021-12-21
  • 1970-01-01
  • 2021-01-05
  • 2010-11-15
  • 2018-08-02
相关资源
最近更新 更多