Browse Source

Added gopm bin

pull/103/head
Unknown 11 years ago
parent
commit
90bbb78dee
  1. 7
      README.md
  2. 159
      cmd/bin.go
  3. 22
      cmd/get.go
  4. 3
      gopm.go

7
README.md

@ -5,7 +5,7 @@ gopm - Go Package Manager
Gopm(Go Package Manager) is a Go package manage tool for search, install, update and share packages in Go. Gopm(Go Package Manager) is a Go package manage tool for search, install, update and share packages in Go.
Current Version: **v0.5.5** Current Version: **v0.5.6**
# Requirement # Requirement
@ -40,13 +40,14 @@ USAGE:
gopm [global options] command [command options] [arguments...] gopm [global options] command [command options] [arguments...]
VERSION: VERSION:
0.5.5.1111 0.5.6.1130
COMMANDS: COMMANDS:
get fetch remote package(s) and dependencies to local repository get fetch remote package(s) and dependencies to local repository
bin download and link dependencies and build executable binary
gen generate a gopmfile according current go project gen generate a gopmfile according current go project
run link dependencies and go run run link dependencies and go run
build link dependencies and go build build link dependencies and go build
install link dependencies and go install install link dependencies and go install
help, h Shows a list of commands or help for one command help, h Shows a list of commands or help for one command

159
cmd/bin.go

@ -0,0 +1,159 @@
// Copyright 2013 gopm authors.
//
// Licensed under the Apache License, Version 2.0 (the "License"): you may
// not use this file except in compliance with the License. You may obtain
// a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
package cmd
import (
"os"
"path"
"strings"
"github.com/Unknwon/com"
"github.com/codegangsta/cli"
"github.com/gpmgo/gopm/doc"
"github.com/gpmgo/gopm/log"
)
var CmdBin = cli.Command{
Name: "bin",
Usage: "download and link dependencies and build executable binary",
Description: `Command bin downloads and links dependencies according to gopmfile,
and build executable binary to work directory
gopm bin <import path>@[<tag|commit|branch>:<value>]
gopm bin <package name>@[<tag|commit|branch>:<value>]
Can only specify one each time, and only works for projects that
contains main package`,
Action: runBin,
Flags: []cli.Flag{
cli.BoolFlag{"dir", "build binary to given directory(second argument)"},
},
}
func runBin(ctx *cli.Context) {
if len(ctx.Args()) == 0 {
log.Error("Bin", "Fail to start command")
log.Fatal("", "No package specified")
}
hd, err := com.HomeDir()
if err != nil {
log.Error("Bin", "Fail to get current user")
log.Fatal("", err.Error())
}
doc.HomeDir = strings.Replace(doc.RawHomeDir, "~", hd, -1)
doc.LoadPkgNameList(doc.HomeDir + "/data/pkgname.list")
installRepoPath = doc.HomeDir + "/repos"
// Check arguments.
num := 1
if ctx.Bool("dir") {
num = 2
}
if len(ctx.Args()) != num {
log.Error("Bin", "Fail to start command")
log.Fatal("", "Invalid argument number")
}
// Check if given directory exists.
if ctx.Bool("dir") && !com.IsDir(ctx.Args()[1]) {
log.Error("Bin", "Fail to start command")
log.Fatal("", "Given directory does not exist")
}
// Parse package version.
info := ctx.Args()[0]
pkgName := info
ver := ""
if i := strings.Index(info, "@"); i > -1 {
pkgName = info[:i]
_, ver, err = validPath(info[i+1:])
if err != nil {
log.Error("Bin", "Fail to parse version")
log.Fatal("", err.Error())
}
}
// Check package name.
if !strings.Contains(pkgName, "/") {
name, ok := doc.PackageNameList[pkgName]
if !ok {
log.Error("Bin", "Invalid package name: "+pkgName)
log.Fatal("", "No match in the package name list")
}
pkgName = name
}
// Get code.
com.ExecCmd("gopm", "get", ctx.Args()[0])
// Check if previous steps were successful.
pkgPath := installRepoPath + "/" + pkgName
if len(ver) > 0 {
pkgPath += "." + ver
}
if !com.IsDir(pkgPath) {
log.Error("Bin", "Fail to continue command")
log.Fatal("", "Previous steps weren't successful")
}
wd, err := os.Getwd()
if err != nil {
log.Error("Bin", "Fail to get work directory")
log.Fatal("", err.Error())
}
// Change to repository path.
log.Log("Changing work directory to %s", pkgPath)
err = os.Chdir(pkgPath)
if err != nil {
log.Error("Bin", "Fail to change work directory")
log.Fatal("", err.Error())
}
// Build application.
com.ExecCmd("gopm", "build")
defer func() {
// Clean files.
os.RemoveAll(pkgPath + "/vendor")
}()
// Check if previous steps were successful.
binName := path.Base(pkgName)
if !com.IsFile(binName) {
log.Error("Bin", "Fail to continue command")
log.Fatal("", "Previous steps weren't successful or the project does not contain main package")
}
// Move binary to given directory.
movePath := wd
if ctx.Bool("dir") {
movePath = ctx.Args()[1]
}
_, err = com.Move(binName, movePath+"/"+binName)
if err != nil {
log.Error("Bin", "Fail to move binary")
log.Fatal("", err.Error())
}
os.Chmod(movePath+"/"+binName, os.ModePerm)
log.Log("Changing work directory back to %s", wd)
os.Chdir(wd)
log.Success("SUCC", "Bin", "Command execute successfully!")
}

