Общедоступный путь для управления версиями Elixir

Я пытаюсь использовать метод версии () Эликсира с моей «общедоступной» папкой 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». Как я могу изменить это, чтобы он искал папку public_html?

заранее спасибо


person Gregory    schedule 07.04.2015    source источник
comment
laracasts.com/discuss/ каналы/общее обсуждение/   -  person lukasgeiter    schedule 07.04.2015
comment
Есть ли способ не менять общедоступный путь в конфигурационном файле эликсира? Мне пришлось изменить его в /node_modules/laravel-elixir/ingredients/version.js, прежде чем он заработал!   -  person Gregory    schedule 07.04.2015
comment
elixir() использует public_path(), поэтому вам нужно переопределить path.public, как показано в сообщении, на которое я ссылаюсь.   -  person lukasgeiter    schedule 07.04.2015


Ответы (3)


Вы забыли перезаписать папку publicDir в файле gulpfile.js, это указывает на папку build в правильном месте, которое используется elixir для определения хэша версии.

elixir.config.publicDir = 'public_html';

После того, как вы это сделали, вы должны перезаписать свой public_path в Laravel, рекомендуемый способ для 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__;
});
person Maarten de Graaf    schedule 18.04.2015
comment
Спасибо, я уже нашел решения, но забыл обновить эту тему. Спасибо, в любом случае! - person Gregory; 19.04.2015
comment
Я добавил эти строки, но, похоже, это не решает проблему, он по-прежнему создает публичный каталог (вместо public_html) - person Roderik; 28.07.2015
comment
Вам также нужно добавить elixir.config.publicPath = 'public_html';, как сказал Lordcash - person Maxime Freschard; 22.02.2016
comment
Кажется, способ сделать это сейчас - использовать второй параметр для функции php elixir, например. elixir("app.js", "") значение по умолчанию build. Установка его в пустую строку возвращает его к public. - person Michael; 24.11.2016
comment
.. или public_html в данном случае. - person Michael; 24.11.2016

все, что вам нужно сделать, это

var elixir = require('laravel-elixir');
elixir.config.publicDir = 'public_html';
elixir.config.publicPath = 'public_html';
person Trapcode    schedule 01.09.2015
comment
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и/или как этот код отвечает на вопрос, повышает его ценность в долгосрочной перспективе. - person JAL; 01.09.2015

В 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';
        });
    }

или вы можете создать свою собственную функцию эликсира или вспомогательный класс

Пример:

    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')}}

Надеюсь, в будущей версии эликсира это будущее будет включено. :)

person Emeka Mbah    schedule 07.04.2015
comment
Путь не жестко запрограммирован, он использует глобально настроенный Laravels public_path, что имеет смысл. И его можно легко переопределить. Не нужно писать свою функцию. (Вам также не нужно создавать нового поставщика услуг, но вы можете просто использовать для этого AppServiceProvider) - person lukasgeiter; 07.04.2015