$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. Получил те же абсолютные пути.
а какой BASE_DIR_MARKER?
Это же константа в билдере
https://github.com/hiqdev/composer-config-plugin/blob/master/src/Builder.php#L50
Которая, по идее, должна присутствовать в массиве перед ее заменой на $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"
ну видишь в outputDir слеши в одну сторону, а в массиве в другую
сори, я щас занят, позже подумаю и сделаю чтоб работало
Добавил нормализацию, попробуй, пожалуйста.
Нет виндовса под рукой проверить.
Проверил. Все осталось без изменений.
да
Вот тут, видимо, ошибка.
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;
}
И все файлы сформировались правильно
Попробуй, пожалуйста, с самым последним коммитом.
По прежнему винды под рукой нет.
Спасибо. Вроде бы все работает правильно.