22
cmd/get.go

@ -63,7 +63,7 @@ func init() {
func runGet(ctx *cli.Context) { func runGet(ctx *cli.Context) {
hd, err := com.HomeDir() hd, err := com.HomeDir()
if err != nil { if err != nil {
log.Error("get", "Fail to get current user") log.Error("Get", "Fail to get current user")
log.Fatal("", err.Error()) log.Fatal("", err.Error())
} }
@ -134,27 +134,27 @@ func getByGopmfile(ctx *cli.Context) {
func getByPath(ctx *cli.Context) { func getByPath(ctx *cli.Context) {
nodes := make([]*doc.Node, 0, len(ctx.Args())) nodes := make([]*doc.Node, 0, len(ctx.Args()))
for _, info := range ctx.Args() { for _, info := range ctx.Args() {
pkg := info pkgName := info
node := doc.NewNode(pkg, pkg, doc.BRANCH, "", true) node := doc.NewNode(pkgName, pkgName, doc.BRANCH, "", true)
if i := strings.Index(info, "@"); i > -1 { if i := strings.Index(info, "@"); i > -1 {
pkg = info[:i] pkgName = info[:i]
tp, ver, err := validPath(info[i+1:]) tp, ver, err := validPath(info[i+1:])
if err != nil { if err != nil {
log.Error("", "Fail to parse version") log.Error("Get", "Fail to parse version")
log.Fatal("", err.Error()) log.Fatal("", err.Error())
} }
node = doc.NewNode(pkg, pkg, tp, ver, true) node = doc.NewNode(pkgName, pkgName, tp, ver, true)
} }
// Cheeck package name. // Check package name.
if !strings.Contains(pkg, "/") { if !strings.Contains(pkgName, "/") {
name, ok := doc.PackageNameList[pkg] name, ok := doc.PackageNameList[pkgName]
if !ok { if !ok {
log.Error("", "Invalid package name: "+pkg) log.Error("Get", "Invalid package name: "+pkgName)
log.Fatal("", "No match in the package name list") log.Fatal("", "No match in the package name list")
} }
pkg = name pkgName = name
} }
nodes = append(nodes, node) nodes = append(nodes, node)

3
gopm.go

@ -29,7 +29,7 @@ import (
// Test that go1.1 tag above is included in builds. main.go refers to this definition. // Test that go1.1 tag above is included in builds. main.go refers to this definition.
const go11tag = true const go11tag = true
const APP_VER = "0.5.5.1129" const APP_VER = "0.5.6.1130"
// //cmd.CmdSearch, // //cmd.CmdSearch,
// cmdClean, // cmdClean,
@ -53,6 +53,7 @@ func main() {
app.Version = APP_VER app.Version = APP_VER
app.Commands = []cli.Command{ app.Commands = []cli.Command{
cmd.CmdGet, cmd.CmdGet,
cmd.CmdBin,
cmd.CmdGen, cmd.CmdGen,
cmd.CmdRun, cmd.CmdRun,
cmd.CmdBuild, cmd.CmdBuild,

Loading…
Cancel
Save