제가 불로장생약 개발을 시작했을 때 알았으면 좋겠어요.
elixir와erlang의 여러 버전 관리
한 번에 여러 항목에서 작업을 해야 할 때, 이것은 다른 elixir와erlang 버전을 처리해야 한다는 것을 의미할 수 있기 때문에 운영체제에서 제공하는 기본 버전을 설치하는 것은 도움이 되지 않을 것입니다.이곳은
asdf
이 문제를 해결하는 곳입니다. asdf
우리는 같은 기계에 서로 다른 버전의 elixir,erlang과 다른 언어를 가지고 있어서 쉽게 전환할 수 있습니다.macOS에서
brew install asdf
로 설치하고 설치 프로그램에 따라 출력하는 설명에 따라 설정할 수 있습니다PATH
. 더 많은 정보는 Github 페이지https://github.com/asdf-vm/asdf 참조현재 설치
asdf
되어 있습니다erlang
와 elixir
를 처리하기 위해 플러그인을 설치해야 합니다. 다음과 같은 방법으로 설치할 수 있습니다.asdf plugin add erlang
asdf plugin add elixir
이를 설치한 후에는 프로젝트에서 사용할 버전을 정의해야 하며 다음과 같은 여러 가지 방법이 있습니다.환경 변수 사용
우리는
ASDF_
접두사를 사용하여 환경 변수를 정의하여 필요한 버전을 설정할 수 있기 때문에 버전 elixir1.10
가 필요하다면 값ASDF_ELIXIR_VERSION
정의 변수1.10
를 사용해야 한다. 이것은erlang이나 다른 프로그래밍 언어에도 적용된다.예를 들어, elixir 및 erlang의 변수를 다음과 같이 정의할 수 있습니다.
export ASDF_ELIXIR_VERSION=1.10.3-otp-22
export ASDF_ERLANG_VERSION=22.3
To handle environment variables in a easy way we can use direnv, it allows to define environment variables in a file
.envrc
and it will loaded automatically as soon as we enter to out project folder.
파일 기반 프로파일
asdf
프로젝트에 필요한 모든 버전을 배치할 수 있는 .tool-versions
파일을 정의할 수 있습니다. 예를 들면 다음과 같습니다.erlang 23.0.2
elixir 1.10.4-otp-23
새 항목 만들기
프로젝트에서 사용하는 버전을 먼저 정의해야 하기 때문에
mix new my_app
만 실행할 수 없습니다. asdf
는 우리가 어떤 버전을 원하는지 모르기 때문입니다.이를 위해 다음과 같은 두 가지 옵션이 있습니다.asdf global elixir 1.9.0
와erlangasdf global erlang 22.3
을 사용하여elixir와erlang의 전역 버전을 정의한 다음에 우리는 정상적으로 실행할 수 있다mix new my_app
mix new
그러면 전역 범위에 영향을 주지 않고 창설된 프로젝트에서 같은 버전을 정의할 수 있습니다.erlang 컴파일에 대한 주석
ASDF_ELIXIR_VERSION=1.9.0 ASDF_ERLANG_VERSION=22.3 mix new my_app
백엔드에서 asdf
erlang 컴파일을 처리합니다. 새 버전을 설치할 때 자바 설치를 요구합니다.😕, 이러한 동작을 방지하기 위해 다음과 같은 환경 변수를 정의할 수 있습니다.export KERL_CONFIGURE_OPTIONS="--disable-debug --without-javac"
외계 데이터베이스 url
프로젝트에서 데이터베이스를 처리하는 경우 EXTO를 사용할 수 있습니다.Ecto를 사용하면 두 가지 방법으로 데이터베이스 자격 증명을 정의할 수 있습니다. 첫 번째는 다음과 같이 개별적으로 정의합니다.
config :my_app, Repo,
database: "ecto_simple",
username: "postgres",
password: "postgres",
hostname: "localhost"
두 번째는 고유한 매개변수를 사용하는 것입니다.config :my_app, Repo,
url: "postgres://postgres:postgres@localhost/ecto_simple"
다음과 같은 이유로 이것이 내가 가장 좋아하는 선택이다.kerl
에서도 받아들여진다. 예를 들어 우리는 psql
를 실행하고 데이터베이스에 연결할 수 있다.나는 몇 주 전에야 비로소 발견하였다😅 psql postgres://postgres:postgres@localhost/ecto_simple
mix 명령을 실행할 때 미리 설정값DATABASE_URL=postgres://postgres:postgres@localhost/test_db mix something
만 하면 된다.그리고
DATABASE_URL
라는 변수에 연결된 URL이 있다면 당연히 사용해야 한다direnv
😉, 데이터베이스 세션으로 psql $DATABASE_URL
만 실행하면 됩니다.iex 사용
셸 기록 사용하기
elixir
iex
의 멋진 특징은 모듈을 불러오고 다시 컴파일할 수 있다는 것이다. 그러나 우리가 때때로'큰'코드 세션을 실행하거나 코드나 다른 상황을 이해하려고 할 때 세션을 다시 시작해야 할 때 우리는 모든 역사 기록을 잃어버렸다.😢, -kernel shell_history enabled
세션을 시작하기 전에 환경 변수ERL_AFLAGS
에 로고iex
를 추가하여 이러한 상황을 피할 수 있습니다.나는 단지 나의 .zshrc
에 다음 코드를 추가하여 나의 모든 항목에 사용할 수 있도록 했다.export ERL_AFLAGS="-kernel shell_history enabled"
별칭 미리 로드
또 다른 짜증날 수 있는 것은 하나의 큰 모듈 이름에 별명을 붙이는 것이다. 예를 들어
MyApp.Contexts.Authentication.User
가 있고 이 모듈을 자주 사용한다면 iex 세션을 시작할 때 불러오는 것이 더 쉬울 것이다. 프로젝트 루트 디렉터리에 .iex.exs
파일을 정의하고 필요한 별명을 사용해서 이를 실현할 수 있다. 예를 들어:alias MyApp.Contexts.Authentication.User
이제 우리가 새로운 iex
세션을 시작할 때, 우리는 처음부터 이 모듈에 별명을 사용할 것이다. 그러면 우리는 문제없이 사용할 수 있다. User.whatever
Keep in mind that even if we can make an alias(a module name is just an atom) when we starting a session using just
iex
we cannot access to its functions. We need to start ouriex
session usingiex -S mix
모듈 재컴파일
iex
세션에서 우리는 r module_name
만 작성하는 모듈을 다시 컴파일할 수 있다. 사용자가 우리가 실행할 수 있는 모든 항목recompile
을 다시 컴파일하려면 코드를 변경할 때 매우 유용하다. 우리는 우리가 정의한 모든 값을 사용하여 테스트를 해야 한다.그것도'REPL 기반 개발'이라고 불리며 lisp 기반 프로그래밍 언어로 가장 많이 사용되지만 elixiriex
에도 이런 좋은 기능을 사용할 수 있다.혼합 작업
이것들은
mix
실행할 수 있는 임무입니다.그러나 우리는 그것들을 만들고 프로젝트에서 사용할 수 있다.예를 들어, 우리는 일부 코드를 디버깅하고 있을 수도 있다. 우리는 긴 프로세스 (업무 프로세스) 를 실행하고 싶지 않고, 단지 함수 호출을 추출한 후에 기존 데이터를 사용하여 혼합 작업에서 그것들을 실행한다.다음 코드를 사용하여 블렌드 작업을 생성할 수 있습니다.defmodule Mix.Tasks.Foo do
@moduledoc false
use Mix.Task
def run(_args) do
Application.ensure_all_started(:my_app)
IO.puts("runnning...")
end
end
우리는 이 파일을 foo.ex
로 명명하고 lib
폴더에 넣어야 한다. 현재 우리는 mix foo
를 실행할 수 있고 running...
메시지를 받을 수 있다.나는 여러 번 사용한 적이 있는데, 실제로 나는 많은 항목에서 몇 가지 임무를 정의했다. 반복해서 사용해서 업무 흐름을 디버깅하는 것이 아니라.
I know that we "should" be defining the cases that we are debugging in a test, run it and then try to fix the code and then run the tests again but this way works for me so I'm OK with that 🙃
현지 제3자 도서관과 합작
어떤 상황에서 우리는 제3자 라이브러리가 어떻게 작동하는지 더 깊이 이해하고자 하는 버그를 발견할 수 있다.이 경우 프로젝트에서 사용하는 라이브러리의 로컬 버전을 설정하기가 어려울 수 있습니다.
나는python에서just
pip install -e path_to_library
를 사용했고 라이브러리 코드를 바꾸기 시작한 것을 기억한다.elixir에서 라이브러리의 로컬 버전을 설치하려면
mix.exs
파일에 경로를 지정할 수 있습니다. 예를 들어 다음과 같습니다.defmodule MyApp.MixProject do
use Mix.Project
def project() do
[
app: :my_app,
version: "0.0.1",
elixir: "~> 1.0",
deps: deps(),
]
end
def application() do
[]
end
defp deps() do
[
{:ecto, "~> 2.0"},
{:postgrex, "~> 0.8.1"},
{:ecto_sql, path: "ecto_sql_local_path"}
]
end
end
이 예에서, 우리가 우리에게 알려준 프로젝트는 주어진 ecto_sql
설치 path
로부터 설치되어 있지만, 이것은 첫 번째일 뿐이다. 왜냐하면 이것은 시작할 때 불러오고 컴파일되기 때문이다. ecto_sql
그리고 ecto_sql_local_path
의 코드를 변경할 때, 이 변경 사항들은 자동으로 다시 컴파일되지 않기 때문이다. mix
프로젝트 내부의 변경 사항에만 관심을 가지기 때문이다.이러한 상황에서 우리는 r Ecto.Migrator
세션에서 iex
를 사용하여 일부 모듈을 강제로 재컴파일할 수 있지만, 만약 우리가 더 많은 모듈을 수정하려고 한다면, 그 중의 모든 모듈을 수동으로 재컴파일하는 것은 매우 번거롭다. 이러한 상황에서 우리는 Recompiler
모듈을 정의해서, 사용자가 필요로 하는 명칭에 따라 다음과 같이 포함시킬 수 있다.defmodule Recompiler do
def run do
modules_to_recompile = [
Ecto.Migrator,
Ecto.SomeOtherModule
]
for module <- modules_to_recompile do
IEx.Helpers.r(module)
end
end
end
이 모듈을 lib
폴더의 어느 곳에 두면 Recompiler.run
세션에서 iex
호출할 때 정의된 모든 모듈을 다시 컴파일할 수 있습니다.
Reference
이 문제에 관하여(제가 불로장생약 개발을 시작했을 때 알았으면 좋겠어요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/erickgnavar/things-i-wish-i-knew-when-i-started-in-elixir-development-3l11텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)