Install private repositories on sub-repositories - composer-php

I have two private repositories, let's call them RepoA and RepoB. RepoA is required by the RepoB and they are both private repos on gitlab with the port 620.
Here are the composer.json in both repo:
Repo A
{
"name": "namespace/repoA",
"description": "My repository A.",
"require": {
"php": ">=5.4"
}
}
Repo B
{
"name": "namespace/repoB",
"description": "My repository B.",
"repositories": [
{
"type": "vcs",
"url": "ssh://git#git.domain.com:620/namespace/repoA.git"
}
],
"require": {
"namespace/repoA": "dev-master"
}
}
Now let's say I have a project (ProjectA), which I want to install RepoB.
Project A
{
"repositories": [
{
"type": "vcs",
"url": "ssh://git#git.domain.com:620/namespace/repoB.git"
}
],
"require": {
"namespace/repoB": "dev-master"
}
}
However, when I run my composer install, I get the following error:
Problem 1
- Installation request for namespace/repoB dev-master -> satisfiable by namespace/repoB[dev-master].
- namespace/repoB dev-master requires namespace/repoA dev-master -> no matching package found.
I understand that it's unable to find the package since it's a private repository, but since it's inside the repositories of the repoB, why is it not fetching it?
I thought it would work if I added the repositories to the Project A:
{
"repositories": [
{
"type": "vcs",
"url": "ssh://git#git.domain.com:620/namespace/repoA.git"
},
{
"type": "vcs",
"url": "ssh://git#git.domain.com:620/namespace/repoB.git"
}
],
"require": {
"namespace/repoB": "dev-master"
}
}
But it still does not work until I add it into my require of my Project Aas well:
{
"repositories": [
{
"type": "vcs",
"url": "ssh://git#git.domain.com:620/namespace/repoA.git"
},
{
"type": "vcs",
"url": "ssh://git#git.domain.com:620/namespace/repoB.git"
}
],
"require": {
"namespace/repoB": "dev-master",
"namespace/repoA": "dev-master"
}
}
Now my question is... How can I make composer install my repoA by specifying only my repoB?

You cannot and here is an explanation: Why can't Composer load repositories recursively?

Related

How to add multiple packages with forked repositories?

I want to add multiple packages that I have forked in composer.
I have used the way that is described in https://getcomposer.org/doc/05-repositories.md#loading-a-package-from-a-vcs-repository but what is described there is for only one package and I want to do it for multiple packages. How should I declare it? I want to add extra repository links.
{
"repositories": [
{
"type": "vcs",
"url": "https://github.com/igorw/monolog"
}
],
"require": {
"monolog/monolog": "dev-bugfix"
}
}
I have found the answer.
{
"repositories": [
{ "type": "vcs", "url": "https://github.com/igorw/monolog" },
{ "type": "vcs", "url": "https://github.com/igorw/dialog" }
],
"require": {
"monolog/monolog": "dev-bugfix",
"dialog/dialog": "dev-bugfix"
},
}

Load composer dependencies of private git repository

I've been a bit confused how Composer loads dependencies of a private repository project. I have found this link but I am not sure if this comment is referring to nested repositories or simply any dependency of a repository. To clarify my situation:
I have a private git repository that I am attempting to add as a dependency for a project.
The private git repository is also a composer project, which contains a composer.json which requires publicly available packages.
I have the following code in my composer.json for the project.
"repositories": [
{
"type": "package",
"package": {
"name": "{vendor}/{package-name}",
"version": "{arbitrary-version}",
"type": "package",
"source": {
"url": "git#github.com:{github-username}/{github-repository}.git",
"type": "git",
}
}
}
]
"require": {
"{vendor}/{package-name}": "^0.0.1"
}
So if I were to do composer update on the project after these changes it will successfully download my package from the private repository, but it does not trigger a check/update on the composer.json of the private repository - so no vendor folder is created and critical dependencies are not installed. The private repository composer.json is below:
{
"name": "{vendor}/{package-name}",
"description": "{removed}",
"type": "library",
"require": {
"illuminate/database": "^5.6",
"chumper/zipper": "1.0.x",
"symfony/debug": "^4.0",
"vlucas/phpdotenv": "^2.4"
},
}
So my question is, is what I want to do achievable with a private repository via composer and if so does anybody know where I am going wrong?
package type is for non-composer dependencies. If you use this type, Composer will not even look for composer.json file inside of defined package source, you need to include all required information about package inside of the package declaration in your project composer.json:
"repositories": [
{
"type": "package",
"package": {
"name": "{vendor}/{package-name}",
"description": "{removed}",
"type": "library",
"require": {
"illuminate/database": "^5.6",
"chumper/zipper": "1.0.x",
"symfony/debug": "^4.0",
"vlucas/phpdotenv": "^2.4"
},
"version": "{arbitrary-version}",
"source": {
"url": "git#github.com:{github-username}/{github-repository}.git",
"type": "git",
}
}
}
]
But in your case (you have a package with proper composer.json) you should use vcs type:
"repositories": [
{
"type": "git",
"url": "git#github.com:{github-username}/{github-repository}.git"
}
]

