命令基础
go run 命令简介
- 用于运行命令源码文件
- 只能接受一个命令源码文件以及若干个库源码文件左右文件参数(我们执行go run命令时,可以后面跟多个源码文件,但是其中只能有一个源码文件作为我们源码文件的参数)
- 其内部操作步骤是
- 先编译源码文件再运行
- 先会编译作为文件参数的源码文件
- 把它们的编译结果放到临时的文件夹当中
- 然后再去运行编译的结果
- 编译结果包括
- 命令源码文件
- 被编译后生成的可执行文件
- 以及相关库源码文件
- 编译后所生成的归档文件
实例来源说明
- gic2p 项目(项目地址:
http://github.com/hyper0x/goc2p
)
- 项目安装:用 git clone 获取项目,并将其根目录作为一个工作区
ds
命令与 pds
命令 (ds用于显示指定目录的目录结构、pds用于显示指定代码包的依赖关系)
ds
命令源代码文件:goc2p/src/helper/ds/showds.go
pds
命令源代码文件:goc2p/src/helper/pds/showpds.go
go run 命令案例演示
go run showds.go -p ~/goc2p
- 例
| MacintoshdeMacBook-Pro-139:ds elasticnotes$ go run showds.go -p ~/Desktop/go_practice/
/Users/elasticnotes/Desktop/go_practice/:
goc2p/
LICENSE
README.md
src/
chan1/
oneway/
phandler.go
webcrawler/
demo/
demo.go
middleware/
id.go
chanman.go
stopsign.go
pool.go
scheduler/
cache.go
helper.go
summary.go
scheduler.go
downloader/
downloader.go
pool.go
itempipeline/
processor.go
pipeline.go
analyzer/
analyzer.go
parser.go
pool.go
base/
error.go
argument.go
logger.go
data.go
tool/
monitor.go
cookie/
cookiejar.go
sync1/
datafile2/
datafile2.go
datafile3/
datafile3.go
datafile1/
datafile1.go
pool/
pool_demo.go
basic/
map1/
cmap.go
omap_test.go
keys.go
keys_test.go
cmap_test.go
common.go
omap.go
set2_test.go
pkginit/
initpkg_demo.go
cgo/
lib/
go_export.go
go_export_def.go
print.go
rand.go
math.go
cgo_demo.go
prof/
profiling_test.go
profiling.go
set2.go
seq.go
set/
hash_set_test.go
set_test.go
hash_set.go
set.go
multiproc/
npipe/
npipe.go
apipe/
apipe.go
signal/
mysignal.go
socket/
tcpsock.go
pkgtool/
util_test.go
envir_test.go
util.go
ipath.go
pnode.go
fpath.go
envir.go
testing/
ct/
ct_demo.go
bmt/
bmt_test.go
et/
et_test.go
rp/
rp_test.go
loadgen/
log.go
gen.go
gen_test.go
testhelper/
comm.go
server.go
lib/
caller.go
tickets.go
base.go
cnet/
ctcp/
tcp_test.go
tcp.go
base.go
helper/
ds/
showds.go
pds/
showpds.go
logging/
log_manager.go
tag.go
base.go
console_logger.go
logger_test.go
|
go run 常用标记的使用
- -a:强制编译相关代码,不论他们的编译结果是否已是最新的。
- -n:打印编译过程中所需运行的命令,但不真正执行他们。
- -p n:并行编译,其中 n 为并行的数量。
- -v:列出被编译的代码包的名称。
- -work:显示编译时创建的临时工作目录的路径,并且不删除它。
- -x:打印编译过程中所需运行的命令。
-a 释义:如果我有一个命令源码文件,其中导入了代码包A,而这个代码包A我们在之前已经编译过,并且在编译之后代码包A中的源码没有产生任何变化,go run命令在默认情况下是不会再次编译它们,但是加入了-a标记之后,会使go再次重新编译它们。即使他们的归档文件已经存在。并且已经是最新的。
-n 释义:我们在执行 go run 命令的时候,加入 -n 标记,不会使得go run真正的去执行目标源码文件,而仅仅会打印它需要用到的额外命令,这样就可以使我们在非常安全的,不会产生任何后果的前提下查看go run命令真正的执行步骤。
-p n 释义:n为并行执行的数量,n最好为当前计算机逻辑cpu的个数(逻辑cpu的个 = 当前计算机cpu数 * 每个cpu的核数),例如 -p 4。
-v 释义:如果使用 -a -v 则会列出所有被编译的代码包的名称
1.3版本中的所有:包含Go语言自带的标准库的代码包
1.4版本中的所有:不包含Go语言自带的标准库的代码包
-work 释义:在go run命令执行完毕后不删除它(go默认在go run结束之前删除临时目录),有机会在go run结束后使我们进入目录查看
-x 释义:-n打印编译过程中所需的命令,但并不执行。-x打印编译过程中所需的命令,并执行它们。
go run 常用标记案例演示
| MacintoshdeMacBook-Pro-139:ds elasticnotes$ go run -x showds.go
WORK=/var/folders/7w/0j7vff4j1kz5_g43cf_vqlg00000gp/T/go-build082935065
mkdir -p $WORK/b001/
cat >$WORK/b001/importcfg.link << 'EOF' # internal
packagefile command-line-arguments=/Users/elasticnotes/Library/Caches/go-build/80/803a90bf741cddb087a3d336b5d41b5ac5029184ef665bb9c521f34a7e54d4ce-d
packagefile flag=/usr/local/go/pkg/darwin_amd64/flag.a
packagefile fmt=/usr/local/go/pkg/darwin_amd64/fmt.a
packagefile os=/usr/local/go/pkg/darwin_amd64/os.a
packagefile path=/usr/local/go/pkg/darwin_amd64/path.a
packagefile strings=/usr/local/go/pkg/darwin_amd64/strings.a
packagefile runtime=/usr/local/go/pkg/darwin_amd64/runtime.a
packagefile errors=/usr/local/go/pkg/darwin_amd64/errors.a
packagefile io=/usr/local/go/pkg/darwin_amd64/io.a
packagefile reflect=/usr/local/go/pkg/darwin_amd64/reflect.a
packagefile sort=/usr/local/go/pkg/darwin_amd64/sort.a
packagefile strconv=/usr/local/go/pkg/darwin_amd64/strconv.a
packagefile time=/usr/local/go/pkg/darwin_amd64/time.a
packagefile internal/fmtsort=/usr/local/go/pkg/darwin_amd64/internal/fmtsort.a
packagefile math=/usr/local/go/pkg/darwin_amd64/math.a
packagefile sync=/usr/local/go/pkg/darwin_amd64/sync.a
packagefile unicode/utf8=/usr/local/go/pkg/darwin_amd64/unicode/utf8.a
packagefile internal/oserror=/usr/local/go/pkg/darwin_amd64/internal/oserror.a
packagefile internal/poll=/usr/local/go/pkg/darwin_amd64/internal/poll.a
packagefile internal/syscall/execenv=/usr/local/go/pkg/darwin_amd64/internal/syscall/execenv.a
packagefile internal/syscall/unix=/usr/local/go/pkg/darwin_amd64/internal/syscall/unix.a
packagefile internal/testlog=/usr/local/go/pkg/darwin_amd64/internal/testlog.a
packagefile sync/atomic=/usr/local/go/pkg/darwin_amd64/sync/atomic.a
packagefile syscall=/usr/local/go/pkg/darwin_amd64/syscall.a
packagefile internal/bytealg=/usr/local/go/pkg/darwin_amd64/internal/bytealg.a
packagefile unicode=/usr/local/go/pkg/darwin_amd64/unicode.a
packagefile internal/cpu=/usr/local/go/pkg/darwin_amd64/internal/cpu.a
packagefile runtime/internal/atomic=/usr/local/go/pkg/darwin_amd64/runtime/internal/atomic.a
packagefile runtime/internal/math=/usr/local/go/pkg/darwin_amd64/runtime/internal/math.a
packagefile runtime/internal/sys=/usr/local/go/pkg/darwin_amd64/runtime/internal/sys.a
packagefile internal/reflectlite=/usr/local/go/pkg/darwin_amd64/internal/reflectlite.a
packagefile internal/unsafeheader=/usr/local/go/pkg/darwin_amd64/internal/unsafeheader.a
packagefile math/bits=/usr/local/go/pkg/darwin_amd64/math/bits.a
packagefile internal/race=/usr/local/go/pkg/darwin_amd64/internal/race.a
EOF
mkdir -p $WORK/b001/exe/
cd .
/usr/local/go/pkg/tool/darwin_amd64/link -o $WORK/b001/exe/showds -importcfg $WORK/b001/importcfg.link -s -w -buildmode=exe -buildid=TNnYgYEUlohEjsp21ah8/JPBegBTjDKzAIrIThcbn/HerbTsixVWuJY9ArkBRD/TNnYgYEUlohEjsp21ah8 -extld=clang /Users/elasticnotes/Library/Caches/go-build/80/803a90bf741cddb087a3d336b5d41b5ac5029184ef665bb9c521f34a7e54d4ce-d
$WORK/b001/exe/showds
/Users/elasticnotes/Desktop/go_practice/goc2p/src/helper/ds:
showds.go
|
go build 命令简介
- 用于编译源码文件或代码包
- 编译非命令源码文件(库源码文件)不会产生任何结果文件,在库源码文件中 go build只是检查库的有效性。
- 编译命令源码文件会在该命令的执行目录中生成一个可执行文件。
- 执行该命令且不追加任何参数时,它会试图把当前目录作为代码包并编译。
- 执行该命令且以代码包的导入路径作为参数时,该代码包及其依赖会被编译。
- 执行该命令且以若干源码文件作为参数时,只有这些文件会被编译。
go build 命令案例演示
| // 编译命令源码文件
MacintoshdeMacBook-Pro-139:ds elasticnotes$ go build showds.go
MacintoshdeMacBook-Pro-139:ds elasticnotes$ ls
showds showds.go
MacintoshdeMacBook-Pro-139:ds elasticnotes$ ./showds
/Users/elasticnotes/Desktop/go_practice/goc2p/src/helper/ds:
showds
showds.go
|
| // 编译代码包
MacintoshdeMacBook-Pro-139:pkgtool elasticnotes$ pwd
/Users/elasticnotes/Desktop/go_practice/goc2p/src/pkgtool
MacintoshdeMacBook-Pro-139:pkgtool elasticnotes$ go build
MacintoshdeMacBook-Pro-139:pkgtool elasticnotes$ ls
envir.go envir_test.go fpath.go ipath.go pnode.go util.go util_test.go
↑↑↑ 用go build命令编译一个不包含命令源码文件的代码包的时候,不会产生任何输出。
|
go install 命令简介
- 用于编译并安装代码包或源码文件。
- 安装代码包会在当前工作区的
pkg / <平台相关目录> 下生成归档文件
。
- 安装命令源码文件会在当前工作区的
bin
目录或 $GOBIN
目录下生成可执行文件。
- 执行该命令且不追加任何参数时,它会试图把当前目录作为代码包并安装。
- 执行该命令且以代码包的导入路径作为参数时,该代码包及其依赖会被安装。
- 执行该命令且以命令源码文件及相关源码文件作为参数时,只有这些文件会被编译并安装。
go install 命令案例演示
| MacintoshdeMacBook-Pro-139:ds elasticnotes$ pwd
/Users/elasticnotes/Desktop/go_practice/goc2p/src/helper/ds
MacintoshdeMacBook-Pro-139:ds elasticnotes$ go install
MacintoshdeMacBook-Pro-139:ds elasticnotes$ ls
showds.go
MacintoshdeMacBook-Pro-139:ds elasticnotes$ ls $GOBIN
ds pds
// go install命令可以运行只包含库源码文件的代码包
MacintoshdeMacBook-Pro-139:ds elasticnotes$ cd ../../pkgtool/
MacintoshdeMacBook-Pro-139:pkgtool elasticnotes$ go install
MacintoshdeMacBook-Pro-139:pkgtool elasticnotes$ ls
envir.go envir_test.go fpath.go ipath.go pnode.go util.go util_test.go
MacintoshdeMacBook-Pro-139:pkgtool elasticnotes$ cd ~/goc2p/
MacintoshdeMacBook-Pro-139:goc2p elasticnotes$ cd pkg
MacintoshdeMacBook-Pro-139:pkg elasticnotes$ ds
/Users/elasticnotes/Desktop/go_practice/goc2p/pkg:
darwin_amd64
pkgtool.a
|
go get 命令简介
- 用于从远程代码仓库(github、gitlab...)上下载并安装代码包
- 受支持的代码版本控制系统有:Git、Mercurial(hg)、SVN、Bazaar
- 指定的代码包会被下载到 $GOPATH 中包含的第一个工作区的 src 目录中,然后再安装他们。
go get 命令案例演示
| MacintoshdeMacBook-Pro-139:~ elasticnotes$ pwd
/Users/elasticnotes
MacintoshdeMacBook-Pro-139:~ elasticnotes$ go get -x github.com/go-errors/errors
cd .
git clone -- http://github.com/go-errors/errors /Users/elasticnotes/go/src/github.com/go-errors/errors
cd /Users/elasticnotes/go/src/github.com/go-errors/errors
git submodule update --init --recursive
cd /Users/elasticnotes/go/src/github.com/go-errors/errors
git show-ref
cd /Users/elasticnotes/go/src/github.com/go-errors/errors
git submodule update --init --recursive
WORK=/var/folders/7w/0j7vff4j1kz5_g43cf_vqlg00000gp/T/go-build026618172
mkdir -p $WORK/b001/
cat >$WORK/b001/importcfg << 'EOF' # internal
# import config
packagefile bufio=/usr/local/go/pkg/darwin_amd64/bufio.a
packagefile bytes=/usr/local/go/pkg/darwin_amd64/bytes.a
packagefile errors=/usr/local/go/pkg/darwin_amd64/errors.a
packagefile fmt=/usr/local/go/pkg/darwin_amd64/fmt.a
packagefile os=/usr/local/go/pkg/darwin_amd64/os.a
packagefile reflect=/usr/local/go/pkg/darwin_amd64/reflect.a
packagefile runtime=/usr/local/go/pkg/darwin_amd64/runtime.a
packagefile strconv=/usr/local/go/pkg/darwin_amd64/strconv.a
packagefile strings=/usr/local/go/pkg/darwin_amd64/strings.a
EOF
cd /Users/elasticnotes/go/src/github.com/go-errors/errors
/usr/local/go/pkg/tool/darwin_amd64/compile -o $WORK/b001/_pkg_.a -trimpath "$WORK/b001=>" -p github.com/go-errors/errors -complete -buildid ly4rUxmL_smBOre7YRm7/ly4rUxmL_smBOre7YRm7 -goversion go1.15.6 -D "" -importcfg $WORK/b001/importcfg -pack -c=4 ./error.go ./error_1_13.go ./parse_panic.go ./stackframe.go
/usr/local/go/pkg/tool/darwin_amd64/buildid -w $WORK/b001/_pkg_.a # internal
cp $WORK/b001/_pkg_.a /Users/elasticnotes/Library/Caches/go-build/fc/fcf98673b10ae534df999f0116a6e960a523f85134ca21ebbd7bae2509015d95-d # internal
mkdir -p /Users/elasticnotes/go/pkg/darwin_amd64/github.com/go-errors/
mv $WORK/b001/_pkg_.a /Users/elasticnotes/go/pkg/darwin_amd64/github.com/go-errors/errors.a
rm -r $WORK/b001/
|
go get 常用标记的使用
- -d:只执行下载动作
- -fix:在下载代码包后先执行修正动作,而后再进行编译和安装(例:1.0语法1.4不兼容,执行-fix会自动修正)
- -u:利用网络来更新已有的代码包及其依赖包
扩展
http://hyper0x.github.io/go_command_tutorial/#/0.0