What does the tilde (~) mean in my composer.json file?

SymfonySyntaxComposer Php

Symfony Problem Overview


I have this line in my composer.json file:

"require": {
    ...
    "friendsofsymfony/user-bundle": "~2.0@dev",
    ...
},

What does the tilde ~ in ~2.0@dev exactly mean? Is that a placeholder and shall always fetch the subversions like 1.2.0, 2.2.0, 3.2.0 and so on? Doesn't make sense (and would be done by the * wildcard).

The composer.json documentation doesn't tell anything about the tilde.

I am asking because I just read about a security issue in the Symfony blog and they recommend to upgrade to version 1.3.3. But figuring out the FOSUserBundle's version isn't that easy (I couldn't find a file that contains the version).

Symfony Solutions


Solution 1 - Symfony

Tilde means next significant release. In your case, it is equivalent to >= 2.0, < 3.0.

The full explanation is at Tilde Version Range docs page:

> The ~ operator is best explained by example: ~1.2 is equivalent to >=1.2 <2.0.0, while ~1.2.3 is equivalent to >=1.2.3 <1.3.0.

> Another way of looking at it is that using ~ specifies a minimum > version, but allows the last digit specified to go up.

Seldeak's below comment is a simple sum up explanation of the Composer documentation.

Solution 2 - Symfony

Tilde operator is useful for the projects that version their libraries using semantic versioning scheme.

Semantic versioning is more of a guideline that evaluates to the next significant release.

For Composer, this operator means to allow minor releases (that can include patches) without allowing a major version (that may not be backward compatible) while installing and updating.

For example: ~4.1 will allow project versions >=4.1 but <5.0.

Credits: http://dwellupper.io/post/37/using-tilde-range-operator-to-resolve-dependency-version-in-composer-php

Solution 3 - Symfony

The tilde ~ is one of many constraints that can be used to handle versions.

Next Significant Release Operators (~, ^):

> The ~ operator is best explained by example: ~1.2 is equivalent to >=1.2 <2.0.0, while ~1.2.3 is equivalent to >=1.2.3 <1.3.0

> The ^ operator behaves very similarly, but it sticks closer to > semantic versioning, and will always allow non-breaking updates. For > example ^1.2.3 is equivalent to >=1.2.3 <2.0.0 as none of the releases > until 2.0 should break backwards compatibility. For pre-1.0 versions > it also acts with safety in mind and treats ^0.3 as >=0.3.0 <0.4.0

Hyphenated Version Range (-)

> Inclusive set of versions. Partial versions on the right include are > completed with a wildcard. For example 1.0 - 2.0 is equivalent to > >=1.0.0 <2.1 as the 2.0 becomes 2.0.*. On the other hand 1.0.0 - 2.1.0 is equivalent to >=1.0.0 <=2.1.0

Wildcard Version Range (.*)

> You can specify a pattern with a * wildcard. 1.0.* is the equivalent > of >=1.0 <1.1

Simple Version Range (>, >=, <, <=, !=)

> By using comparison operators you can specify ranges of valid > versions. Valid operators are >, >=, <, <=, !=. > > You can define multiple ranges. Ranges separated by a space ( ) or > comma (,) will be treated as a logical AND. A double pipe (||) will be > treated as a logical OR. AND has higher precedence than OR.

And finally Exact Version Constraint

> You can specify the exact version of a package > Example: 1.0.2

Solution 4 - Symfony

The tilde ~ in ~2.0@dev exactly mean to go up for immediate version :

For Example :

If we have ~2.0@dev it goes to up immediate next version => ~2.x@dev

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionGottlieb NotschnabelView Question on Stackoverflow
Solution 1 - SymfonyAlterPHPView Answer on Stackoverflow
Solution 2 - SymfonyPranav RanaView Answer on Stackoverflow
Solution 3 - SymfonyDylan KasView Answer on Stackoverflow
Solution 4 - SymfonySelim RezaView Answer on Stackoverflow