Composer: How to define repositories for internal Gitlab projects with hierarchy?

I have three projects (p1, p2, p3) in a local Gitlab installation. The project p1 requires p2, the project p2 requires p3.
The p2/composer.json looks like this:
{
"name": "my-group/p2",
...
"repositories": [
{
"type": "vcs",
"url": "ssh://git#git.local.dev/my-group/p3.git"
}
],
"config": {
"gitlab-token": {
"gitlab.com": "my-token"
}
},
"require": {
"my-group/p3": "dev-develop"
}
}
The command 'composer install' works for the p2 project without any problems.
The p1/composer.json looks like:
{
"name": "my-group/p1",
...
"minimum-stability": "dev",
"prefer-stable": true,
"repositories": [
{
"type": "vcs",
"url": "ssh://git#git.local.dev/my-group/p2.git"
}
],
"config": {
"gitlab-token": {
"gitlab.com": "my-token"
}
},
"require": {
"my-group/p2": "dev-develop"
}
}
The command 'composer install' displays for the project p1 the following error message:
$ composer install
...
Problem 1
- Installation request for my-group/p2 dev-develop -> satisfiable by my-group/p2[dev-develop].
- my-group/p2 dev-develop requires my-group/p3 dev-develop -> no matching package found.
According to https://getcomposer.org/doc/05-repositories.md#repository, the repositories option is only evaluated from the root composer.json. So, if you don't make p3 available through satis or some other services that covers multiple repositories, this won't work
The following composer.json works:
{
"name": "my-group/p1",
...
"repositories": [
{
"type": "vcs",
"url": "ssh://git#git.local.dev/my-group/p2.git"
},
{
"type": "vcs",
"url": "ssh://git#git.local.dev/my-group/p3.git"
}
],
"config": {
"gitlab-token": {
"gitlab.com": "my-token"
}
},
"minimum-stability": "dev",
"prefer-stable": true,
"require": {
"my-group/p2": "dev-develop"
}
}
The problem is, that I do not know, what the project p2 requires and I do not want to have all internal projects in the composer.json.

composer installs own TYPO3 extension in wrong path

