Configuring composer.json with private Bitbucket Mercurial repository - mercurial

My project uses my own library which is in the private Mercurial repository placed on bitbucket.org. That library has no composer.json configured.
I try to make that library as a dependency to my project.
Firstly I wrote to composer.json the following strings:
{
"require": {
"php": ">=5.4",
"myname/mylibname": "dev"
},
"repositories":[
{
"type": "hg",
"url" : "https://bitbucket.org/myname/mylibname"
}
]
}
And running composer install I've got an error:
[RuntimeException]
Failed to clone https://bitbucket.org/myname/mylibname, could not read packages from it
abort: http authorization required
Than I changed "type": "hg" to "type": "vcs" and got another error:
[Composer\Repository\InvalidRepositoryException]
No valid composer.json was found in any branch or tag of https:/***/mylibname, could not load a package from it.
After additional reading of documentation I added description of my library to the composer.json of my project, and it began to look so:
{
"require": {
"php": ">=5.4",
"myname/mylibname": "dev"
},
"repositories":[
{
"type": "vcs",
"url" : "https://bitbucket.org/myname/mylibname"
},
{
"type":"package",
"package":{
"name":"myname/mylibname",
"version": "dev",
"source":{
"type":"vcs",
"url":"https://bitbucket.org/myname/mylibname",
"reference":"dev"
}
}
}
]}
The same error occured:
[Composer\Repository\InvalidRepositoryException]
No valid composer.json was found in any branch or tag of https:/***/mylibname, could not load a package from it.
I removed the part:
{
"type": "vcs",
"url" : "https://bitbucket.org/myname/mylibname"
},
and got an error:
[InvalidArgumentException]
Unknown downloader type: vcs. Available types: git, svn, hg, perforce, zip, rar, tar, gzip, phar, file.
I changed "type": "vcs" back to "type": "hg", composer.json looks like:
{
"require": {
"php": ">=5.4",
"myname/mylibname": "dev"
},
"repositories":[
{
"type":"package",
"package":{
"name":"myname/mylibname",
"version": "dev",
"source":{
"type":"hg",
"url":"https://bitbucket.org/myname/mylibname",
"reference":"dev"
}
}
}
]}
and an error:
[RuntimeException]
Failed to execute hg clone 'https:/***/mylibname' '/path/to/myproject'
abort: http authorization required
The structure of my auth.json, which lies besides of composer.json is:
{
"http-basic": {
"bitbucket.org": {
"username": "myusername",
"password": "mypassword"
}
}
}

Seems like bitbucket-oauth method is buggy in the current state as of 1.1 of composer. This means that either you must have setup the SSH key on the client or if you are like me and cant setup keys because of deployment server, you will have to use basic auth.
The only way I got this working was:
~/.composer/auth.json
{
"http-basic": {
"bitbucket.org": {
"username": "bitbucketUsername",
"password": "PasswordToBitbucket"
}
}
}
composer.json
"repositories": [
{
"url": "https://username#bitbucket.org/username/my-package.git",
"type": "git"
}
],
"require": {
"username/my-package": "dev-master"
},

