簡體   English   中英

帶有遞歸Elixir的npm軟件包的Getall依賴關系

[英]Getall dependencies of an npm package with recursion Elixir

當您附加軟件包名稱和/latest時,我有這個URL @registry "http://registry.npmjs.org/" ,它會向您返回有關軟件包的一些詳細信息,我需要獲取其所做的所有依賴關系以及其工作狀況但是我需要更深入地了解它。 如。

如果檢查http://registry.npmjs.org/handlebars/latest ,它有4個依賴,我想這些deps以及與走得更遠neo-async以及其他depsdeps這些的deps得到什么他們的依賴性。 我已經試過了。

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

  alias HTTPoison.Response, as: Resp

  def go(package, complete_deps \\ []) do
    HTTPoison.get(@registry <> package <> "/latest")
    |> handle_response()
    |> get_deps()
  end

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

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

但我最終還是處於第一個水平

get_deps的結果可以做頭部和尾部,進一步處理deps,但我不知道在哪里可以保存尾部或所有dep。

基本上,我想使用遞歸在一個列表中獲取車把,deps及其所有dep的deps,我可以使用Enum.map看到一個解決方案,但是會有點難看。 任何幫助將是感謝

要在一個平面列表中獲得所有唯一依賴項:

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"]

以下代碼將構建依賴關系樹。

它取決於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)>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM