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.
Current Version: **v0.5.5**
Current Version: **v0.5.6**
# Requirement
@ -40,13 +40,14 @@ USAGE:
gopm [global options] command [command options] [arguments...]
VERSION:
0.5.5.1111
0.5.6.1130
COMMANDS:
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
run link dependencies and go run
build link dependencies and go build
build link dependencies and go build
install link dependencies and go install
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) {
hd, err := com.HomeDir()
if err != nil {
log.Error("get", "Fail to get current user")
log.Error("Get", "Fail to get current user")
log.Fatal("", err.Error())
}
@ -134,27 +134,27 @@ func getByGopmfile(ctx *cli.Context) {
func getByPath(ctx *cli.Context) {
nodes := make([]*doc.Node, 0, len(ctx.Args()))
for _, info := range ctx.Args() {
pkg := info
node := doc.NewNode(pkg, pkg, doc.BRANCH, "", true)
pkgName := info
node := doc.NewNode(pkgName, pkgName, doc.BRANCH, "", true)
if i := strings.Index(info, "@"); i > -1 {
pkg = info[:i]
pkgName = info[:i]
tp, ver, err := validPath(info[i+1:])
if err != nil {
log.Error("", "Fail to parse version")
log.Error("Get", "Fail to parse version")
log.Fatal("", err.Error())
}
node = doc.NewNode(pkg, pkg, tp, ver, true)
node = doc.NewNode(pkgName, pkgName, tp, ver, true)
}
// Cheeck package name.
if !strings.Contains(pkg, "/") {
name, ok := doc.PackageNameList[pkg]
// Check package name.
if !strings.Contains(pkgName, "/") {
name, ok := doc.PackageNameList[pkgName]
if !ok {
log.Error("", "Invalid package name: "+pkg)
log.Error("Get", "Invalid package name: "+pkgName)
log.Fatal("", "No match in the package name list")
}
pkg = name
pkgName = name
}
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.
const go11tag = true
const APP_VER = "0.5.5.1129"
const APP_VER = "0.5.6.1130"
// //cmd.CmdSearch,
// cmdClean,
@ -53,6 +53,7 @@ func main() {
app.Version = APP_VER
app.Commands = []cli.Command{
cmd.CmdGet,
cmd.CmdBin,
cmd.CmdGen,
cmd.CmdRun,
cmd.CmdBuild,

Loading…
Cancel
Save