Do you want to pick up from where you left of?
Take me there

Mix

Antes de podermos mergulhar nas águas mais profundas de Elixir, primeiro precisamos aprender a utilizar o Mix. Se você estiver familiarizado com Ruby, Mix é o Bundler, RubyGems e o Rake juntos. É uma parte crucial de qualquer projeto Elixir e nesta lição vamos explorar apenas algumas das suas grandes funcionalidades. Para ver tudo que o Mix tem para oferecer no ambiente atual, execute mix help.

Até agora trabalhamos exclusivamente dentro do iex que tem limitações A fim de construir algo substancial precisamos dividir nosso código acima em outros arquivos para gerenciá-lo de forma eficaz; Mix nos permite fazer isso com projetos.

Novos Projetos

Quando estamos prontos para criar um novo projeto em Elixir, Mix faz com que isso seja fácil utilizando o comando mix new. Este comando irá gerar a estrutura de pastas do nosso projeto e a base de arquivos necessária. Este é bastante simples, então vamos começar:

mix new example

A partir do resultado, podemos ver que o Mix criou nosso diretório e uma quantidade de arquivos necessários para o mesmo:

* creating README.md
* creating .formatter.exs
* creating .gitignore
* creating mix.exs
* creating lib
* creating lib/example.ex
* creating test
* creating test/test_helper.exs
* creating test/example_test.exs

Nesta lição nós iremos focar nossa atenção no mix.exs. Aqui nós configuramos nossa aplicação, dependências, ambiente e versão. Abra o arquivo no seu editor favorito, você deve ver algo como isto (comentários removidos por questões de consumo de espaço):

defmodule Example.Mix do
  use Mix.Project

  def project do
    [
      app: :example,
      version: "0.1.0",
      elixir: "~> 1.5",
      start_permanent: Mix.env() == :prod,
      deps: deps()
    ]
  end

  def application do
    [
      extra_applications: [:logger]
    ]
  end

  defp deps do
    []
  end
end

A primeira seção que iremos analisar é project. Aqui nós definimos o nome da nossa aplicação (app), especificamos nossa versão (version), versão do Elixir (elixir), e finalmente nossas dependências (deps).

A seção application é usada durante a geração do nosso arquivo de aplicação que iremos ver em breve.

Interativo

Pode ser necessário a utilização do iex dentro do contexto da nossa aplicação. Felizmente para nós, Mix torna isso fácil. Com a nossa aplicação compilada podemos começar uma nova seção iex:

cd example
iex -S mix

Iniciando iex desta forma, irá carregar sua aplicação e dependências no atual ambiente de execução.

Compilação

Mix é inteligente e irá compilar as alterações quando necessário, mas ainda pode ser necessário explicitamente compilar o seu projeto. Nesta seção, vamos cobrir a forma de compilar o nosso projeto e o que essa compilação faz.

Para compilar um projeto Mix, nós apenas temos que executar mix compile em nossa base do diretório: Nota: As tarefas do Mix de um projeto estão disponíveis apenas no diretório raiz do projeto, apenas as tarefas globais do Mix estão disponíveis em todos os projetos.

mix compile

Não há muito dentro do nosso projeto, então a saída não será muito emocionante, mas deve concluir com êxito:

Compiled lib/example.ex
Generated example app

Quando compilamos um projeto, Mix cria um diretório _build para os nossos artefatos. Se olharmos dentro de _build veremos nossa aplicação compilada: example.app.

Gerenciando Dependências

Nosso projeto não tem nenhuma dependência, mas terá em breve, por isso iremos seguir em frente e cobrir a definição e busca de dependências.

Para adicionar uma nova dependência, primeiro precisamos adicioná-la ao nosso mix.exs na seção deps. Nossa lista de dependência é composta por tuplas com 2 valores obrigatórios e um opcional: O nome do pacote como um atom, a versão como string e opções opcionais.

Para este exemplo vamos ver um projeto com dependências, como phoenix_slim:

def deps do
  [
    {:phoenix, "~> 1.1 or ~> 1.2"},
    {:phoenix_html, "~> 2.3"},
    {:cowboy, "~> 1.0", only: [:dev, :test]},
    {:slime, "~> 0.14"}
  ]
end

Como você provavelmente percebeu nas dependências acima, a dependência cowboy é apenas necessária durante o desenvolvimento e teste.

Uma vez que tenhamos definido nossas dependências, existe um passo final: buscar estas dependências. Isso é análogo ao bundle install:

mix deps.get

É isso aí! Nós definimos e buscamos nossas dependências. Agora estamos preparados para adicionar dependências quando chegar a hora.

Ambientes

Mix, bem como Bundler, suporta ambientes diferentes. Naturalmente Mix trabalha com três ambientes:

O ambiente atual pode ser acessado usando Mix.env. Como esperado, o ambiente pode ser alterado através da variável de ambiente MIX_ENV:

MIX_ENV=prod mix compile
Caught a mistake or want to contribute to the lesson? Edit this lesson on GitHub!