我需要在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 /
我知道什么是deennencies以及需要将它们插入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.