diff --git a/cmd/gen.go b/cmd/gen.go
index 03c3d8a7a..499c80921 100644
--- a/cmd/gen.go
+++ b/cmd/gen.go
@@ -14,6 +14,15 @@
package cmd
+import (
+ "github.com/Unknwon/com"
+ "go/build"
+ "os"
+ "path"
+ "runtime"
+ "strings"
+)
+
var CmdGen = &Command{
UsageLine: "gen [.gopmfile]",
Short: "generate a gopmfile according current go project",
@@ -23,10 +32,82 @@ generate a gopmfile according current go project
}
func init() {
- CmdGen.Run = gen
+ CmdGen.Run = runGen
+ CmdGen.Flags = map[string]bool{}
+}
+
+func printGenPrompt(flag string) {
+}
+
+func isStdPkg(pkgName string) bool {
+ return com.IsExist(path.Join(path.Join(runtime.GOROOT(), "src/pkg"), pkgName))
+}
+
+func getPkgs(path string, inludeSys bool) ([]string, error) {
+ pkg, err := build.ImportDir(path, build.AllowBinary)
+ if err != nil {
+ return []string{}, err
+ }
+
+ if inludeSys {
+ return pkg.Imports, nil
+ } else {
+ pkgs := make([]string, 0)
+ for _, name := range pkg.Imports {
+ if !isStdPkg(name) {
+ pkgs = append(pkgs, name)
+ }
+ }
+ return pkgs, nil
+ }
}
// scan a directory and gen a gopm file
-func gen(cmd *Command, args []string) {
+func runGen(cmd *Command, args []string) {
+ // Check flags.
+ num := checkFlags(cmd.Flags, args, printGenPrompt)
+ if num == -1 {
+ return
+ }
+ args = args[num:]
+
+ var gopmFile string = ".gopmfile"
+ if len(args) > 0 {
+ gopmFile = args[0]
+ }
+
+ curPath, err := os.Getwd()
+ if err != nil {
+ com.ColorLog("[ERRO] %v.\n", err)
+ return
+ }
+
+ gopmPath := path.Join(curPath, gopmFile)
+
+ if com.IsExist(gopmPath) {
+ com.ColorLog("[WARN] %v already existed.\n", gopmFile)
+ return
+ }
+
+ // search the project and gen gopmfile
+ pkgs, err := getPkgs(curPath, false)
+ if err != nil {
+ com.ColorLog("[ERRO] %v.\n", err)
+ return
+ }
+
+ f, err := os.OpenFile(gopmPath, os.O_RDWR|os.O_CREATE, 0700)
+ if err != nil {
+ com.ColorLog("[ERRO] %v.\n", err)
+ return
+ }
+ defer f.Close()
+ contents := "[build]\n" + strings.Join(pkgs, "\n")
+ _, err = f.WriteString(contents)
+ if err != nil {
+ com.ColorLog("[ERRO] %v.\n", err)
+ return
+ }
+ com.ColorLog("[INFO] %v generated successfully.\n", gopmFile)
}
diff --git a/docs/features_CN.md b/docs/features_CN.md
index 923c91bf3..642a2888b 100644
--- a/docs/features_CN.md
+++ b/docs/features_CN.md
@@ -22,7 +22,7 @@ gopm
* [gopmspec文件格式](#50)
-#总体设计目标
+# 总体设计目标
1. 支持go语言的版本管理
2. 支持文档管理
@@ -32,15 +32,24 @@ gopm
6. 支持从github, code.google.com, gitLab, 等常见的源码托管服务下载
-#最终程序只有一个,但是通过配置,可以有三种模式:
+# 最终程序只有一个,但是通过配置,可以有三种模式:
+
1 独立服务器
2 子服务器
3 客户端(默认)
-##独立服务器
+## 独立服务器
独立服务器就是本身的包都是直接从源服务器中获取的。
+## 子服务器
+
+子服务器就是包是从所配置的独立服务器上获取的,而不是直接从github等源服务器获取,在一个局域网中,可以通过架设子服务器来加快包的分发。
+
+## 客户端
+
+默认下载即为客户端模式,客户端默认是从源服务器获取包,如果要从包服务器获取包,则可在配置文件中通过配置即可。
+
#Go包版本说明
@@ -62,14 +71,25 @@ http://gopm.io
~/.gopm/repos
#数据库说明
-包信息数据采用goleveldb,这是一个key/value数据库。数据存放规则如下:
-"lastId" : "{lastId}" lastId中存放最大的Id,Id为自增
+包信息数据采用goleveldb,这是一个key/value数据库。数据库存默认放在~/.gopm/repos下。数据存放规则如下:
+
+* "lastId" : "{lastId}" lastId中存放最大的Id,Id为自增
+
+* "index:{packageName}": "{id}" index:中存放的是包名,value中存放的是这个包的不同版本的id,不同版本用逗号分隔
+
+* “pkg:{id}” : "{pkg}" 某个包的名称
+
+* “ver:{id}” : "{verString1}, {verString2}" 某个包版本对应的内容
+
+* "desc:{id}" : "{desc}" 某个包的最新版本的描述
+
+* "down:{id}" : "{down}" 某个包的下载url
-"index:{packageName}": "{id}" index:中存放的是包名,value中存放的是这个包的不同版本的id,不同版本用逗号分隔
+* "deps:{id}" : "{deps}" 某个包的最新版本的描述
-“ver:{id}” : "{verString1}, {verString2}" 某个包版本对应的内容
+* “key:{keyword}:{id}” : "" 关键词及其对应的版本
-“key:{keyword}:{id}” : "" 关键词及其对应的版本
+* “total” :"{total}" 包总数
#各命令的目标和作用
@@ -106,9 +126,9 @@ http://gopm.io
去除一个包,如果不加版本标示,则删除该包的所有版本
-###gopm search {keyword}
+###gopm search [-e] {keyword}
-根据关键词查找包
+根据关键词查找包名或者包的描述,如果有-e开关,则完全匹配包名
###gopm doc [-b] {packagename}[:{version}]
diff --git a/gopm.go b/gopm.go
index 547871869..13a91f1c0 100644
--- a/gopm.go
+++ b/gopm.go
@@ -45,6 +45,7 @@ var commands = []*cmd.Command{
cmd.CmdGet,
cmd.CmdSearch,
cmd.CmdServe,
+ cmd.CmdGen,
/*
cmdBuild,
cmdClean,