12 Commits
v1.0 ... v1.1

Author SHA1 Message Date
dengsgo
b40feaf441 增加 v1.1说明 2018-09-19 13:57:32 +08:00
dengsgo
e9ed699f71 增加 changelog 2018-09-19 13:48:32 +08:00
dengsgo
3739cbe98e 修改 README 2018-09-19 11:46:33 +08:00
dengsgo
d486353d9b 增加 yaml配置说明 2018-09-19 11:43:16 +08:00
dengsgo
2a87304923 增加 command命令变量 2018-09-19 11:26:57 +08:00
dengsgo
73b048ad1a 增加 收集目录信息提示 2018-09-19 10:03:42 +08:00
dengsgo
2b6d37659a 修改 单词错误 2018-09-12 11:11:32 +08:00
刘邓
7c77562909 Merge pull request #1 from itwesley/patch-1
Update README.md
2018-09-12 10:45:25 +08:00
itwesley
0639b906ec Update README.md
typo 
commend -> command
2018-09-11 11:58:25 +08:00
dengsgo
843fe170ae 修改 下载地址为国内 2018-09-11 10:37:21 +08:00
dengsgo
0490cb7ad2 修复 slice报错 2018-09-11 10:12:52 +08:00
dengsgo
98c6ef9b3f 增加 release 下载 2018-09-11 09:43:20 +08:00
5 changed files with 114 additions and 28 deletions

33
CHANGELOG.md Normal file
View File

@@ -0,0 +1,33 @@
### Release v1.1
2018.09.19
- command 命令支持变量占位符 `{{file}}``{{ext}}``{{changed}}`
```yaml
# {{file}} 文件名(如 a.txt 、test/test2/a.go)
# {{ext}} 文件后缀(如 .go)
# {{changed}} 文件更新的本地时间戳(纳秒,如 1537326690523046400)
# 变量占位符使用示例cp {{file}} /root/sync -rf 、 myCommand --{{ext}} {{changed}}
```
- 增加 较深目录递归提示;
- 优化 文字提示;
- 修复 command 命令执行时目录不正确的问题;
- 修复 其他bug;
### Release v1.0
2018.09.10
- 文件变更监听支持多平台 windows/linux测试mac未测试
- 支持灵活配置监听 包含文件夹/排除文件夹/特定文件类型;
- 支持配置变更要运行命令,可以有多条,会依次执行;
- 支持 fileboy init 初始化配置,生成 filegirl.yaml 文件;
- 支持 fileboy exec 直接执行配置的 command 命令;

View File

