有没有办法在julia lang中构建包依赖关系树?

有没有办法在julia lang中构建包依赖关系树?,julia,Julia,使用npm列表将显示已安装软件包、版本和关系的树: 尽管Julia软件包管理有所不同(例如,通常不存在软件包的副本),但是否有办法: 知道为什么安装了一个软件包吗 或者构建包依赖关系树 我认为没有简单的功能,但使用这两个功能应该不会太难: julia> Pkg.dependents("Cairo") 10-element Array{AbstractString,1}: "Tk" "Gtk" "Mamba" "Drawing" "GtkUtilities" "Profile

使用
npm列表
将显示已安装软件包、版本和关系的树:

尽管Julia软件包管理有所不同(例如,通常不存在软件包的副本),但是否有办法:

  • 知道为什么安装了一个软件包吗
  • 或者构建包依赖关系树
我认为没有简单的功能,但使用这两个功能应该不会太难:

julia> Pkg.dependents("Cairo")
10-element Array{AbstractString,1}:
 "Tk"
 "Gtk"
 "Mamba"
 "Drawing"
 "GtkUtilities"
 "ProfileView"
 "Brim"
 "Winston"
 "EcologicalNetwork"
 "VennEuler"

julia> Pkg.installed()
Dict{ASCIIString,VersionNumber} with 119 entries:
  "Libz"             => v"0.0.2"
  "Gtk"              => v"0.9.3"
  "Interact"         => v"0.3.0"
  "ForwardDiff"      => v"0.1.4"
  "Benchmark"        => v"0.1.0"
  "AxisAlgorithms"   => v"0.1.4"
  "Cairo"            => v"0.2.31+"
  "HttpParser"       => v"0.1.1"
  "DataFrames"       => v"0.6.10"
  "Requests"         => v"0.3.4"
  "QuartzImageIO"    => v"0.1.0+"
  "Markdown"         => v"0.3.0"
  "Requires"         => v"0.2.2"
  "ArgParse"         => v"0.3.0"
  ⋮                  => ⋮

下面的简单代码将打印出包的requires by结果:

whorequires(pkgname) = whorequires(pkgname, 0);
function whorequires(pkgname, i)
  deps = Pkg.dependents(pkgname);
  [print('-') for j=1:i];
  println(pkgname);
  length(deps) > 0 && [whorequires(dep,i+1) for dep in deps];
end

julia> whorequires("JuliaParser");
JuliaParser
-CodeTools
--Atom
-ASTInterpreter
--Gallium
-Jewel
编辑(涵盖@amrods评论的问题)


谢谢@daycaster,但是为什么这里没有关于
dependents()在较新的Julia版本中似乎不存在。有其他选择吗?我尝试使用您的函数,似乎有一个无限循环:
whorequires(“分发”)
不断打印“Mads”和“BIGUQ”作为彼此的依赖项。如果您使用AbstractTrees.jl,您将绘制附加的unicode树线。或多或少是自动绘制的(通过键入您的树数据结构)。但这是一种依赖关系,所以。如果您仍处于更新状态,
ascistring
不再位于
Base
字符串
就足够了,是吗?
whorequires(pkgname) = whorequires(pkgname, 0, Dict{ASCIIString,Vector{ASCIIString}}());
function whorequires(pkgname, i, m)
  [print('-') for j=1:i];
  if (haskey(m,pkgname))
    println("$pkgname *[duplicated]* is required by ", length(m[pkgname]), " packages");
  else
    println(pkgname);
    m[pkgname] = Pkg.dependents(pkgname);
    if (length(m[pkgname]) > 0)
        for dep in m[pkgname]
            whorequires(dep,i+1,m);
        end
    end
  end
end