Devo salvar a versão no Gemfile/package.json?

Ao contrário do que muita gente pensa eu sempre achei que não, mas será que bundle, npm e yarn se comportam do mesmo jeito?

#dev, #javascript, #ruby

tl;dr

Não, a menos que alguma atualização quebre o seu sistema. O Gemfile.lock/yarn.lock serve para isso.


Para responder a essa pergunta eu vou tentar causar o problema que não armazenar a versão no Gemfile/package.json pode causar.

Gemfile e Bundle

Vamos supor que eu tenha esse Gemfile:

source "https://rubygems.org"

gem "sinatra", "1.0.0"

E esse Gemfile.lock:

GEM
  remote: https://rubygems.org/
  specs:
    rack (2.0.6)
    sinatra (1.0)
      rack (>= 1.0)

PLATFORMS
  ruby

DEPENDENCIES
  sinatra (= 1.0.0)

BUNDLED WITH
   1.16.3

Agora eu vou desinstalar todas as gems, remover a trava (= 1.0.0) do Gemfile, e rodar bundle install.

Adivinha só!? A mesma versão 1.0.0 do sinatra foi instalado.

package.json and npm

Vamos supor que eu tenha esse package.json:

{
  "name": "app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "= 3.0.0"
  }
}

E esse package-lock.json.

Agora vou fazer o mesmo: remover node_modules, remover a trava (substituir = 3.0.0 por *) e rodar npm install novamente.

Bazinga! npm instalou a versão 3.0.0 novamente!

package.json and yarn

Vamos dizer que eu tenha esse package.json (o mesmo de antes):

{
  "name": "app",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "= 3.0.0"
  }
}

E esse yarn.lock.

Vou fazer o mesmo: remover o node_modules, remover a trava (substituir = 3.0.0 por *), e rodar yarn install novamente.

💥 BOOM!!! Quebrou. O yarn instala a última versão mesmo que exista o yarn.lock.


Bom, eu não sei você, mas se uma funcionalidade está em 2 (de um total de 3) gerenciadores de pacotes essa funcionalidade parece certa para mim.