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#
~/.dataforge/
├── versoes/
│ ├── 1.0.0/ uma venv por versao
│ └── 2.0.0/
└── atual a escolha GLOBALDATAFORGE_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.
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 nomeO 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ção | O que acontece |
|---|---|
| não há pino, ou ele é satisfeito | segue nesta versão, e o custo é uma leitura de forge.toml |
| há pino e a versão está instalada | troca (os.execve), e a outra versão recebe os mesmos argumentos |
| há pino e ela não está instalada | recusa, com o comando que a instala |
$ 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.
# 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 estavaO 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 PATH | o 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 outros | a 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 rede | upgrade usa pip. Sem rede, --check mostra os passos que ele daria |