Как заставить composer использовать fork-версию пакета?

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Аватара пользователя
demisang
Сообщения: 159
Зарегистрирован: 2012.10.27, 15:03
Контактная информация:

Как заставить composer использовать fork-версию пакета?

Сообщение demisang »

Я написал расширение для создания бекапов и загрузки их в Dropbox через Dropbox SDK PHP, но возникла проблема в Dropbox SDK, он требует, чтобы php был 64-битный для поддержки больших значений в PHP_INT_MAX, и эта проверка выглядит так:

Код: Выделить всё

if (strlen((string) PHP_INT_MAX) < 19) {
    // Looks like we're running on a 32-bit build of PHP.  This could cause problems because some of the numbers
    // we use (file sizes, quota, etc) can be larger than 32-bit ints can handle.
    throw new \Exception("The Dropbox SDK uses 64-bit integers, but it looks like we're running on a version of PHP that doesn't support 64-bit integers (PHP_INT_MAX=" . ((string) PHP_INT_MAX) . ").  Library: \"" . __FILE__ . "\"");
} 
т.е. выкидывает исключение и не позволяет работать! Но дело в том, что если в dropbox не будет загружено файла больше 2ГБ, то можно без проблем использовать не 64-битную версию PHP.

Для исправления этого я решил сделать свой первый fork и закомментировать этот Exception.

Я почитал инструкции, по ним выходит, что надо сделать fork, создать отдельную ветку, внести в неё свои изменения и добавить в свой composer.json строчки, которые composer проанализирует и будет использовать мою версию, вместо оригинала dropbox:

Код: Выделить всё

"repositories": [
    {
        "type": "vcs",
        "url": "https://github.com/demisang/dropbox-sdk-php"
    }
],
"require": {
    "dropbox/dropbox-sdk": "dev-new-branch-name"
}
 
(это composer.json для моего расширения)

Ну и в итоге composer update никак не видит моего форка, я весь день провозился, пробовал следующее:
  • Создавал отдельную ветку, вносил изменения, указывал название ветки как branch, так же пробовал dev-branch.
  • В composer.json комбинировал версию пакета: "dropbox/dropbox-sdk": "branch", "dropbox/dropbox-sdk": "dev-branch".
  • Не создавая новой ветки комитил изменения прямо в master и оставлял без изменения версию пакета - "dropbox/dropbox-sdk": "1.1.*".
  • В каждом из вышеуказанных пунктов пробовал добавлять новые релизы с указанием новой ветки (branch, dev-branch), новой версии (1.1.7)
  • После каждого изменения в моём пакете расширения(composer.json) я указывал новую версию (на всякий случай).
И ничто не помогло, первые два пункта composer выдавал ошибку и говорил, что не может найти пакет "dropbox/dropbox-sdk" указанной версии(названия веток), а после третьего пункта composer не ругаясь просто игнорирует мой fork и устанавливает оригинал.

Вот суть вопроса: как бы вы сделали fork этого репозитория https://github.com/dropbox/dropbox-sdk-php, чтобы потом в вашем пакете расширения использовался именно ваш fork, вместо оригинала?
Аватара пользователя
pistol
Сообщения: 216
Зарегистрирован: 2014.07.12, 15:18
Откуда: Курган
Контактная информация:

Re: Как заставить composer использовать fork-версию пакета?

Сообщение pistol »

https://packagist.org/ - компосер ищет пакеты тут. Сам позавчера такой же вопрос задавал :)
chesar
Сообщения: 514
Зарегистрирован: 2013.04.10, 17:49

Re: Как заставить composer использовать fork-версию пакета?

Сообщение chesar »

Композер сначала ищет на пакагист и если находит там пакет удовлетворяющий условию вендорнейм/пакет то ставит его.
Вы указали свой репозиторий, но не внесли правки в композер конфиг
Аватара пользователя
demisang
Сообщения: 159
Зарегистрирован: 2012.10.27, 15:03
Контактная информация:

Re: Как заставить composer использовать fork-версию пакета?

Сообщение demisang »

