bee generate docs 报错 Failed to generate the docs.

七秒钟回忆待续 · · 1848 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

背景: 用 Python + Golang + Vue.js 做一个开源项目,在用 Beego 工具 bee 搭建项目结构,生成文档(bee generate docs or bee run -downdoc=true -gendoc=true) 时报错:Failed to generate the docs.

beecommit 版本为

commit 6a86284cec9a17f9aae6fe82ecf3c436aafed68d (HEAD -> develop, origin/develop, origin/HEAD)
Merge: 6f1ff54 0f9b9ea
Author: Faissal Elamraoui <amr.faissal@gmail.com>
Date:   Thu Apr 11 07:34:49 2019 +0200

    Merge pull request #586 from cjereme/fix/infosec-output-security
    
    Fixes #536

需要在终端设置好: GOROOTGOPATH,按照官方的 DEMO 来还是报错 Failed to generate the docs. 项目包管理方式选择 Go Modules,上网搜了一下,貌似没啥解决办法。只能翻看源码了,大概的源码在 bee/generate/swaggergen/g_docs.go

大概的原因就是 bee 工具不支持 Go Modules, 生成项目的时候会自动穿创建 src 目录,可是在使用 Go Modules 时已经不依赖于 src

下面是我的项目目录结构


image.png

import 的方式都是直接 import "fishhub/fish/xxx",然而在生成文档时, analyseControllerPkgbee/generate/swaggergen/g_docs.go::analyseControllerPkg) 函数会检查文件是否在,代码如下:

    pkgRealpath := ""

    wg, _ := filepath.EvalSymlinks(filepath.Join(vendorPath, pkgpath))
    if utils.FileExists(wg) {
        pkgRealpath = wg
    } else {
        wgopath := gopaths
        for _, wg := range wgopath {
            wg, _ = filepath.EvalSymlinks(filepath.Join(wg, "src", pkgpath))
            if utils.FileExists(wg) {
                pkgRealpath = wg
                break
            }
        }
    }
    if pkgRealpath != "" {
        if _, ok := pkgCache[pkgpath]; ok {
            return
        }
        pkgCache[pkgpath] = struct{}{}
    } else {
        beeLogger.Log.Fatalf("Package '%s' does not exist in the GOPATH or vendor path", pkgpath)
    }

很明显,会在 GOPATH 或者 VendorPATH 里拼接路径,然后检测是否存在此文件,然后 Go Modules 包管理的项目是不依赖 GOPATH,因此结合 pkgpath 肯定会检测文件失败。

解决方案

  1. 不使用 GO Modules 管理项目。
  2. 打个补丁:
    我的项目为例:绝对路径是: /Users/user/xxx/fishhub
    此时需要在终端设置 export GOPATH=/Users/user/xxx, 原因是会通过 pkgpath 判断文件是否存在,添加的代码如下:
if pkgRealpath == "" {
        for _, wg := range gopaths {
            wg, _ = filepath.EvalSymlinks(filepath.Join(wg, pkgpath))
            if utils.FileExists(wg) {
                pkgRealpath = wg
                break
            }
        }
    }

即检测文件是否存在的代码改为:

    pkgRealpath := ""

    wg, _ := filepath.EvalSymlinks(filepath.Join(vendorPath, pkgpath))
    if utils.FileExists(wg) {
        pkgRealpath = wg
    } else {
        wgopath := gopaths
        for _, wg := range wgopath {
            wg, _ = filepath.EvalSymlinks(filepath.Join(wg, "src", pkgpath))
            if utils.FileExists(wg) {
                pkgRealpath = wg
                break
            }
        }
    }
    if pkgRealpath == "" {
        for _, wg := range gopaths {
            wg, _ = filepath.EvalSymlinks(filepath.Join(wg, pkgpath))
            if utils.FileExists(wg) {
                pkgRealpath = wg
                break
            }
        }
    }
    if pkgRealpath != "" {
        if _, ok := pkgCache[pkgpath]; ok {
            return
        }
        pkgCache[pkgpath] = struct{}{}
    } else {
        beeLogger.Log.Fatalf("Package '%s' does not exist in the GOPATH or vendor path", pkgpath)
    }

然后 go install 重新生成 bee 可执行文件就可以了。


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:七秒钟回忆待续

查看原文:bee generate docs 报错 Failed to generate the docs.

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1848 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传