Esta é uma discussão, mas para manter registros e pode ajudar outras pessoas. Então, eu registro aqui. Eu sei que existe um canal #cider/#emacs
no Slack. Vou postar esse link ali.
Quero usar uma versão e um ambiente diferente do Clojure. Existe uma imagem oficial do Clojure Docker. https://hub.docker.com/_/clojure
Estou pensando em como usar o binário da imagem Clojure e REPL no Emacs e CIDER.
Existem algumas maneiras de acessar a imagem do Docker como eu sei:
docker.el
.docker-tramp.el
e docker.el
para acessar comandos binários do contêiner clojure como clojure
, clj
etc. Para que o Emacs os use como caminho de comando executável. Como a CIDER, tem a opção de personalização cider-clojure-cli-command
. Tentei seguir, mas falhei.(add-to-list 'exec-path "/docker:clojure:/usr/local/bin/")
(setq cider-clojure-cli-command "/docker:clojure:/usr/local/bin/clojure")
Alguém tem sugestão e solução? Bem-vindo ao adicionar. (Isso pode aumentar o Wiki, quando a discussão está quase) Obrigado por ver.
Descobri que o CIDER tem uma variável para manter os registros de conexão. Pode ser usado em maiúsculas.
Assim:
(setq cider-known-endpoints
'(("host-a" "10.10.10.1" "7888")
("host-b" "7888")))
docker-tramp.el
para abrir arquivos no contêiner, então cider-jack-in-*
, o CIDER poderia lidar com isso de forma transparente.Eu uso docker-compose e volumes:
# docker-compose.yml
version: '3'
volumes:
m2:
gitlibs:
services:
app:
image: clojure:tools-deps-alpine
working_dir: "${PWD}"
command: "true"
ports:
- "4444:4444" # nrepl
- "4445:4445" # http
environment:
- "CLJ_CONFIG=${PWD}/.docker-clojure"
- DATABASE_URL=postgres://postgres:password<strong i="6">@db</strong>:5432/postgres
- TEST_DATABASE_URL=postgres://postgres:password@test-db:5432/postgres
- PORT=4446
volumes:
- ".:${PWD}:cached" # cached - MacOS option
- m2:/root/.m2
- gitlibs:/root/.gitlibs
links:
- db
- test-db
db: &db
image: postgres:10.4-alpine
environment:
- POSTGRES_PASSWORD=password
test-db:
<<: *db
;; .docker-clojure/deps.edn
{:aliases {:cider {:extra-deps {darkleaf/cider-tools-desp
{:git/url "https://github.com/darkleaf/cider-tools-deps.git"
:sha "1025b510db24b36ab741bc5599e36806eec904ec"}}
:main-opts ["-m" "darkleaf.cider-tools-deps"
"port" "4444" "host" "0.0.0.0"]}
:repl {:extra-deps {darkleaf/repl-tools-deps
{:git/url "https://github.com/darkleaf/repl-tools-deps.git"
:sha "04e128ca67785e4eb7ccaecfdaffa3054442358c"}}
:main-opts ["-m" "darkleaf.repl-tools-deps"]}
:run-tests {:extra-deps {com.cognitect/test-runner
{:git/url "https://github.com/cognitect-labs/test-runner.git"
:sha "028a6d41ac9ac5d5c405dfc38e4da6b4cc1255d5"}}
:main-opts ["-m" "cognitect.test-runner"]}
:coverage {:extra-deps {cloverage {:mvn/version "1.0.13"}}
:main-opts ["-m" "cloverage.coverage" "-p" "src" "-s" "test"]}}}
Eu corro docker-compose run --rm --service-port app bash
e de clojure -Acider
.
No emacs, pressiono C-c M-c
e conecto localhost:4444
.
Dependências são instaladas em volumes. Portanto, o Emacs não pode ter acesso a eles.
Dependências são instaladas em volumes. Portanto, o Emacs não pode ter acesso a eles.
Estou confuso com isso. As dependências são instaladas nos volumes, mas o Emacs CIDER se conecta ao contêiner iniciado em clojure -Acider
alias. Portanto, se clojure -Acider
deve ser capaz de acessar todas as dependências no contêiner. Adicionar dependências de projeto a um arquivo de contêiner deps.edn
?
O Docker pode acessar as dependências de .m2/
do sistema host? Assim, o Docker será uma ponte entre o Emacs CIDER e as dependências do sistema host.
Temos o Maven e ferramentas como Boot e Leiningen, por que diabos o Docker seria necessário aqui? Só porque está na moda?
@stardiviner
Estou confuso com isso.
REPL é iniciado dentro de um contêiner do docker. Este processo tem acesso ao sistema de arquivos do contêiner
com caminhos relacionados ao contêiner. Bloquear na seção de volumes:
volumes:
- ".:${PWD}:cached" # cached - MacOS option
- m2:/root/.m2
- gitlibs:/root/.gitlibs
$PWD
é /User/darkleaf/projects/project
por exemplo. Portanto, as fontes do projeto são
disponível no mesmo caminho dentro do contêiner.
Faz sentido. O REPL pode enviar ao Emacs algum caminho e esse caminho está relacionado ao contêiner.
O Emacs não pode obter um arquivo no sistema de arquivos host se os caminhos forem inconsistentes.
Portanto, eu uso ${PWD}
.
Mais tarde eu costumava montar .m2
e .gitlibs
do sistema de arquivos host.
Eu uso o Docker para Mac e seus volumes de host são lentos. Então, mudei para volumes de contêiner.
@darkleaf entendo. Obrigado.
@zilti alternar a versão do Java, a versão do Clojure é mais simples no Docker? e é mais limpo. Fácil de empacotar a imagem e depois compartilhar, mais simples de reproduzir o problema do ambiente. Admito que Leiningen e Boot (eu mesmo não usei) é ótimo. Ainda obrigado pelo seu conselho.
Parece que você resolveu isso, então fecharei este tíquete.
Comentários muito úteis
@darkleaf entendo. Obrigado.
@zilti alternar a versão do Java, a versão do Clojure é mais simples no Docker? e é mais limpo. Fácil de empacotar a imagem e depois compartilhar, mais simples de reproduzir o problema do ambiente. Admito que Leiningen e Boot (eu mesmo não usei) é ótimo. Ainda obrigado pelo seu conselho.