hiqdev/composer-config-plugin

$baseDir in __files, __addition, etc

Closed this issue · 26 comments

Устанавливаю модули через композер на локалке. На сервере возможности устанивить через composer нет.

Выгружаю вендор на сайт. Ловлю ошибку в файлах __files, __addition и т.д.
Дело в том, что в этих файлах все пути прописаны абсолютно.
например в __addition.php

<?php

$baseDir = dirname(dirname(dirname(__DIR__)));

return array (
  'aliases' => 
  array (
    '@yii/bootstrap' => 'X:/domains/site.yii/vendor/yiisoft/yii2-bootstrap',
    '@yii/swiftmailer' => 'X:/domains/site.yii/vendor/yiisoft/yii2-swiftmailer',
  ),
);

несмотря, на то, что присутствует $baseDir, в выводе массива она никак не используется.

Можно ли содержимое этих файлов сделать, зависящими от $baseDir.

return array (
  'aliases' => 
  array (
    '@yii/bootstrap' => $baseDir.'/vendor/yiisoft/yii2-bootstrap',
    '@yii/swiftmailer' =>$baseDir. '/vendor/yiisoft/yii2-swiftmailer',
  ),
);

Спасибо

Ща попробую сделать.
Очень интересно почему нельзя композер на сервере запустить?

) нет доступа по ssh

может, тогда логичнее сделать, как в самом композере в файле vendor/composer/autoload_files.php и др

// autoload_files.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    '2cffec82183ee1cea088009cef9a6fc3' => $vendorDir . '/ezyang/htmlpurifier/library/HTMLPurifier.composer.php',
...........
);

тогда можно не использовать название папки vendor в пути

глянь код - писать придётся больше, а функциональность та же

я понимаю, но это для того, чтобы кто то не нарвался на ошибку, если поменяет название папки vendor.
https://stackoverflow.com/questions/29457345/php-composer-set-vendor-directory

add the vendor location to the config section in your composer.json file:
"config": {
    "vendor-dir": "../../path/to/vendors"
}

Вот мой __addition.php:

<?php

$baseDir = dirname(dirname(dirname(__DIR__)));

return array (
  'aliases' => 
  array (
    '@yii/twig' => $baseDir . '/vendor/yiisoft/yii2-twig',
  ...

не понял почему у тебя не так!
у тебя последняя версия?

да, 0.2.5
У меня правда, в index.php такой код

if (!YII_ENV_PROD) {
    hiqdev\composer\config\Builder::rebuild();
}

$plugin_config = require Builder::path('admin');

может в rebuild подставляются абсолютные пути?

Честно говоря сам не пользуюсь таким принудительным ребилдом, даже на деве.
Дёргаю composer dump вручную не так и часто это надо.

Попробуй выпилить и посмотреть пути.

Убрал rebuild. Удалил \vendor\hiqdev\composer-config-plugin-output.
Сделал composer dump. Получил те же абсолютные пути.

сам composer у меня - 1.5.2 (stable channel).
в метод writeFile $data не содержит static::BASE_DIR_MARKER, поэтому у меня и не заменяется.
111

а какой BASE_DIR_MARKER?

Которая, по идее, должна присутствовать в массиве перед ее заменой на $baseDir. А она изначально там отсутствует (см. рис. выше).

глянь вот отсюда, поймёшь как оно работает:
https://github.com/hiqdev/composer-config-plugin/blob/master/src/Builder.php#L248

что у тебя в $this->outputDir ?

я чувствую что-то у тебя странно, но пока не понял что?
Винда?

да, винда.
$this->outputDir = string (62) "X:\domains\gin.yii\vendor\hiqdev\composer-config-plugin-output"

тут тоже $data с абсолютными путями.
2017-11-14_17-20-18

ну видишь в outputDir слеши в одну сторону, а в массиве в другую
сори, я щас занят, позже подумаю и сделаю чтоб работало

Добавил нормализацию, попробуй, пожалуйста.
Нет виндовса под рукой проверить.

Проверил. Все осталось без изменений.

да

2017-11-21_9-48-21

Тут видно, что нормализация не сделала правильный путь. Т.к. DIRECTORY_SEPARATOR в винде - \

Вот тут, видимо, ошибка.
https://github.com/hiqdev/composer-config-plugin/blob/master/src/Builder.php#L293

Опять же, из-за того, что DS в винде = \.

Сделал так

    public static function normalizePath($path, $ds = DIRECTORY_SEPARATOR)
    {
        return rtrim(strtr($path, '\/', '/'), $ds); 
    }

    protected static function substitutePath($path, $dir, $alias)
    {
        $skippable = 0 === strncmp($path, '?', 1) ? '?' : '';
        if ($skippable) {
            $path = substr($path, 1);
        }

       // тут заменил DIRECTORY_SEPARATOR на '/'
        $result = (substr($path, 0, strlen($dir) + 1) === $dir . '/') ? $alias . substr($path, strlen($dir)) : $path;

        return $skippable . $result;
    }

И все файлы сформировались правильно

Попробуй, пожалуйста, с самым последним коммитом.
По прежнему винды под рукой нет.

Спасибо. Вроде бы все работает правильно.