带有递归Elixir的npm软件包的Getall依赖关系

时间:2019-07-14 09:56:18

标签: elixir

当您附加软件包名称时,我有这个URL @registry "http://registry.npmjs.org/",并且/latest会为您返回有关软件包的一些详细信息,我需要获取其所做的所有依赖关系以及其正常工作,但是我需要与它一起往下走。例如。

如果您检查http://registry.npmjs.org/handlebars/latest并具有4个依赖项,那么我希望这些deps以及neo-async以及其他deps和{{1这些deps中的}}以获得它们的依赖项。我已经尝试过了。

deps

但是我尝试了第一个级别

get_deps的结果可以做头部和尾部,进一步处理deps,但我不知道在哪里可以保存尾部或所有dep。

基本上,我想使用递归在一个列表中获取车把,deps及其所有dep的deps,我可以使用Enum.map看到一个解决方案,但是会有点难看。任何帮助都将感谢

2 个答案:

答案 0 :(得分:0)

要在一个平面列表中获取所有唯一依赖项:

defmodule Deep do
  @registry "http://registry.npmjs.org/"

  alias HTTPoison.Response, as: Resp

  def go(package) do
    HTTPoison.get(@registry <> package <> "/latest")
    |> handle_response()
    |> get_deps()
    |> List.flatten()
    |> Enum.uniq()
  end

  defp get_deps(nil),  do: []
  defp get_deps(deps),  do: Enum.map(deps, fn({k, _v}) -> [k | go(k)] end)

  defp handle_response({:ok, %Resp{status_code: 200, body: body}}), do:
    Poison.decode!(body)["dependencies"]
  defp handle_response(_), do: nil
end

用法:

iex(11)> Deep.go("handlebars")             
["neo-async", "optimist", "minimist", "wordwrap", "source-map", "uglify-js",
 "commander"]

答案 1 :(得分:0)

以下代码将构建依赖关系树。

它取决于jason Elixir软件包,并使用Erlang标准库中随附的httpc HTTP客户端。使用这些与使用poisonhttpoison的优势在于,将代码依赖项的数量从 8 降低到 1

defmodule Deep do
  @registry 'http://registry.npmjs.org/'

  def go([]), do: []
  def go([dep | other_deps]), do: [go(dep) | go(other_deps)]
  def go(package) do
    deps =
      [@registry, to_charlist(package), '/latest']
      |> :httpc.request()
      |> handle_response()
      |> get_deps()

    if Enum.empty?(deps), do: package, else: {package, go(deps)}
  end

  defp get_deps(nil), do: []
  defp get_deps(deps), do: Map.keys(deps)

  defp handle_response({:ok, {{_, 200, _}, _headers, body}}),
    do: Jason.decode!(body)["dependencies"]

  defp handle_response(_), do: nil
end

输出:

iex(1)> Deep.go("handlebars")
{"handlebars",
 [
   "neo-async",
   {"optimist", ["minimist", "wordwrap"]},
   "source-map",
   {"uglify-js", ["commander", "source-map"]}
 ]}
iex(2)>