Composer as of version 1.2.0 have sorted this with bitbucket oauth, this is a much better method than ssh-keys if multiple developers are working on a project as the auth.json can stay within the project repository (if it's private) and only has to be setup once.
auth.json
{
"bitbucket-oauth": {
"bitbucket.org": {
"consumer-key": "key",
"consumer-secret": "secret"
}
}
}
composer.json
"repositories":[
{
"type": "vcs",
"url": "git#bitbucket.org:path/to.git"
}
]

Just remove https://. Works for me :)
{
"require": {
"php": ">=5.4",
"myname/mylibname": "dev"
},
"repositories":[
{
"type":"package",
"package":{
"name":"myname/mylibname",
"version": "dev",
"source":{
"type":"hg",
"url":"bitbucket.org/myname/mylibname",
"reference":"dev"
}
}
}
]}

That didn't quite work for me, but it got me pointed into the right direction. Make sure you get your SSH key installed to access it via git#.
{
"repositories": [
{
"type": "package",
"package": {
"name": "myname/mylibname",
"version": "master",
"source": {
"type": "git",
"url": "git#bitbucket.org:myname/mylibname.git",
"reference": "master"
}
}
}
]
}

One comment on my end.
I have tested above scenarios I encountered on composer suggestion that repository needs to have at least one stable version.
https://getcomposer.org/doc/04-schema.md#minimum-stability
Due to this, I used "dev" TAG along with SSH connection and it works.
{
"require": {
"php": ">=5.4",
"myname/mylibname": "dev"
},
"repositories":[
{
"type":"package",
"package":{
"name":"myname/mylibname",
"version": "dev",
"source":{
"type":"git",
"url":"git#bitbucket.org:myname/mylibname.git",
"reference":"dev"
}
}
}
]}

I thought I had best contribute to the confusion and share what configuration worked for me. Firstly, I absolutely could not get the recommended setup from composer to work. However, the following did:
1.Edit ~.composer/auth.json and configure the http-basic key.
{
"bitbucket-oauth": {},
"github-oauth": {},
"gitlab-oauth": {},
"gitlab-token": {},
"http-basic": {
"bitbucket.org": {
"username": "USERNAME",
"password": "PASSWORD"
}
}
}
2.Use the following to define the package in your composer.json (i.e. private repository). Also bare in mind this is not a personal BitBucket account, I am a part of a team so the USERNAME#bitbucket.org is MY username and second instance is the company (https://{USERNAME}#bitbucket.org/{USERNAME||VENDOR}/{REPO}.git).
"require": {
"{USERNAME||VENDOR}/{REPO}": "dev-{BRANCH}
}
"repositories:" [
{
"type": "package",
"package": {
"name": "{USERNAME/VENDOR/REPO}",
"version": "master",
"source": {
"url":
"https://{URL}",
"type": "git",
"reference": "master"
}
}
}
]
Miscellaneous & noteworthy things to consider:
I did not use access keys
I do have my SSH key on BitBucket
I am an administrator on BitBucket
I am target the master branch
There are NO tags on the repository
Minimum stability is set to dev
You will need to add the autoload options to the package (see this)
I hope this helps anyone frustrated by this, it defintely seems as though everybody has issues. Thanks to #Tomasz Czechowski for providing the answer that eventually got this working for me!

Another example with bitbucket git repo using OAuth consumer authorization, which is actually working. Note that repo is starting with https, otherwise composer will fail with an error 'undefined offset: 1'.
auth.json
{
"bitbucket-oauth": {
"bitbucket.org": {
"consumer-key": "...",
"consumer-secret": "..."
}
}
}
composer.json
"repositories": [
{
"type": "git-bitbucket",
"url": "https://bitbucket.org/workspace/repo.git"
}
]

Related

invalid composer.json metadata packagist

When I push new tag to my package to update my composer plugin it returns this error:
Update of failed, invalid composer.json metadata
[Composer\Repository\InvalidRepositoryException] Some branches
contained invalid data and were discarded, it is advised to review the
log and fix any issues present in branches
Here is my composer.json file:
{
"name": "package/name",
"description": "....",
"keywords": [
"...",
"...",
"..."
],
"homepage": "https://github.com/username/package-name",
"type": "composer-plugin",
"require": {
"php": "^7.4|^8.0",
"illuminate/support": "^7.0|^8.0|^9.0"
},
"require-dev": {
"composer/composer": "^2.0"
},
"license": "MIT",
"autoload": {
"psr-4": {
"Package\\Name\\": "src/"
}
},
"authors": [
{
"name": "My name",
"email": "my#email.com"
}
],
"minimum-stability": "dev"
}
And when I run composer validate I get ./composer.json is valid.
As you can see there is no domain name mention whatsoever but error is returning my domain name as invalid which says: must be an http/https URL
Any idea?
You need to read the error message in full and with peace of mind (unfortunately you were hiding it from the question by encoding it as image/png).
Don't look into one revision, instead search the history for it:
$ git log -p -S 'funding' main composer.json
It should get you started to learn about the revisions that are related to "funding" in composer.json within the main branch.

Load composer package from private gitlab

In my composer setup I load packages from 2 repos. One composer repo and a private gitlab repo. When I try to do a composer install on my local windows machine, I get the following error messages:
GitLab: The project you were looking for could not be found. fatal:
Could not read from remote repository. Please make sure you have the
correct access rights and the repository exists. ... The requested
package sv-test/testextension could not be found in any version, there
may be a typo in the package name.
Authentification is done via lokal ssh-key and password, that doesnt seem to be the problem. Whats wrong with my setup?
The composer.json of the project looks like this:
{
"repositories": [
{
"type": "composer",
"url": "https://composer.typo3.org/"
},
{
"type": "git",
"url": "git#gitlab.xydevbox.de:sv-test/Testproject.git"
}
],
"name": "svdev/master-dev-box",
"description": "",
"type": "project",
"license": "MIT",
"homepage": "https://www.xydevbox.de/",
"authors": [
{
"name": "Sacha Vorbeck",
"email": "sacha.vorbeck#xydevbox.de",
"homepage": "https://www.xydevbox.de/",
"role": "Developer"
}
],
"require": {
"sv-testbox/testextension": "*",
"helhum/typo3-console": "^4.5",
"typo3/cms": "^8.7"
},
"config": {
"sort-packages": true,
"process-timeout": 2000,
"preferred-install": {
"typo3/cms": "source",
"*": "dist"
}
},
"extra": {
"typo3/cms": {
"cms-package-dir": "{$vendor-dir}/typo3/cms",
"web-dir": "web"
}
}
}
The composer.json from the package to be included from the gitlab private repo looks like this:
{
"name": "sv-testbox/testextension",
"type": "typo3-cms-extension",
"description": "",
"homepage": "https://www.xydevbox.de/",
"license": ["GPL-2.0+"],
"keywords": ["TYPO3 CMS"],
"version": "master",
"dist": {
"url": "git#gitlab.xydevbox.de:sv-test/Testproject.git",
"type": "git"
}
}
Maybe the latest composer version 1.5.2 is something for you if you take a look at the release notes
Fixed GitLabDriver looping endlessly in some conditions
Fixed
GitLabDriver support for unauthenticated requests
Fixed GitLab zip
downloads not triggering credentials prompt if unauthenticated
Fixed
path repository support of COMPOSER_ROOT_VERSION, it now applies to
all path repos within the same git repository
Fixed path repository
handling of copies to avoid copying VCS files and others
Fixed
sub-directory call to ignore list and create-project commands as well
as calls to Composer using --working-dir
Fixed invalid warning
appearing when calling remove on an non-stable package
https://github.com/composer/composer/releases
Thank you Georg and NextThursday. With some help on TYPO3 slack I finally got it running. The replace part was missing. I also learned that one should not edit composer.json files manually - always use the command line options to modify it. This example: https://github.com/TYPO3-Console/TYPO3-Console/blob/master/composer.json was also helpful.
project composer.json:
{
"repositories": [
{
"type": "composer",
"url": "https://composer.typo3.org/"
},
{
"type": "vcs",
"url": "https://github.com/svorbeck/masterconfig"
}
],
"name": "svorbeck/demo",
"description": "",
"type": "project",
"license": "MIT",
"homepage": "https://xydevbox.de/",
"authors": [
{
"name": "Sacha Vorbeck",
"email": "sacha.vorbeck#xydevbox.de",
"role": "Developer"
}
],
"require": {
"svorbeck/masterconfig": "dev-master",
"typo3/cms": "^8.7"
},
"config": {
"sort-packages": true,
"process-timeout": 2000,
"preferred-install": {
"typo3/cms": "source",
"svorbeck/masterconfig": "source",
"*": "dist"
}
},
"extra": {
"typo3/cms": {
"cms-package-dir": "{$vendor-dir}/typo3/cms",
"web-dir": "web"
},
"helhum/typo3-console": {
"install-extension-dummy": "0"
}
}
}
ext composer.json:
{
"name": "svorbeck/masterconfig",
"type": "typo3-cms-extension",
"description": "svorbeck master configuration",
"require": {
"typo3/cms-core": "^8.7"
},
"replace": {
"masterconfig": "self.version",
"svorbeck/masterconfig": "self.version"
}
}

Getting extension from private repo with composer

I have to create a private yii2 extension on BitBucket, and install it in my projects with composer.
The SSH is set up correctly as far as I can understand, it was not at first - and I got an error "repo not found or you do not have permission" (or something of the kind).
The composer finds the composer.json, I removed it to test and I got an error message that "valid composer.json not found".
Now when i run composer update in my Git Bash it just prints "Nothing to install or update" and nothing appears in my vendor/ folder.
I have no errors to go on here, any ideas are mostly welcome!
I've set up the repo and added the following files:
composer.json
{
"name": "ext. name",
"type": "yii2-extension",
"description": "My desc",
"authors": [
{
"name": "Jorgen",
"email": "jorgen#domain.com",
"homepage": "http://www.domain.com"
}
],
"minimum-stability": "stable",
"support": {
"source": "bitbucket.org/companyname/yii2-extensionname"
},
"require": {
"php": ">=5.4.0",
"yiisoft/yii2": "2.0.*"
},
"autoload": {
"psr-4": {
"companyname\\extensionname\\": ""
}
}
}
.gitignore
vendor/**
models/Test.php
<?php
namespace companyname\extensionname\models;
class Test
{
}
And I've added the following to my Yii2 project composer.json:
"repositories": [
{
"type": "vcs",
"url": "ssh://git#bitbucket.org/companyname/yii2-extensionname",
}
],
Update
So I figured out that if I add my repo in this format it's found and downloaded, but the autoloader-psr4.php file is not updated with my autoloading.
"repositories": [
{
"type": "package",
"package": {
"name": "vendor/yii2-extension-name",
"version": "master",
"source": {
"type": "git",
"url": "git#bitbucket.org:vendor/yii2-extension-name",
"reference": "origin/master"
}
}
}
When I have
"repositories": [
{
"type": "git",
"url": "https://bitbucket.org/vendor/yii2-extension-name"
}
],
I get the following error:
Problem 1
- The requested package vendor/yii2-extension-name could not be found in any version, there may be a typo in the package name.
Potential causes:
- A typo in the package name
- The package is not available in a stable-enough version according to your minimum-stability setting
see https://groups.google.com/d/topic/composer-dev/_g3ASeIFlrc/discussion for more details.
Read https://getcomposer.org/doc/articles/troubleshooting.md for further common problems.
There is no typos, its found and downloaded when I use "package". But then the autoloader is not updated.I've also tried all sorts of variations with git#, https and ssh. It always works as a package, never as a git or vcs.
Edit: oh, and minimum-stability is set to dev while troubleshooting.
You must use the correct name:
{
"name": "vendor/yii2-extension-name",
"type": "yii2-extension",
That is usually your Bitbucket username followed by the name of your repository.
That will work with your repositories Composer setting:
"repositories": [
{
"type": "git",
"url": "https://bitbucket.org/vendor/yii2-extension-name"
}
],

Loading a package from a VCS repository not working

I am trying to use a personal repository with modified code of someone elses repository on GitHub.
I did exactly what getcomposer.org said by adding repositories in composer.json.
Whenever I composer update though, I check the code and it's always the original one instead of mine.
This is my composer.json.
{
[...]
"repositories": [
{
"type": "vcs",
"url": "https://github.com/GiampaoloFalqui/php-phantomjs"
},
{
"type": "vcs",
"url": "https://github.com/GiampaoloFalqui/tesseract-ocr-for-php"
}
],
"require": {
"laravel/framework": "4.2.*",
"codesleeve/asset-pipeline": "dev-master",
"jonnyw/php-phantomjs": "3.*",
"thiagoalessio/tesseract_ocr": ">= 0.2.0"
},
[...]
}
Solved by branching the code in a branch that is not master and by adding dev- followed by the branch name in the composer.json (in my case bugfix), like this:
"require": {
"laravel/framework": "4.2.*",
"codesleeve/asset-pipeline": "dev-master",
"jonnyw/php-phantomjs": "dev-bugfix",
"thiagoalessio/tesseract_ocr": "dev-bugfix"
},

Composer package not showing up in autoload_namespaces

This should be an easy one. I developed a package call it MyVendor\MyPackage
inside MyVendor\MyPackage is:
MyVendor\MyPackage\composer.json
MyVendor\MyPackage\MyClass.php
The MyVendor\MyPackage\composer.json file contains:
{
"name":"MyVendor/MyPackage",
"description":"MyClass!!!",
"keywords": ["MyKeyword"],
"homepage": "http://MyPackage.com",
"type":"library",
"license": "MIT",
"authors": [
{
"name": "ME",
"email": "ME#ME.com",
"homepage":"http://ME.com"
}
],
"require": {
},
"autoload":{
"psr-4" : {
"MyVendor\\MyPackage\\":""
}
}
}
Now I have another project called MyOtherPackage whose composer.json file looks like:
{
"require": {
"monolog/monolog": "1.2.*",
"MyVendor/MyPackage": "1.0.0"
},
"autoload": {
"psr-4": {
"MyVendor\\MyOtherPackage\\": "MyOtherPackage/",
"MyVendor\\": "/"
}
},
"repositories": [
{
"type": "package",
"package": {
"name": "MyVendor/MyPackage",
"version": "1.0.0",
"source": {
"url": "https://ME.com/svn/MyVendor/MyPackage/",
"type": "svn",
"reference": "trunk"
}
}
}
]
}
So MyOtherPackage depends on MyPackage. Everything downloads just fine, but if I open up autload_namespaces.php it only includes monolog. It looks like this:
return array(
'Monolog' => array($vendorDir . '/monolog/monolog/src'),
);
Why isn't MyVendor/MyPackage appear in the namespaces.php or autoload_psr4.php file? Is the composer.json file wrong?
EDIT I added to the MyPackage composer.json file.
I've figured it out. It seems as if defining the repository as a package, I am telling composer that it isn't a composer compatible class, which means composer doesn't look for a composer.json file.
To fix it I removed the package definition and made the dependent class's composer.json file to look like:
{
"require": {
"monolog/monolog": "1.2.*",
"MyVendor/MyPackage": "1.0.0"
},
"autoload": {
"psr-4": {
"MyVendor\\MyOtherPackage\\": "MyOtherPackage/",
"MyVendor\\": "/"
}
},
"repositories": [
{
"type": "svn",
"url": "https://ME.com/svn/MyVendor/MyPackage/",
"reference": "tags"
}
]
}
This tells composer to download the package from this repository and look for the composer.json file.
You did not define any autoload mechanism in your first package. If you don't, Composer cannot know how to autoload the classes, and does nothing (which is a valid option if your package does not contain any PHP at all, but for example only images and javascript).
Add something like this:
"autoload": {
"psr-0": {
"MyVendor\\Namespace":"src/path"
}
}