Uma breve introdução ao caso de uso:
Estou usando um docker
contêiner para executar meus go
testes usando go test ./...
. Isso pode ser alcançado facilmente usando docker exec <container> /bin/sh -c "go test ./..."
. Infelizmente, go test ./...
é executado em todos os subdiretórios e eu gostaria de excluir um (o diretório do fornecedor).
A solução recomendada para isso é usar o seguinte comando go test $(go list ./... | grep -v '<excluded>'
:, de alguma forma, isso me deixa com o seguinte resultado:
docker run golang:1.6.2-alpine /bin/sh -c "go test "
(Eu testei isso tanto no run quanto no exec, mas eles provavelmente usam o mesmo núcleo).
Quando ssh no contêiner usando docker exec -it <container_id> /bin/sh
e executando exatamente o mesmo comando, ele funciona como um encanto.
Parece que a execução de comandos shell através do docker exec / run não suporta nenhum comando aninhado $()
?
$(go list ./... | grep -v '<excluded>'
, o que<excluded>
é?vendor
por exemplo.$(...)
foi expandido pelo seu shell entre aspas duplas antes de ser executado no contêiner do docker. Portanto, o problema pode vir do conteúdo atual do diretório. Funcionoudocker exec container /bin/sh -c 'go test $(go list ./... | grep -v "<excluded>")'
?Respostas:
Seu comando pode não estar funcionando conforme o esperado, graças a uma captura comum do bash:
O comando que você está tentando executar executará a expansão do subshell
$()
no seu host, pois ele está entre aspas duplas.Isso pode ser resolvido citando seu comando com uma única sugestão, conforme sugerido por @cuonglm nos comentários da pergunta.
EDIT: Uma pequena demonstração
fonte
De
go test --help
:Então, acho que algo como
go test -run "(!vendor)" ./...
iria pular essa pasta específica.fonte
$(go test -run "(!vendor)" ./... | egrep -v "no test files\|vendor")