I have a directory structure like so:
composer.json < Main
packages/
balunker/
testpackage/
composer.json < Package
src/
Composer seems to get confused if the package is already installed from the original repository: it fetches your local repo and refreshes composer.lock from its composer.json but doesn't even try to fetch changes into vendor directory.
Removing it first seems to address it:
composer remove foo/bar
composer require foo/bar @dev
What helped me resolve was composer clear-cache
and then running composer update
.
Explanation: I had initially tried to composer install my/package
which failed on dependency versions. So I needed to make some local modifications to make it work with Laravel 6.0. However, it continued checking for the wrong version of Laravel packages which led me to believe it was not seeing my local repository which I set in the repositories
key with "type": "path"
. I first ensured the path existed and I was on the correct branch (master
which is why I use dev-master
in my composer.json
). Once I cleared the composer cache and ran the update it updated using my local path with no dependency issues.
"repositories": [
{
"type": "path",
"url": "../libs/package-name"
}
],
"require-dev": {
"pkg-maintainer/package-name": "dev-master"
}
For future Googlers, add your version to the composer.json
and then require the package with the --prefer-source
option.
For example: composer require your-vendor/package:1.0.* --prefer-source
What worked for me was very similar to the above, but I had to specifically target the branch I was developing on.
Assuming code in directory /newapp on the same level as /app, and a branch named feature/the-new-package:
"repositories": [
{
"type": "path",
"url": "newapp"
}
],
"require": {
"package/newapp": "dev-feature/the-new-package"
},
\* did not work, neither did dev-master. It had to be dev-feature/the-new-package.
I posted the issue on Github as well and it turns out that the documentation is a little misleading. It says:
{
"repositories": [
{
"type": "path",
"url": "../../packages/my-package"
}
],
"require": {
"my/package": "*"
}
}
However, if you just have a local repo without releases, you have to use:
{
"repositories": [
{
"type": "path",
"url": "../../packages/my-package"
}
],
"require": {
"my/package": "dev-master"
}
}
The version dev-master
is the key here (given that you are working on the master branch). This was mildly infuriating, but thanks to some helpful composer contributors, I could finally get a grip on this.
I hope this may help somebody in the future.
Good luck!