首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >寻找系统的依赖关系

寻找系统的依赖关系
EN

Stack Overflow用户
提问于 2014-03-28 20:21:37
回答 1查看 250关注 0票数 3

如何在Common中为给定项目找到完整的依赖树?

我尝试使用(ql-dist:dependency-tree "my-project")哪个错误(不管我的系统加载与否,(ql-dist:find-system "my-project")都返回nil ),而(slot-value (asdf/system:find-system "my-project") 'asdf/component:sideway-dependencies)似乎只返回直接依赖项,在这里我要查找完整的树(它似乎还返回特定于条件/实现的依赖项,比如sb-posixsb-bsd-sockets,我更愿意不使用它们)。

有标准的一步一步的方法吗?还是我需要递归地遍历sideway-dependencies插槽的输出并进行特殊的过滤?

EN

回答 1

Stack Overflow用户

发布于 2014-03-29 14:51:53

下面是解决方案的一个漏洞:

采取3(这可能是它自己的项目在现阶段)

代码语言:javascript
复制
(defgeneric ->key (thing))

(defmethod ->key ((thing string))
  (intern (string-upcase thing) :keyword))

(defmethod ->key ((thing symbol))
  (if (keywordp thing)
      thing
      (intern (symbol-name thing) :keyword)))

(defgeneric dependencies-of (system))
(defmethod dependencies-of ((system symbol))
  (mapcar #'->key (slot-value (asdf/system:find-system system) 'asdf/component:sideway-dependencies)))

(defun ordered-dep-tree (dep-tree)
  (let ((res))
    (labels ((in-res? (dep-name) (member dep-name res))
             (insert-pass (remaining)
                (loop for (dep . sub-deps) in remaining
                      for unmet-sub-deps = (remove-if #'in-res? sub-deps)
                      if (null unmet-sub-deps) do (push dep res)
                      else collect (cons dep unmet-sub-deps) into next-rems
                      finally (return next-rems))))
      (loop for (dep . callers) in dep-tree for deps-of = (dependencies-of dep)
            if (null deps-of) do (push dep res)
            else collect (cons dep deps-of) into non-zeros
            finally (loop while non-zeros
                          do (setf non-zeros (insert-pass non-zeros)))))
      (reverse res)))

(defgeneric dependency-tree (system))
(defmethod dependency-tree ((system symbol))
  (let ((res (make-hash-table)))
    (labels ((rec (sys) 
               (loop with deps = (dependencies-of sys)
                  for dep in deps for dep-k = (->key dep)
                  unless (gethash dep-k res) do (rec dep)
                  do (pushnew (->key sys) (gethash dep-k res)))))
      (rec system))
     (ordered-dep-tree (alexandria:hash-table-alist res))))

这仍然不能过滤sb-*-style包,但我想我可以在单独的pass中这样做。但似乎很管用..。

代码语言:javascript
复制
CL-USER> (dependency-tree :hunchentoot)

(:SB-BSD-SOCKETS :TRIVIAL-BACKTRACE :RFC2388 :SB-ROTATE-BYTE 
 :TRIVIAL-GARBAGE :TRIVIAL-FEATURES :CL-PPCRE :ALEXANDRIA :SB-POSIX 
 :CL-BASE64 :TRIVIAL-GRAY-STREAMS :USOCKET :MD5 :BABEL :FLEXI-STREAMS 
 :BORDEAUX-THREADS :CHUNGA :CFFI :CL-FAD :CL+SSL)

我认为这是一个需要在:hunchentoot之前加载的所有包的列表,按照可以加载的顺序显示(在所有依赖项出现之前没有出现任何包)。它不处理循环依赖,但我认为asdf也不处理,所以.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22722500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档