我需要在mix.exs文件中加载,更改和编写代码。我希望能够加载文件,写入依赖关系并写入文件。

我从开始:

defmodule Elixir_2ndTest.Mixfile do
  use Mix.Project

  def project do
    [app: :elixir_2nd_test,
     version: "0.0.1",
     elixir: "~> 1.2",
     build_embedded: Mix.env == :prod,
     start_permanent: Mix.env == :prod,
     description: description(),
     deps: deps]
  end

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

  defp deps do
    []
  end
end


最后,我需要做的(唯一的区别是在乐趣方面):

defmodule Elixir_2ndTest.Mixfile do
  use Mix.Project

  def project do
    [app: :elixir_2nd_test,
     version: "0.0.1",
     elixir: "~> 1.2",
     build_embedded: Mix.env == :prod,
     start_permanent: Mix.env == :prod,
     description: description(),
     deps: deps]
  end

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

  defp deps do
    [{:httpoison, "~> 0.8.3"}]
  end
end


依赖关系来自不同的构建系统(我不能直接通过公共互联网使用hex,因此我以离线模式使用它,并将依赖关系放在.hex /

我知道需要哪种依赖关系以及什么版本才能将它们插入deps函数(在本例中为httpoison 0.8.3)。

如果我的理解是正确的,那么应该可以通过加载文件,引用,更改,取消引用来实现。

到目前为止,这是我要做的:

{:ok, body} = File.read("mix.exs")
{:ok, ast} = Code.string_to_quoted(body)


任何有关如何更改ast并将其写回的指针将不胜感激。

最佳答案

它看起来并不完全相同,但是您可以使用Macro.to_string将ast转换回elixir代码。

我一直在使用我的库PhStTransform修改ast并将其转换回代码。这是PhStTransform测试库中的一个非常简单的示例。

test "transform quote do output" do
  data = quote do: Enum.map(1..3, fn(x) -> x*x end)
  data_transform = quote do: Enum.map(1..3, fn(y) -> y*y end)
  replace_x = fn(a, _d ) ->
    case a do
      :x -> :y
      atom -> atom
    end
  end
  potion = %{ Atom => replace_x }
  assert PhStTransform.transform(data, potion) == data_transform
end


所做的是将所有ast中对:x的引用转换为:y。您需要更加聪明地为PhStTransform编写药水,但我认为应该可以。 PhStTransform在hex.pm中。

https://hex.pm/packages/phst_transform

10-02 21:32