54

I've got some packages host on the Gitlab of my company. I want to request a specific version of these packages but each time I try, composer download the latest commit of the master branch.

composer.json :

{
   "name" : "MyProject",
   "require" : {
      "user/project" : "v0.5.0"
   },
   "type" : "project",
   "repositories" : [
      {
         "url" : "[email protected]:user/project.git",
         "type" : "vcs"
      }
   ],
   "config" : {
      "vendor-dir" : "private/class"
   }
}

The structure of the repository of my package :

  • tag v0.5.0 : commit dd6ed3c8...
  • commit X,Y,Z
  • tag v0.7.0 : commit 15293ac6...
  • last commit f15600a1...

When I execute "composer install" :

Loading composer repositories with package information

Installing dependencies (including require-dev)

Analyzed 69 packages to resolve dependencies

Analyzed 67 rules to resolve dependencies

  • Installing user/project (dev-master f15600a)

    Cloning f15600a1

It downloads the last commit only.

How can I configure the composer.json file of my project to use a specific tag ?

4 Answers 4

78

How to require a specific Git tag?

Change the version requirement to dev-master, followed by a hash # and the Git tag name, e.g. v0.5.0, like so:

"require": {
    "vendor/package": "dev-master#v0.5.0"
}

How to require a specific Git commit?

Change the version requirement to dev-master, followed by a hash # and the Git commit reference, e.g. dd6ed3c8, like so:

"require": {
    "vendor/package": "dev-master#dd6ed3c8"
}

Referencing: https://getcomposer.org/doc/04-schema.md#package-links


Define your own package and set version and reference

An alternative to working with repositories of "type": "vcs" is to define a custom package "type": "package" inside repositories and work with a reference.

The reference is either a Git commit hash, or a tag or branch name, like origin/master.

This will tie the version to a specific commit reference, in this case dd6ed3c8.

"repositories": [
  # ...
  {
    "type": "package",
    "package": {
      "name": "vendor/package",
      "version": "v0.5.0",
      "source": {
        "url": "[email protected]:vendor/project.git",
        "type": "git",
        "reference": "dd6ed3c8"
      }
    }
  }
]
Sign up to request clarification or add additional context in comments.

7 Comments

I already try this and each time it downloads the last commit. Not the requested tag/commit
I don't know why type vcs doesn't work out for you. I've added an example for defining your own package inside repositories. This allows to set a version and a reference.
I tried your last proposition and still the same result. It clones the whole repository (and uses the last commit) I don't understand why this happens. Maybe I need to use something similar to packagist...
It seems that Gitlab repositories are a problem for Composer and that it will only use Github and Bitbucket's APIs to download the zip archive.While in Gitlab,it will not pick the reference up on a checkout, nor will it fetch a dist(archive of the source) - it will just git clone.
Maybe this helps: github.com/wemakecustom/gitlab-composer Its a branch/tag indexer for Gitlab repositories. Untested.
|
31

Pull by git tag:

{
  "repositories": [
    {
      "type": "git",
      "url": "https://gitlab.xxx.com/some/repo.git"
    }
  ],
  "require": {
    "some/repo": "1.0.2"
  }
}

Pull by latest git commit:

{
  "repositories": [
    {
      "type": "git",
      "url": "https://gitlab.xxx.com/some/repo.git"
    }
  ],
  "require": {
    "some/repo": "dev-master"
  }
}

Pull by specific git commit:

{
  "repositories": [
    {
      "type": "git",
      "url": "https://gitlab.xxx.com/some/repo.git"
    }
  ],
  "require": {
    "some/repo": "dev-master#68696f39"
  }
}

Add repository via Composer Cli and pull latest git commit:

composer config repositories.repo git https://gitlab.xxx.com/some/repo.git
composer require "some/repo:dev-master"
composer update

Comments

11

To require a specific branch you can also just dev-branchname like this:

"require": {
    "user/project" : "dev-my-branch"
},

1 Comment

Enough people saying dev-master made enough sense, but thank you for clarifying this easily with the whole dev- bit... :)
2

You can use a specific version hash after '#', for example:

require": {
    "user/project": "dev-master#31454f258f10329ae7c48763eb898a75c39e0a9f"
}

see: https://getcomposer.org/doc/04-schema.md#package-links

1 Comment

Thanks, I didn't know you can use the version hash for the purpose.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.