I have a own TYPO3 extension hosted on bitbucket. Getting this via composer works (see here for input). The extension is downloaded into my vendor folder. Being there i cannot install the extension via extension-manager.
How can I getting my ext into typo3conf/ext (ensuring autoloading will work)?
The extensions coming via
{
"type": "composer",
"url": "http://composer.typo3.org/"
}
are going to (as expected):
web/typo3config/ext
here is my project composer.json:
{
"repositories": [
{
"type": "composer",
"url": "http://composer.typo3.org/"
},
{
"type": "package",
"package": {
"name": "metaxos/exaibbrplus",
"version": "dev-2016",
"source": {
"url": "https://metaxos#bitbucket.org/metaxos/exaibbrplus.git",
"type": "git",
"reference": "release/2016"
}
}
}
],
"name": "Metaxos/ibbrating2016",
"require": {
"typo3/cms": "7.6.2",
"bk2k/bootstrap-package" : "dev-master",
"typo3-ter/compatibility6" : "7.6.0",
"typo3-ter/extension-builder" : "7.6.0",
"metaxos/exaibbrplus": "dev-2016"
},
"extra": {
"typo3/cms": {
"cms-package-dir": "{$vendor-dir}/typo3/cms",
"web-dir": "web"
}
}
}
here is my extension composer.json:
{
"name": "metaxos/exaibbrplus",
"description": "custom ext for typo3",
"type": "typo3-cms-extension",
"version": "0.0.1",
"require": {
"typo3/cms-core": ">=7.6.0,<8.0"
},
"replace": {
"extkey": "self.version",
"typo3-ter/extkey": "self.version"
},
"autoload": {
"psr-4": {
"Metaxos\\Exaibbrplus\\": "Classes/"
}
},
"keywords": ["custom", "ext"],
"homepage": "http://www.blah.ch"
}
For Composer to install the package in web/typo3conf/ext, the package needs to have the type typo3-cms-extension. In your extension's composer.json this type is actually declared, however Composer will not respect it because you explicitly declare the package configuration in your project-level composer.json:
"repositories": [
# ...
{
"type": "package",
"package": {
"name": "metaxos/exaibbrplus",
"version": "dev-2016",
"source": {
"url": "https://metaxos#bitbucket.org/metaxos/exaibbrplus.git",
"type": "git",
"reference": "release/2016"
}
}
}
]
As you're using "type": "package" for your own repository, I suspect that Composer ignores the composer.json from that package. As you already have a Git repository that contains a composer.json, I'd suggest adding the repository using the vcs type instead:
"repositories": [
{
"type": "vcs",
"url": "https://metaxos#bitbucket.org/metaxos/exaibbrplus.git"
}
]
When doing that, Composer should use the composer.json from that repository, recognize the correct package type (typo3-cms-extension) and install the package in the correct directory.
You need to add the type key with the value typo3-cms-extension to the root composer.json. This will place your extension in web/typo3conf/ext instead of vendor/$vendor/$package which in turn will make it available to the cms.
It is important, to know that if you redefine the package in the root composer.json as repository type package, nothing from the extensions' composer.json file will be taken into account and you need to define any concerns about that package in the root composer.json.
So-applying the rules I mentioned above, your root composer.json will look like that:
{
"repositories": [
{
"type": "composer",
"url": "http://composer.typo3.org/"
},
{
"type": "package",
"package": {
"name": "metaxos/exaibbrplus",
"version": "dev-2016",
"type": "typo3-cms-extension",
"source": {
"url": "https://metaxos#bitbucket.org/metaxos/exaibbrplus.git",
"type": "git",
"reference": "release/2016"
},
"autoload": {
"psr-4": {
"Metaxos\\Exaibbrplus\\": "Classes/"
}
},
}
}
],
"name": "Metaxos/ibbrating2016",
"require": {
"typo3/cms": "7.6.2",
"bk2k/bootstrap-package" : "dev-master",
"typo3-ter/compatibility6" : "7.6.0",
"typo3-ter/extension-builder" : "7.6.0",
"metaxos/exaibbrplus": "dev-2016"
},
"extra": {
"typo3/cms": {
"cms-package-dir": "{$vendor-dir}/typo3/cms",
"web-dir": "web"
}
}
}
As mentioned above by #helmbert, you are either left with completely redefining the package or using another repository type. You may want to consider using satis or a URL repository.
try to add
"replace": {
"exaibbrplus": "self.version",
"typo3-ter/exaibbrplus": "self.version"
},
And use only "Metaxos\\Exaibbrplus\\": "Classes/" in the autoloader.

Composer dependencies in local package

I use a local repository ("depA") within my projects composer.json:
"repositories": [
{
"type": "package",
"package": {
"name": "marc/depA",
"version": "dev-master",
"source": {
"url": "/Users/Marc/Sites/depA",
"type": "git",
"reference": "develop"
}
}
}
],
"require": {
"marc/depA": "dev-master",
This works like a charm but it won't resolve dependencies from "depA". This means since "depA" requires "depB" (in composer.json of "depA") -> "depB" wont be installed.
Is this even possible with local packages?
Thanks,
Marc
You are defining the package inline so if you do it like this you must redefine all the requires etc inline as well. That's really not the best way to go at it. If it's a git repo and it has a composer.json you'd better use a vcs repository e.g.:
{
"repositories": [
{
"type": "vcs",
"url": "/Users/Marc/Sites/depA"
}
],
"require": {
"marc/depA": "dev-master",
}
}

Resources