#build #pipeline #task #execute #layout #pipe #serials

build pipeline-cli

A build tools written by rust to build project and execute a serials of task

19 releases (8 breaking)

new 0.12.0 Apr 12, 2024
0.7.0 Mar 18, 2024
0.3.0 Dec 16, 2023

#21 in Build Utils

Download history 2/week @ 2024-01-05 13/week @ 2024-02-16 143/week @ 2024-02-23 288/week @ 2024-03-01 290/week @ 2024-03-08 276/week @ 2024-03-15 26/week @ 2024-03-22 23/week @ 2024-03-29 443/week @ 2024-04-05

879 downloads per month

MIT license

220KB
4.5K SLoC

一个rust写的windows平台的构建工具,用于快捷执行一系列脚本。该命令行工具的想法来源是pipelight,但是pipelight不支持windows,所以写了这个工具。

安装

使用cargo进行安装

cargo install pipeline-cli

内置模块

1. std标准库,无需导入

  • cmd(command:String) 调用sh(linux)或者powershell执行一条命令
  • env(key:String,value:String) 设置当前任务的环境变量
  • println(..a:Any) 输入任意值,将其打印到控制台,带换行。(注意:pipeline任务运行的时候,其日志输出会覆盖println的内容)
  • print(..a:Any)
  • workspace(path:String) 切换当前命令的工作空间,影响cmd,movefile,replace函数中路径的书写
  • move(source_path:String,target_path:String) 将一个文件从source_path移动到target_path处,如果target_path路径不存在会尝试创建一系列文件夹
  • replace(file_path:String,regex:String,replace_content:String) 通过正则将file_path处的文件中的内容替换成replace_content
  • copy(source_path:String,target_path:String) 将一个文件从source_path复制到target_path处,如果target_path路径不存在会尝试创建一系列文件夹
  • readInt(hint:String),
  • readString(hint:String),
  • readFloat(hint:String),
  • readLine(hint:String),

2.pipe 任务模块

使用import pipe导入

  • pipeline(pipeline_name:String,closure:Closure):包裹一组由step和parallel组成的任务
  • step(name:String,closure:Closure) 一个普通的任务,会阻塞后面的任务执行
  • parallel(name:String,closure:Closure) 一个并行的任务,不会阻塞后面的任务执行

3.math 数学库

  • max(..a:Int|Float) 返回一串Int或者Float数中的最大值
  • randomInt() 生成一个随机的Int值
  • randomInt(n:Int) 生成一个随机的Int值,范围在0~n之间
  • randomInt(start:Int,end:Int)生成一个随机的Int值,范围在start~end之间

4.layout 项目布局生成库

  • layout(name:String) 包裹一组文件
  • template(targetPath:String,templatePath:String,fn:Closure) 表示的是一个文件,使用templatePath处的模板生成一个targetPath文件,fn中会有一个隐藏的ctx变量用于调用set函数
  • set(ctx:Map,key:String,value:String) 设置一个映射,用于使用value替换模版文件中捕获的${key}
  • folder(path:String) 创建一个目录

语法

  1. 注释
//行注释
/* 注释段 */
/*
注释段
*/
  1. 函数定义
fn add(a:Int,b:Int){
    return a+b
}
  1. 函数调用
print(add(12,5))
let a=add(12,5)
a.print()//如果参数是函数的第一个参数,可以通过.函数的方式进行调用。
  1. 条件判断
let a=true
if a{
    println("Hello")
}

  1. 声明变量

let,var,val目前是等价的,val和var目的是使用kotlin script 的代码提示

let a=1
let a=1.25
let a="hello"
var a=true
val b=a

6.循环

a=3
while a>1{
    println(a)
    a=a-1
}

  1. 算术表达式

目前仅支持+,-,*,/,%,>,<,==等二元表达式

将其作为Rust程序的内嵌脚本使用

 let ast=PipelineEngine::default()
                .eval_stmt_blocks("a=[1,2,3,4];println(a[1]);a[0]=10;println(a)").await.unwrap();

8.模块导入

默认会去用户目录的.pipeline/package下寻找,以下示例会去寻找~/.pipeline/package/math.kts文件,如果没找到,默认去当前目录下找math.kts

import math

Examples

使用layout定义并生成项目结构

假设我们需要再一个目录下生成项目相关文件,其结构如下:

internal/

pkg/

main.go

go.mod

则我们需要确保~/.pipeline/layout/go/layout.kts文件中内容如下:

import layout
val projectName = readString("请输入项目名:");
layout("go"){
    template("main.go","main.go.tpl")
    template("go.mod","go.mod.tpl"){
        ctx.set("projectName",projectName)
    }
    folder("internal")
    folder("pkg")
}

同目录下的main.go.tpl内容如下:

package main

import "fmt"

func main(){
    fmt.Println("Hello,World!")
}

同目录下的go.mod.tpl内容如下

module ${projectName}

go 1.21

最后我们创建一个demo目录,切换到demo目录下,使用一下命令:

pipeline layout go

它会提示你输入项目名,输入完毕后会生成对应的结构

pipeline 配置多个任务

需要在项目目录下添加一个名为pipeline.kts的文件,文件语法采用kotlin dsl语法,仅支持函数使用内建函数进行调用

一个pipeline.kts的例子:

pipeline("dev"){
    step("web"){
        workspace("./web")
        cmd("yarn dev")
    }
    step("tailwind"){
        workspace("./web")
        cmd("npx tailwindcss -i./src/style.css -o./src/output.css --watch")
    }
    step("go"){
        workspace("./test")
        copy("cmd/main.go","t/main.go")
        move("t/main.go","cmd/main.go")
    }
}
pipeline("hz"){
    step("new"){
         workspace("./")
         cmd("hz new -module github.com/yanguiyuan/cloudspace -idl idl/api/api.thrift")
         cmd("go mod tidy")
    }
    step("clean"){
        workspace("./")
        cmd("Remove-Item -Path ./biz -Recurse ")
        cmd("Remove-Item -Path ./script -Recurse ")
        cmd("del ./.hz")
        cmd("del ./build.sh")
        cmd("del ./router.go")
        cmd("del ./router_gen.go")
        cmd("del ./main.go")
    }
}

1.执行Pipeline dev下的Step web相关命令:

pipeline run dev.web
或者运行dev下的所有step
pipeline run dev

img.png

2.列出所有的任务

pipeline list

3.初始化项目使用模板

pipeline init -t <template_name>
//或者
pipeline init --template <template_name>
//例如
pipeline init -t hertz-vue

4.列出所有可用的模版(模版存放在用户目录的.pipeline目录下,可能需要你手动创建目录)

pipeline template

5.将当前项目中的pipeline.kts保存为模版

pipeline template -a/--add <template_name>

6.移除指定模版

pipeline template -r/--remove <template_name>

Dependencies

~19–32MB
~615K SLoC