Generating ReStructured Text Docs For Your Own cobra.Command
从 cobra 命令生成 rest 手册非常容易。下面一个例子:
package mainimport ("log""github.com/spf13/cobra""github.com/spf13/cobra/doc")func main() {cmd := &cobra.Command{Use: "test",Short: "my test program",}err := doc.GenReSTTree(cmd, "/tmp")if err != nil {log.Fatal(err)}}
这将为你提供一个 rest 手册 /tmp/test.rst
Generate ReST docs for the entire command tree
该程序实际上可以为kubernetes项目中的kubectl命令生成文档
package mainimport ("log""io/ioutil""os""k8s.io/kubernetes/pkg/kubectl/cmd"cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util""github.com/spf13/cobra/doc")func main() {kubectl := cmd.NewKubectlCommand(cmdutil.NewFactory(nil), os.Stdin, ioutil.Discard, ioutil.Discard)err := doc.GenReSTTree(kubectl, "./")if err != nil {log.Fatal(err)}}
这将生成一系列文件,一个用于树中的每个命令,在指定的目录中(在本例中为./)
Generate ReST docs for a single command
你可能希望更多地控制输出,或仅生成单个命令,而不是整个命令树。如果是这种情况,你可能更喜欢GenReST而不是GenReSTTree
out := new(bytes.Buffer)err := doc.GenReST(cmd, out)if err != nil {log.Fatal(err)}
这会将只有cmd的ReST文档写入输出缓冲区。
Customize the output
GenReST和GenReSTTree都有备用版本,带有回调以控制输出:
func GenReSTTreeCustom(cmd *Command, dir string, filePrepender func(string) string, linkHandler func(string, string) string) error {//...}
func GenReSTCustom(cmd *Command, out *bytes.Buffer, linkHandler func(string, string) string) error {//...}
filePrepender将在给定完整文件路径的情况下将返回值添加到呈现的 ReST 文件中。一个常见的用例是添加前端内容,使用Hugo生成的文档:
const fmTemplate = `---date: %stitle: "%s"slug: %surl: %s---`filePrepender := func(filename string) string {now := time.Now().Format(time.RFC3339)name := filepath.Base(filename)base := strings.TrimSuffix(name, path.Ext(name))url := "/commands/" + strings.ToLower(base) + "/"return fmt.Sprintf(fmTemplate, now, strings.Replace(base, "_", " ", -1), base, url)}
在给定命令名和参考的情况下,linkHandler可用于自定义命令的呈现链接。这在将rst转换为html或使用Sphinx等工具生成文档时非常有用,其中使用了:ref::
// Sphinx cross-referencing formatlinkHandler := func(name, ref string) string {return fmt.Sprintf(":ref:`%s <%s>`", name, ref)}