@@ -6,11 +6,19 @@ fileboy文件变更监听通知系统使用 GO 编写。
## 编译环境
go version >=1.10
go version >=1.10
## 更新日志
[CHANGELOG](CHANGELOG.md)
## 运行
### 直接下载二进制文件
### 下载二进制文件
Github: [正式版 v1.1](https://github.com/dengsgo/fileboy/releases)
Gitee [正式版 v1.1](https://gitee.com/dengsgo/fileboy/releases)
直接下载已经编译好的对应平台二进制文件,加入系统 Path 中即可。
@@ -40,7 +48,7 @@ fileboy 的正常运行依赖于 `filegirl.yaml` 配置,所以首次在项目
- 运行 `fileboy`即可.
如果你定义了 `commend -> exec`命令,想事先确认是否能正常执行,可以运行 `fileboy exec`命令,系统会尝试运行你的自定义命令。
如果你定义了 `command -> exec`命令,想事先确认是否能正常执行,可以运行 `fileboy exec`命令,系统会尝试运行你的自定义命令。
你可以使用 `fileboy help`查看使用帮助。
@@ -68,10 +76,12 @@ monitor:
- .idea
- .git
- .vscode
- node_modules
- vendor
# 监听文件的格式,此类文件更改会执行 commend 中的命令
# .go 后缀为 .go 的文件更改,会执行 commend 中的命令
# .* 所有的文件更改都会执行 commend 中的命令
# 监听文件的格式,此类文件更改会执行 command 中的命令
# .go 后缀为 .go 的文件更改,会执行 command 中的命令
# .* 所有的文件更改都会执行 command 中的命令
types:
- .go
@@ -81,9 +91,15 @@ command:
# 可以有多条命令,会依次执行
# 如有多条命令,每条命令都会等待上一条命令执行完毕后才会执行
# 如遇交互式命令,允许外部获取输入
# 支持变量占位符,运行命令时会替换成实际值:
# {{file}} 文件名(如 a.txt 、test/test2/a.go)
# {{ext}} 文件后缀(如 .go)
# {{changed}} 文件更新的本地时间戳(纳秒,如 1537326690523046400)
# 变量占位符使用示例cp {{file}} /root/sync -rf 、 myCommand --{{ext}} {{changed}}
exec:
- go version
- go env
- echo {{file}}
```
## QA
@@ -96,17 +112,17 @@ command:
在开发中,我们很需要一款可以帮助我们自动打包编译的工具,那 fileboy 就非常适合这样的场景。比如 go 项目的热编译,让我们可以边修改代码边运行得到反馈。又比如 PHP Swoole 框架由于常驻进程的原因无法更改代码立即reload使用 fileboy 就可以辅助做到传统 PHP 开发的体验。
对于一些需要监控文件日志或者配置变动的场景, fileboy 同样适合。你可以事先编写好相应的通知报警脚本,然后定义`filegirl.yaml`中的`commend`命令,交由 fileboy 自动运行监控报警。
对于一些需要监控文件日志或者配置变动的场景, fileboy 同样适合。你可以事先编写好相应的通知报警脚本,然后定义`filegirl.yaml`中的`command`命令,交由 fileboy 自动运行监控报警。
#### idea 下更改文件,为什么会执行两次或者多次 commend ?
#### idea 下更改文件,为什么会执行两次或者多次 command ?
由于 idea 系列软件特殊的文件保存策略,他会自动创建一些临时文件,并且在需要时多次重写文件,所以有时反映在文件上就是有多次的更改,所以会出现这种情况。这个后续会做优化.
#### filegirl.yaml 里面的 commend 不支持复杂的命令吗?
#### filegirl.yaml 里面的 command 不支持复杂的命令吗?
对于“很复杂的命令”这种说法很难去定义,比如 `echo "hello world"`并不复杂,但是对于 fileboy 来讲,目前无法解析这种命令。
fileboy 目前支持 `命令 + 参数`这种形式的 commend而且 参数中不能有""符号或者有空格。如:
fileboy 目前支持 `命令 + 参数`这种形式的 command而且 参数中不能有""符号或者有空格。如:
`go build`:支持;
@@ -116,7 +132,7 @@ fileboy 目前支持 `命令 + 参数`这种形式的 commend而且 参数中
`cat a.txt | grep "q" | wc -l`:不支持
对于不支持的命令,可以把它写到一个文件里,然后在 commend 中执行这个文件来解决。
对于不支持的命令,可以把它写到一个文件里,然后在 command 中执行这个文件来解决。
#### 为什么起名为 fileboy又把配置名叫做 filegirl
@@ -124,4 +140,4 @@ fileboy 目前支持 `命令 + 参数`这种形式的 commend而且 参数中
#### 听说有彩蛋?
(◡ᴗ◡✿)
(◡ᴗ◡✿)

View File

@@ -32,9 +32,10 @@ var (
runLock sync.Mutex
)
type wDirState struct {
Name string
Recursive bool
type changeFile struct {
Name string
changed int64
Ext string
}
func parseConfig() {
@@ -72,22 +73,28 @@ func eventDispatcher(event fsnotify.Event) {
}
log.Println("stop old process ")
}
go run()
go run(&changeFile{
Name: relativePath(projectFolder, event.Name),
changed: time.Now().UnixNano(),
Ext: ext,
})
case fsnotify.Remove:
case fsnotify.Rename:
}
}
func run() {
func run(cf *changeFile) {
runLock.Lock()
defer runLock.Unlock()
for i := 0; i < len(cfg.Command.Exec); i++ {
carr := cmdParse2Array(cfg.Command.Exec[i])
carr := cmdParse2Array(cfg.Command.Exec[i], cf)
cmd = exec.Command(carr[0], carr[1:]...)
//cmd.SysProcAttr = &syscall.SysProcAttr{CreationFlags: syscall.CREATE_UNICODE_ENVIRONMENT}
cmd.Stdin = os.Stdin
//cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Dir = projectFolder
cmd.Env = os.Environ()
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Println("error=>", err.Error())
@@ -117,6 +124,7 @@ func run() {
}
func addWatcher() {
log.Println("collecting directory information...")
dirs := make([]string, 0)
for i := 0; i < len(cfg.Monitor.IncludeDirs); i++ {
darr := dirParse2Array(cfg.Monitor.IncludeDirs[i])
@@ -197,7 +205,7 @@ func parseArgs() {
if l == 1 {
_, err := ioutil.ReadFile(projectFolder + "/filegirl.yaml")
if err != nil {
log.Println("the filegirl.yaml file is not exist! ", err)
log.Println("the filegirl.yaml file does not exist! ", err)
fmt.Print(firstRunHelp)
fmt.Print(helpStr)
return
@@ -218,7 +226,7 @@ func parseArgs() {
return
case "exec":
parseConfig()
run()
run(new(changeFile))
return
default:
fmt.Print(helpStr)
@@ -231,7 +239,7 @@ func show() {
fmt.Print(logo)
rand.Seed(time.Now().UnixNano())
fmt.Println(englishSay[rand.Intn(len(englishSay))], "\r\n")
fmt.Println("Version: ", Version, " Author: deng@yoytang.com")
fmt.Println("Version: ", Version, " Author: dengsgo@yoytang.com")
}
func main() {

16
raw.go
View File

@@ -21,10 +21,12 @@ monitor:
- .idea
- .git
- .vscode
- node_modules
- vendor
# 监听文件的格式,此类文件更改会执行 commend 中的命令
# .go 后缀为 .go 的文件更改,会执行 commend 中的命令
# .* 所有的文件更改都会执行 commend 中的命令
# 监听文件的格式,此类文件更改会执行 command 中的命令
# .go 后缀为 .go 的文件更改,会执行 command 中的命令
# .* 所有的文件更改都会执行 command 中的命令
types:
- .go
@@ -34,9 +36,15 @@ command:
# 可以有多条命令,会依次执行
# 如有多条命令,每条命令都会等待上一条命令执行完毕后才会执行
# 如遇交互式命令,允许外部获取输入
# 支持变量占位符:
# {{file}} 文件名(如 a.txt 、test/test2/a.go)
# {{ext}} 文件后缀(如 .go)
# {{changed}} 文件更新的本地时间戳(纳秒,如 1537326690523046400)
# 变量占位符使用示例cp {{file}} /root/sync -rf 、 myCommand --{{ext}} {{changed}}
exec:
- go version
- go env
- echo {{file}}
`
var firstRunHelp = `第一次运行 fileboy ?
@@ -51,7 +59,7 @@ Usage of fileboy:
init
初始化 fileboy, 在当前目录生成 filegirl.yaml 配置文件
exec
尝试运行定义的 commend 命令
尝试运行定义的 command 命令
`
var englishSay = []string{

27
util.go
View File

@@ -2,6 +2,7 @@ package main
import (
"io/ioutil"
"strconv"
"strings"
)
@@ -14,17 +15,27 @@ func inStringArray(value string, arr []string) bool {
return false
}
func cmdParse2Array(s string) []string {
func cmdParse2Array(s string, cf *changeFile) []string {
a := strings.Split(s, " ")
r := make([]string, 0)
for i := 0; i < len(a); i++ {
if ss := strings.Trim(a[i], " "); ss != "" {
r = append(r, ss)
r = append(r, strParseRealStr(ss, cf))
}
}
return r
}
func strParseRealStr(s string, cf *changeFile) string {
return strings.Replace(
strings.Replace(
strings.Replace(s, "{{file}}", cf.Name, -1),
"{{ext}}", cf.Ext, -1,
),
"{{changed}}", strconv.FormatInt(cf.changed, 10), -1,
)
}
func dirParse2Array(s string) []string {
a := strings.Split(s, ",")
r := make([]string, 0)
@@ -55,12 +66,22 @@ func arrayUniqueAdd(a []string, add string) []string {
}
func arrayRemoveElement(a []string, r string) []string {
i := 0
i := -1
for k, v := range a {
if v == r {
i = k
break
}
}
if i == -1 {
return a
}
if len(a) == 1 && i == 0 {
return []string{}
}
return append(a[:i], a[i+1:]...)
}
func relativePath(folder, p string) string {
return strings.TrimPrefix(p, folder)
}