グレアム&エリクサー


更新:これは非常に最初の探査だった.現在、公式のプロジェクトがありますmix_gleam プラグイン.それをチェックしてください!
アットContact Stack , 我々は、技術スタックのコアとしてエリクシール&フェニックスを選んだし、我々は選択に満足している.でも.私たちは本当に良いタイプのシステムと役に立つコンパイラElm ) 開発を通じて私たちを導く.
Elixirはビーム仮想マシンを対象とし、ビームをターゲットにする静的型付け言語はほとんど存在しない.ここでは、統合のための簡単なセットアップを調べるつもりですGleam を使用してあなたのエリクサープロジェクトにMix Compiler Task .
Gleamは、いくつかのMLフレーバー言語よりもJavaScript、CまたはJavaプログラマに、より近づきやすい構文を使用する静的型付け機能プログラミング言語です.gleamコンパイラは錆に書かれてerlangのソースファイルを出力し,erlangのソースファイルを出力します.
ミックスは、多機能プロジェクトのための多機能ビルドツールです.これは依存関係を管理し、テストを実行し、タスクを実行し、あなたのElixirコードをコンパイルすることができます.また、デフォルトでErlangファイルをコンパイルし、他の言語をコンパイルするミックスコンパイラタスクで拡張することができます.Gleamコンパイラを使用してgleamファイルをビルドできるように、GLEAM用のミックスコンパイラタスクを作成します.
以下の手順を試して、デモリポジトリをチェックしてください.https://github.com/michaeljones/gleam-phoenix-mix .
ここで我々は行く!
私たちはあなたがgleam 実行する環境で利用できるコンパイラ.これを実行してチェックします.
gleam --version
あなたがそうしないならば、あなたはinstallation instructions Gleam Docsの上で
現在、我々はAをセットアップすることを通して行きますPhoenix プロジェクト.我々は詳細に行くつもりはないが、ちょうど私たちは仕事に明確な拠点を持っている.
次のコマンドを実行して、空のフェニックスプロジェクトを設定します.
mkdir gleam-phoenix-mix
cd gleam-phoenix-mix
mix phx.new . --app my_app
mix ecto.create
cd assets 
npm install
cd ..
今、ミックスコンパイラタスクを作成する必要があります.これをaに入れますlib/mix/tasks/compile モジュール名を反映するディレクトリを指定しますMix.Tasks.Compile.Gleam . そこで新しいディレクトリを作ります.
mkdir -p lib/mix/tasks/compile/
ファイルに次のコードを追加するlib/mix/tasks/compile/gleam.ex .
defmodule Mix.Tasks.Compile.Gleam do
  use Mix.Task.Compiler

  def run(_args) do
    System.cmd("gleam", ["build"])
    :ok
  end
end
これは本当に、gleamコンパイラを' build '引数で直接実行することです.
Elxirコンパイラを実行し、ミックスタスクをコンパイルする前にコンパイルします.
mix compile.elixir
Gleamを幸せにするために、我々はAをセットアップする必要があります.toml 設定ファイル.それで、私たちはgleam.toml コンテンツの次のプロジェクトのルートで.
name = "my_app"
それから、我々はsrc ファイルのディレクトリ.gleamコンパイラはgleamファイルをsrc ディレクトリ.これはElixir/Mixと異なりますlib デフォルトディレクトリ.Elixir/ミックスはGleamで書くことができないときに設定することができます.
mkdir src
それから、私たちのgleamモジュールを作成しますsrc/hello_world.gleam 次のコードを使用します.
pub fn hello() {
  "Hello, from gleam!"
}
次に次のように変更しますmix.exs ファイルを実行するコンパイラのリストにコンパイラタスクを追加するファイルmix compile そして、ミックスのerlangコンパイラがgen フォルダ
Erlangファイル用.The gleam コンパイラコンパイル.gleam からのファイルsrc フォルダ.erl 中のファイルgen ので、私たちはerlangコンパイラをそこに見つける必要があります.
       elixir: "~> 1.5",
       elixirc_paths: elixirc_paths(Mix.env()),
+      erlc_paths: ["src", "gen"],
-      compilers: [:phoenix, :gettext] ++ Mix.compilers(),
+      compilers: [:phoenix, :gettext, :gleam] ++ Mix.compilers(),
       start_permanent: Mix.env() == :prod,
       aliases: aliases(),
私は、MIXがスタートからリストの終わりまでコンパイラを実行すると仮定します.だから我々は:gleam エントリは:erlang エントリーMix.compilers() gleamコンパイラが作成したerlangファイルをコンパイルしコンパイルした後にErlangコンパイラが実行されます.
ElxirとコンパイルされたGleamファイルの相互運用の簡単なデモンストレーションとして、次の変更を行いますlib/my_app_web/controllers/page_controller.ex :
 defmodule MyAppWeb.PageController do
   use MyAppWeb, :controller

   def index(conn, _params) do
-    render(conn, "index.html")
+    render(conn, "index.html", title: :hello_world.hello())
   end
 end
これはgleamモジュールがErlangモジュールにコンパイルされているためです.ElxirではErlangモジュールは自分の名前であるatomを通してアクセス可能です.
そして、次の変更を行いますlib/my_app_web/templates/page/index.html.eex :
 <section class="phx-hero">
-  <h1><%= gettext "Welcome to %{name}!", name: "Phoenix" %></h1>
+  <h1><%= @title %></h1>
   <p>A productive web framework that<br/>does not compromise speed or maintainability.</p>
 </section>
最後に実行できます.
mix compile
mix phx.server
と負荷http://localhost:4000 ブラウザで「こんにちは、Gleamから」を参照してくださいスタンダードフェニックス歓迎ページの中心に.
あなたがGithubの上でこのデモンストレーションRepoで最終結果をチェックすることができる好奇心が強いならば、思い出してくださいhttps://github.com/michaeljones/gleam-phoenix-mix

最後の思考
Gleamコードをミックスを使用してエリクサープロジェクトに組み込むのはあまり難しくないのを見て、それは刺激的です.ミックスは、この種の拡張性を念頭に構築されて素晴らしいです.答えるために確かにより多くの質問があります、そして、ラフな端は滑らかにします、しかし、それはビームに強くタイプされた言語を使用するために通りを持つことが刺激的です.