pistol писал(а):https://packagist.org/ - компосер ищет пакеты тут. Сам позавчера такой же вопрос задавал :)
Есть ньюанс, про packagist.org я знаю, там уже есть оригинальный пакет dropbox-sdk-php
chesar писал(а):Композер сначала ищет на пакагист и если находит там пакет удовлетворяющий условию вендорнейм/пакет то ставит его.
Вы указали свой репозиторий, но не внесли правки в композер конфиг
В composer.json "форкнутого" проекта нельзя вносить изменения, так и написано в инструкции:
Note that you should not rename the package unless you really intend to fork it in the long term, and completely move away from the original package. Composer will correctly pick your package over the original one since the custom repository has priority over packagist. If you want to rename the package, you should do so in the default (often master) branch and not in a feature branch, since the package name is taken from the default branch.
А так же на странице создания нового пакета в packagist.org есть предупреждение о том, что не надо для fork`ов создавать отдельные пакеты:
Do not submit forks of existing packages. If you need to test changes to a package that you forked to patch, use VCS Repositories instead. If however it is a real long-term fork you intend on maintaining feel free to submit it.
Так что вопрос ещё открыт :)
"А как бы вы поступили в такой ситуации?" :D
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как заставить composer использовать fork-версию пакета?

Сообщение ElisDN »

В своём форке делаем ветку (например, fixes), в которой всё правим.

После этого в composer.json своего проекта подключаем свой форк как локальный репозиторий и меняем версию на dev-fixes:

Код: Выделить всё

"require": [
    ...
    "dropbox/dropbox-sdk": "dev-fixes"
],
"repositories": [
    {
        "type": "vcs",
        "url":  "https://github.com/yourname/dropbox-sdk"
    }
],
В итоге ветку fixes он найдёт только у нас и вместо оригинала загрузит именно наш форк.
Аватара пользователя
demisang
Сообщения: 159
Зарегистрирован: 2012.10.27, 15:03
Контактная информация:

Re: Как заставить composer использовать fork-версию пакета?

Сообщение demisang »

ElisDN писал(а):В своём форке делаем ветку (например, fixes), в которой всё правим.

После этого в composer.json своего проекта подключаем свой форк как локальный репозиторий и меняем версию на dev-fixes
В итоге ветку fixes он найдёт только у нас и вместо оригинала загрузит именно наш форк.
Я сделал всё в точности, но по прежнему получаю ошибку:
Your requirements could not be resolved to an installable set of packages.

Problem 1
- demi/dropbox-backup dev-master requires dropbox/dropbox-sdk dev-fixes -> no matching package found.
- demi/dropbox-backup dev-master requires dropbox/dropbox-sdk dev-fixes -> no matching package found.
- Installation request for demi/dropbox-backup dev-master -> satisfiable by demi/dropbox-backup[dev-master].
Возможно необходимо сделать ещё какое-либо действие?
Или может вообще запрещено в пакетах расширений указывать иные репозитории? И разрешено только в composer.json своего проекта?

У меня схема вот какая должна быть:
Я на своём сайте в файле composer.json указываю пакет "demi/dropbox-backup": "~1.0", composer находит его и видит, что этот пакет требует установки "dropbox/dropbox-sdk": "dev-fixes", а так же видит список дополнительных репозиториев, как то "https://github.com/demisang/dropbox-sdk-php", оригинальный пакет dropbox/dropbox-sdk на данный момент имеет версию "v1.1.6", и там отсутствует ветка "fixes", значит необходимо просканировать дополнительные репозитории, и вот там-то есть ветка "fixes". Но вот composer не хочет сканировать дополнительные репозитории и говорит, что версия "dev-fixes" не обнаружена.

Вот ссылки на все связанные ресурсы:
Оригинальный репозиторий dropbox
Мой форк репозитория dropbox
Ссылка на коммит с фиксом в мой fork в ветку "fixes"
Мой пакет расширения для Yii2, в котором есть зависимость от dropbox-sdk. Так же мой пакет на packagist.org
Аватара пользователя
SmileMD
Сообщения: 4
Зарегистрирован: 2014.05.01, 13:18

Re: Как заставить composer использовать fork-версию пакета?

Сообщение SmileMD »

попробуй:

Код: Выделить всё

    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "user/user-widget",
                "version": "master",
                "source": {
                    "url": "https://github.com/user/user-widget.git",
                    "type": "git",
                    "reference": "dev-master"
                },
                "autoload": {
                    "classmap": [""]
                }
            }
        }
    ],

    "require": {
        "mainuser/user-widget": "dev-master",
    },
robotR13
Сообщения: 21
Зарегистрирован: 2012.12.12, 20:33

Re: Как заставить composer использовать fork-версию пакета?

Сообщение robotR13 »

Подниму ка я тему вновь.

Проблема автора вполне очевидна. В схеме composer.json секция "repositories" является так называемой "root-only", то есть то что в ней прописано читается только из корневого composer.json текущего проекта. Записанные же в эту секцию репозитории в файлах composer.json из устанавливаемых пакетов - ИГНОРИРУЮТСЯ. https://getcomposer.org/doc/04-schema.md#root-package

Ну и собственно вопрос. Если я все же вынужден в своем пакете указать репозиторий с форком, а потом пакет в котором есть зависимость от форка использовать в проекте, то как все же заставить композер найти форкнутую "зависимость зависимости"? Вообще есть возможность такая или надо будет вручную выписывать все нужные репозитории в root composer.json?
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как заставить composer использовать fork-версию пакета?

Сообщение zelenin »

robotR13 писал(а):Подниму ка я тему вновь.

Проблема автора вполне очевидна. В схеме composer.json секция "repositories" является так называемой "root-only", то есть то что в ней прописано читается только из корневого composer.json текущего проекта. Записанные же в эту секцию репозитории в файлах composer.json из устанавливаемых пакетов - ИГНОРИРУЮТСЯ. https://getcomposer.org/doc/04-schema.md#root-package

Ну и собственно вопрос. Если я все же вынужден в своем пакете указать репозиторий с форком, а потом пакет в котором есть зависимость от форка использовать в проекте, то как все же заставить композер найти форкнутую "зависимость зависимости"? Вообще есть возможность такая или надо будет вручную выписывать все нужные репозитории в root composer.json?
то есть в первой части коммента вы говорите что так нельзя, а во второй части говорите, что нельзя, но если нужно, то как?
нет, нельзя. все вопросы решать созданием своих пакетов.
robotR13
Сообщения: 21
Зарегистрирован: 2012.12.12, 20:33

Re: Как заставить composer использовать fork-версию пакета?

Сообщение robotR13 »

zelenin писал(а):нет, нельзя. все вопросы решать созданием своих пакетов.
Ну это же задница полная. Нужно мне исправить одну строчку в модуле стороннем, который используется моим модулем. А мой модуль не root-package в проекте. Стандартная в общем-то ситуация. Автор телиться будет пару месяцев, а может полгода. И чего...? Мне ради исправления одной ошибки делать свой пакет? Вообще-то на packagist прямо таки строго рекомендуют так НЕ ДЕЛАТЬ. Я пока тупо копирую в root-composer.json нужные записи про репозитории из composer,json файлов зависимостей. И если других способов нет (я и спрашиваю потому что вдруг я не знаю, а они есть) то придется создателям composer писать.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как заставить composer использовать fork-версию пакета?

Сообщение zelenin »

robotR13 писал(а):Ну это же задница полная
это данность
robotR13 писал(а):Нужно мне исправить одну строчку в модуле стороннем, который используется моим модулем
для всего этого этого есть средства в программировании. Сторонний разработчик может предусмотреть, что кто-то что-то захочет переопределить. Вы же можете тоже решить вопрос со своей стороны, воспользовавшись возможностями языка.
Конкретный кейс приведите - разберем.
robotR13 писал(а):А мой модуль не root-package в проекте. Стандартная в общем-то ситуация
по мне так не очень, но вам виднее
robotR13 писал(а):Автор телиться будет пару месяцев, а может полгода. И чего...?
я не понимаю, вы хотите меня уговорить, чтобы я вам разрешил что-то сделать?)
robotR13 писал(а):Мне ради исправления одной ошибки делать свой пакет? Вообще-то на packagist прямо таки строго рекомендуют так НЕ ДЕЛАТЬ.
ну так не делайте, раз есть другие решения
robotR13 писал(а):Я пока тупо копирую в root-composer.json нужные записи про репозитории из composer,json файлов зависимостей. И если других способов нет (я и спрашиваю потому что вдруг я не знаю, а они есть) то придется создателям composer писать.
жаловаться будете? сначала подумайте, а как вообще реализовать вашу хотелку и почему до сих пор не реализовано. Могу подсказать, если не будет мыслей.
robotR13
Сообщения: 21
Зарегистрирован: 2012.12.12, 20:33

Re: Как заставить composer использовать fork-версию пакета?

Сообщение robotR13 »

Да конкретный кейс очень блин простой.

В стороннем модуле загрузки файлов используется хранилище сделанное поверх Flysystem. Там соответственно есть метод save($path,$preserveFileName = false). Ну и соответственно внутри метода получают, в зависимости от настроек хранилища, путь куда надо сохранять файл. И в случае если ставим параметр сохранять оригинальное имя файла в TRUE, то путь получается неправильный. И все дело в этой строчке:

Код: Выделить всё

$filename = $fileObj->getPathInfo('basename');
В результате возвращается имя файла без расширения. И так дальше и сохраняется. А правильно должно быть:

Код: Выделить всё

$filename = $fileObj->getPathInfo('filename');
То есть нужно тупо исправить опечатку. Каким же это образом я могу реализовать эту "хотелку" и какие для этого "средства в программировании" имеются, кроме как "открыть редактор и исправить"? Проблема то не в этом, а в том как это исправление подключить в проект по-человечески.
я не понимаю, вы хотите меня уговорить, чтобы я вам разрешил что-то сделать?)
Для тех кто смысл читаемого с трудом понимает, я пожалуй себя еще раз процитирую:
Я пока тупо копирую в root-composer.json нужные записи про репозитории из composer,json файлов зависимостей. Если других способов нет (я и спрашиваю потому что вдруг я не знаю, а они есть) ...
То есть, хочу узнать, не сталкивался ли кто либо еще с подобной проблемой и если сталкивался, то вдруг нашел решение более лучшее, чем "копировать секцию repositories в root-composer.json". Если вы лично не сталкивались и по существу вопроса сказать нечего, то сделайте пожалуйста одолжение: изливайте свою желчь в другом месте, а мне больше ничего не пишите.
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как заставить composer использовать fork-версию пакета?

Сообщение ElisDN »

robotR13 писал(а):То есть нужно тупо исправить опечатку. Каким же это образом я могу реализовать эту "хотелку" и какие для этого "средства в программировании" имеются, кроме как "открыть редактор и исправить"?
В программировании есть наследование с переопределением метода. Если модуль от опытного программиста, то есть SRP, конфигурация и DI. Для остальных случаев иногда есть DIC и всегда есть Yii::$classMap.
robotR13 писал(а):Если вы лично не сталкивались и по существу вопроса сказать нечего, то сделайте пожалуйста одолжение: изливайте свою желчь в другом месте, а мне больше ничего не пишите.
Программируйте и исправляйте опечатки умно, а не тупо. Суть в этом.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Как заставить composer использовать fork-версию пакета?

Сообщение zelenin »

robotR13 писал(а):То есть, хочу узнать, не сталкивался ли кто либо еще с подобной проблемой и если сталкивался, то вдруг нашел решение более лучшее, чем "копировать секцию repositories в root-composer.json".
вам уже дали всю информацию, вы сами привели кусок из документации - если вы не поняли, что вариантов больше нет, то не пишите мне больше в эту ветку.
robotR13 писал(а):Если вы лично не сталкивались
неужели из выше сказанного непонятно, что предмет обсуждения я знаю в совершенстве?
robotR13 писал(а):и по существу вопроса сказать нечего
неужели вам мало информации кроме всей по данному вопросу?
robotR13 писал(а):то сделайте пожалуйста одолжение: изливайте свою желчь в другом месте, а мне больше ничего не пишите.
еще что-нибудь?
robotR13
Сообщения: 21
Зарегистрирован: 2012.12.12, 20:33

Re: Как заставить composer использовать fork-версию пакета?

Сообщение robotR13 »

ElisDN писал(а): 2016.09.18, 00:29
robotR13 писал(а):То есть нужно тупо исправить опечатку. Каким же это образом я могу реализовать эту "хотелку" и какие для этого "средства в программировании" имеются, кроме как "открыть редактор и исправить"?
В программировании есть наследование с переопределением метода. Если модуль от опытного программиста, то есть SRP, конфигурация и DI. Для остальных случаев иногда есть DIC и всегда есть Yii::$classMap.
Остается вопрос: а что мешало товарищу zelenin ответить также, вместо демонстрации давящей ему на уши короны?
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Как заставить composer использовать fork-версию пакета?

Сообщение ElisDN »

robotR13 писал(а): 2017.03.22, 15:32 Остается вопрос: а что мешало товарищу zelenin ответить также, вместо демонстрации давящей ему на уши короны?
Он также и ответил:
zelenin писал(а): для всего этого этого есть средства в программировании. Сторонний разработчик может предусмотреть, что кто-то что-то захочет переопределить. Вы же можете тоже решить вопрос со своей стороны, воспользовавшись возможностями языка.
a4vi2r
Сообщения: 2
Зарегистрирован: 2017.12.13, 16:19

Re: Как заставить composer использовать fork-версию пакета?

Сообщение a4vi2r »

На всякий случай, если кто-то тоже набредет в поисках ответа, сведу всё воедино:

Проблема в том что git репозиторий дропбокса называется dropbox-sdk-PHP, а пакет (и в composer.json и на packagist.org) называется dropbox/dropbox-sdk (без суффикса -php). Поэтому композер не может сопоставить пакет dropbox/dropbox-sdk с репозиторием автора с фиксами https://github.com/demisang/dropbox-sdk-php.

Варианта решения два:
1. публикуем пакет demisang/dropbox-sdk на packagist.org

2. прописываем в composer.json проекта автора https://github.com/demisang/yii2-dropbox-backup следующее:

Код: Выделить всё

"repositories": [
        {
            "type": "package",
            "package": {
                "name": "dropbox/dropbox-sdk",
                "version": "master",
                "source": {
                    "url": "https://github.com/demisang/dropbox-sdk-php.git",
                    "type": "git",
                    "reference": "dev-fixes"
                },
                "autoload": {
                    "classmap": [""]
                }
            }
        }
],

"require": [
        "dropbox/dropbox-sdk": "dev-fixes",
],
В принципе, эти ответы уже были даны здесь и здесь.

Если неправ - поправьте.
Аватара пользователя
demisang
Сообщения: 159
Зарегистрирован: 2012.10.27, 15:03
Контактная информация:

Re: Как заставить composer использовать fork-версию пакета?

Сообщение demisang »

Если неправ - поправьте.
Поправляю)
Тут речь шла о том, что composer-пакет не может содержать в себе раздел repositories, это мера безопасности, ведь если бы это было возможно - то я мог бы в любом своём расширении заменить стандартный пакет Yii2 на свой форк, в котором смогу изменить всё, что захочу, например любой запрос будет выдавать вьюшку, с требованием денег :D
a4vi2r
Сообщения: 2
Зарегистрирован: 2017.12.13, 16:19

Re: Как заставить composer использовать fork-версию пакета?

Сообщение a4vi2r »

Да, точно, у вас же пакет, невнимательно читал ветку.

Тогда как решили проблему?
Аватара пользователя
demisang
Сообщения: 159
Зарегистрирован: 2012.10.27, 15:03
Контактная информация:

Re: Как заставить composer использовать fork-версию пакета?

Сообщение demisang »

a4vi2r писал(а): 2017.12.14, 14:35 Тогда как решили проблему?
Добавлять раздел repositories в главный composer.json своего проекта ;)
Ответить