generating "," instead of keeping it in repository
This commit is contained in:
14
,
14
,
@@ -1,14 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
script_path=$(realpath $0)
|
|
||||||
script_dir=$(dirname $script_path)
|
|
||||||
|
|
||||||
cd $script_dir
|
|
||||||
|
|
||||||
output=/tmp/commandgo
|
|
||||||
|
|
||||||
# 为什么不直接使用 go run . 呢
|
|
||||||
# 因为 go run 编译时会往 PATH 里注入 Go 的 bin 目录,这个修改过后的 PATH 会传递给子进程
|
|
||||||
# 于是程序运行起来时获取的 PATH 环境变量和外界不一致,因此不用 go run . 编译运行
|
|
||||||
go build -o $output . && $output $@
|
|
||||||
|
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +1,2 @@
|
|||||||
|
,
|
||||||
*~
|
*~
|
||||||
|
|||||||
31
main.go
31
main.go
@@ -1,10 +1,29 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var commaSh = `#!/bin/sh
|
||||||
|
|
||||||
|
script_path=$(realpath $0)
|
||||||
|
script_dir=$(dirname $script_path)
|
||||||
|
|
||||||
|
cd $script_dir
|
||||||
|
|
||||||
|
output=/tmp/commandgo
|
||||||
|
|
||||||
|
# why not just using "go run ." ?
|
||||||
|
# Because "go run ." will inject GOBIN into PATH while compiling,
|
||||||
|
# and modifed PATH will pass into actual program.
|
||||||
|
# So the program doesn't have the same PATH as outside.
|
||||||
|
# It's not a acceptable behavior.
|
||||||
|
|
||||||
|
go build -o $output . && $output $@
|
||||||
|
`
|
||||||
|
|
||||||
func commandsUsage() string {
|
func commandsUsage() string {
|
||||||
return fmt.Sprintf(
|
return fmt.Sprintf(
|
||||||
`commands:
|
`commands:
|
||||||
@@ -13,6 +32,18 @@ func commandsUsage() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
pwd, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Errorf("detect current directory failed! %w", err))
|
||||||
|
}
|
||||||
|
target := pwd + string(os.PathSeparator) + ","
|
||||||
|
_, err = os.Stat(target)
|
||||||
|
if errors.Is(err, os.ErrNotExist) {
|
||||||
|
err := os.WriteFile(target, []byte(commaSh), 0755)
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Errorf("write sh failed: %w", err))
|
||||||
|
}
|
||||||
|
}
|
||||||
if len(os.Args) >= 2 {
|
if len(os.Args) >= 2 {
|
||||||
switch os.Args[1] {
|
switch os.Args[1] {
|
||||||
case "path":
|
case "path":
|
||||||
|
|||||||
20
readme.md
20
readme.md
@@ -2,5 +2,21 @@
|
|||||||
|
|
||||||
Personal tools set written in Golang.
|
Personal tools set written in Golang.
|
||||||
|
|
||||||
To use it just clone and add the directory to *PATH*.
|
## How to run
|
||||||
Then type "," command, all commands will appear.
|
|
||||||
|
0. Clone this repository to somewhere
|
||||||
|
0. Add the root directory to *PATH*
|
||||||
|
0. change directory to the root directory
|
||||||
|
0. Run `go run .` to generate "," command
|
||||||
|
0. Run "," command to see all commands
|
||||||
|
|
||||||
|
"," command can auto rebuild if you change the code in this repository.
|
||||||
|
Actually it always builds each time you type it! Because `go build` is
|
||||||
|
very fast and it has cache, it's not a problem in terms of speed.
|
||||||
|
|
||||||
|
## Q&A
|
||||||
|
|
||||||
|
Q: Why generating "," shell script instead of putting it in repository?
|
||||||
|
|
||||||
|
A: I like the repository keeps 100% Go source code. I tried writting ","
|
||||||
|
shell script as a Go source code with shebang, but it didn't work.
|
||||||
|
|||||||
Reference in New Issue
Block a user