Pular para o conteúdo

Versões lado a lado

versions, use, switch e upgrade: uma venv por versão, o pino no forge.toml — e o pino é cobrado, não apenas mostrado.

Havia um jeito de instalar e nenhum de escolher: trocar de versão era reinstalar por cima, e não havia como dizer "este projeto roda na 1.0.0".

Onde as versões moram#

a raiz — ou DATAFORGE_RAIZ
~/.dataforge/
├── versoes/
│   ├── 1.0.0/          uma venv por versao
│   └── 2.0.0/
└── atual               a escolha GLOBAL

DATAFORGE_RAIZ troca a raiz. Não é um detalhe de conveniência: é o que torna tudo isto testável sem mexer na instalação de quem está rodando os testes.

bash
dataforge versions            # o que existe, o que roda, o que o projeto exige
dataforge upgrade             # instala a mais nova AO LADO
dataforge upgrade 1.0.0 --check   # so diz o que faria
dataforge use 1.0.0           # fixa no projeto (forge.toml)
dataforge use 1.0.0 --global  # fixa para a maquina
dataforge switch 1.0.0        # o mesmo comando, outro nome

O pino é cobrado — senão `use` seria um gesto#

dataforge run num projeto que exige outra versão entrega a execução a ela. São três saídas, e a terceira é a que importa:

SituaçãoO que acontece
não há pino, ou ele é satisfeitosegue nesta versão, e o custo é uma leitura de forge.toml
há pino e a versão está instaladatroca (os.execve), e a outra versão recebe os mesmos argumentos
há pino e ela não está instaladarecusa, com o comando que a instala
a recusa, com as três saídas
$ dataforge run main.df
Erro: o projeto exige DataForge 9.9.9, e esta e a 1.0.0, e a 9.9.9 nao esta instalada.
      dataforge upgrade 9.9.9
      dataforge versions          (o que existe aqui)
      DATAFORGE_SEM_TROCA=1 dataforge run    (ignorar o pino, uma vez)

E uma marca no ambiente impede a troca de acontecer duas vezes: um executável mal configurado que apontasse para si mesmo entraria em laço, e um laço na partida é o defeito mais difícil de interromper.

O manifesto é de uma pessoa, e não é reformatado#

use reescreve o forge.toml linha a linha. Serializar o TOML de novo a partir da estrutura apagaria comentários e reordenaria campos — e um comando que mexe num arquivo de configuração não pode reformatá-lo por baixo.

forge.toml depois de 'dataforge use 1.0.0'
# o meu projeto            <- o comentario fica
[project]
name = "loja"
version = "0.1.0"
entry = "main.df"
dataforge = "1.0.0"        <- entra DENTRO da secao, na ultima linha dela

[dependencies]             <- e a outra secao continua onde estava

O campo entra depois da última linha com conteúdo da seção, e não no fim dela: uma linha em branco separa as seções, e inserir depois dela punha o campo do [project] visualmente na seção seguinte. Fixar de novo troca em vez de duplicar.

O que não existe, e é o limite#

Não háConsequência
um shim no PATHo dataforge que você chama é o que está instalado, e é ele que redireciona — quem instala a 2.0.0 e quer que ela atenda direto ainda precisa reinstalar
troca no check, no fmt e nos outrosa troca vale no run. Conferir sintaxe numa versão vizinha quase nunca muda a resposta, e re-executar todo comando dobraria a partida
instalação sem redeupgrade usa pip. Sem rede, --check mostra os passos que ele daria