精华内容
下载资源
问答
  • 在前两篇文章中,我们使用NPM脚本和Parcel配置了一个项目启动器存储库。 我倾向于为每个项目采用或多或少相同的Sass架构,因此我希望我的样板包括我需要立即开始编写代码的SCSS文件和文件夹。 这是我首选的体系结构...
    Sass logo on a pink gradient background

    在前两篇文章中,我们使用NPM脚本和Parcel配置了一个项目启动器存储库。 我倾向于为每个项目采用或多或少相同的Sass架构,因此我希望我的样板包括我需要立即开始编写代码的SCSS文件和文件夹。 这是我首选的体系结构,大致基于Harry Roberts的 ITCSS (倒三角CSS)以及我以前的代理公司Mud的样板:

    1. Config它通常包含三个文件:在这里,我定义了整个项目中使用的所有Sass变量,mixins和函数。 我通常将单个文件用作变量,包括断点,颜色,间距和其他任何内容。 但是没有理由不能将变量文件分成多个文件,这对于大型项目可能是个好主意。
    2. 基础这里的几乎所有内容都涉及在元素选择器而不是类上编写样式。 它包括所有重设(例如* { box-sizing: border-box; } )以及版式和表单元素的基本样式,其中某些样式稍后可能会在组件级别被覆盖。
    3. 对象任何可能出现在多个组件中的可重用的小型UI都属于此处。 我从buttons.scss文件开始,因为,几乎每个项目都有按钮! 但是我只会在需要时才添加其他人。
    4. 全局变量我喜欢将要在每个页面上使用的所有组件(例如页眉和页脚)与其余组件放在单独的文件夹中。 我还在这里添加通用布局类-例如,如果我有一个要在很多地方使用的网格。 我更喜欢使用类而不是混合类,因为它的抽象水平要低一个级别。
    5. 组件这用于较大的UI块,例如英雄区,卡片,媒体对象等。 在这里,我将编写大量CSS,但是我一开始就将其留空,以便可以在需要时添加单个组件文件。
    6. 实用程序这是针对可以应用于任何元素的单一用途,可重用的原子(或实用程序)类。 例如,以下代码可用于在应用了此类的所有元素上设置垂直填充:
    .padding-v {
    	padding-top:var( --pad );
    	padding-bottom:var( --pad );
    }

    我倾向于不使用太多这些文件,因此在需要之前我将其保留为空。

    因此,为了结束我们的项目入门,我将在src / scss目录中添加以下文件结构:

    01-config
    	_variables.scss
    	_functions.scss
    	_mixins.scss
    02-base
    	_resets.scss
    	_typography.scss
    	_forms.scss
    03-objects
    	_buttons.scss
    04-globals
    	_header.scss
    	_footer.scss
    	_layout.scss
    05-components
    06-utilities

    您可能会注意到每个文件夹都有一个数字前缀–这样,在文件系统中查看时,视觉顺序将反映导入顺序。 这样可以更快,更轻松地找到我想要的文件,并且可以避免任何混乱。

    您可能会拥有自己喜欢的Sass架构,所以我建议您在样板中至少添加一个基本的文件夹结构–或随意对其进行调整。 即使您使用原子CSS框架(如Tailwind ),也有可能您可能需要自己编写一些CSS,因此适当的架构是有意义的。

    结论

    这是“现代前端工作流”迷你系列的总结。 我们已经学习了有关安装NPM软件包,编写脚本以运行任务,使用Parcel进行更轻松的自动化以及添加基本的Sass架构的知识。 该入门资料库包括我们涵盖的所有内容。 可以为您自己的项目随意克隆或添加-并将其添加。

    参阅本系列的其他文章

    翻译自: https://css-irl.info/a-modern-front-end-workflow-part-3/

    展开全文
  • 在 spark 中以编程方式创建嵌套数据 代码示例显示如何从平面数据开始加载嵌套数据(通常在镶木地板中)。 建造 起诉 sbt(sbt 包) ...您需要更改代码中的文件位置,但您可以在构建示例后运行 submit.sh 脚本
  • Linux脚本编写基础

    2018-08-02 15:01:41
    一、构建基本脚本 1 1 开头 1 2 变量 2 3 重定向 2 4 查看退出状态码 $? 3 二、 使用结构化命令 4 1 if then 4 2 if then else 4 3 嵌套if 5 4 test 命令 5 5 复合条件测试 7 6 if then的高级特性 7 1) ...

    Linux脚本编写基础 1
    一、构建基本脚本 1
    1 开头 1
    2 变量 2
    3 重定向 2
    4 查看退出状态码 $? 3
    二、 使用结构化命令 4
    1 if then 4
    2 if then else 4
    3 嵌套if 5
    4 test 命令 5
    5 复合条件测试 7
    6 if then的高级特性 7
    1) 双尖括号 7
    2) 双方括号 8
    3)case命令 8

    Linux脚本编写基础
    http://os.51cto.com/art/201003/186779.htm
    《Linux命令行与shell脚本编程大全 第2版》
    如果将多个命令一起运行,可用分号隔开,例如 date;who 为了方便起见,可以将输入的多个繁琐的命令写入一个shell脚本文件中,然后运行这个文件即可。
    一、构建基本脚本
    1 开头
    !#/bin/sh
    必须在文件的第一行,符号!#后面指定要使用的shell。
    其余行用#来表示注释,直到一行的结束。
    当编译好脚本后,需要在命令行运行 chmod +x filename 或chmod u+x filename,
    ./filename来运行。
    为了让命令中产生一些输出,可以用echo ,用单引号或者双引号将文本括起来。
    Echo “this’s is a test”
    Echo ‘we say “it is so easy” ,so good’
    若想在同一行显示一个文本字符串作为该命令输出提示,用-n ,echo -n “the time and date are”
    2 变量

    对变量赋值

    a=”hell”

    打印变量a的内容

    echo “a is “
    Echo aNum=2Echothisisthe{num}nd” —–>输出 this is the 2nd

    Echo “the cost of the item is $15”—–>输出 the cost of the item is $15

    环境变量和用户变量
    环境变量
    echo UID:UIDUID:100echoHOME:HOME —输出 HOME:/root
    用户变量
    可以是任何不超过20个字母,且变量名区分大小写,在变量,等号和值之间不能出现空格。

    Value1=10
    Value2=value1Echotheresultvalueisvalue2 输出 the result is 100
    若value2=value1
    Echo the result value is $value2 输出 the result is value1
    反引号`
    today=
    date +%y%m%d` #告诉date命令将日期显示为两数字的年月日组合。
    Echo the testing is todaythetestingisFriOct911:13:01CST2015Ls/usr/binal>log.today

    3 重定向
    命令 > 文件 覆盖之前文件的内容
    命令 >> 文件 追加到文件
    Wc

    if [ “he” = “he” ]

    if [ vaba ] 大于号需要加\进行转义一下
    then
    echo vaisgreaterthanba
    else
    echo vaislessthanba
    Fi 输出baseball is less than hockey
    -n -z用来检查一个变量是否含有数据;-n用来判断长度是否非0.-z用来判断长度是否为0
    var=””
    if [ -n “var]thenechovar is not empty
    else
    echo $var is empty
    Fi 输出 is empty

    5 复合条件测试

    6 if then的高级特性

    1)双尖括号

    Var=10
    if ((var2>90))then((var1=var**2))
    echo the square of varisvar1
    Fi 输出 the square of 10 is 100

    2)双方括号

    if [[ USER==r]]thenechotheuserisUSER 输出 the user is root
    fi
    3)case命令
    case USERinrich|root)echowelcomeUSER,please enjoy your visit”::

    testing )

    ./1.sh: line 107: syntax error near unexpected token newline'
    ./1.sh: line 107:
    rich | root] 对于这个命令的用法还没有弄清楚

    echo “special testing account”::

    *)

    echo “sorry,you are bot allowed here”::

    Esac 输出 welcome USER,pleaseenjoyyourvisit1forForvarinlistDoDoneForvarinlistDoDonefortestinidon\’tknowifthisllwork;doechothenextstateistest
    Done
    输出
    the next state is i
    the next state is don’t
    the next state is know
    the next state is if
    the next state is this’ll
    the next state is work

    下面的这个不知道为何不行
    file=qwe qwe是一个文件名
    for state in cat $file
    do
    echo “visit beautiful $state”
    Done 输出cat: qwe: No such file or directory
    以下是qwe文件中的内容。
    cat qwe
    dfd
    dfdf
    dfdf
    dfdf
    df
    df
    df

    1)IFS内部字段分隔符
    默认情况下,bash shell 会将空格、制表符、换行符当作字段分隔符。
    可修改IFS的值使其只能识别换行符:IFS=$’\n’

    以下这个输出也有问题 ,不知道为什么
    if [ -d “file]thenechofile is a directory”
    elif [ -f “file]thenfile is a file”
    fi
    done
    输出
    /root/01/11 is a directory
    ./1.sh: line 138: /root/01/1.c is a file: No such file or directory
    ./1.sh: line 138: /root/01/1.sh is a file: No such file or directory
    ./1.sh: line 138: /root/01/1.txt is a file: No such file or directory
    ./1.sh: line 138: /root/01/2.txt is a file: No such file or directory
    ./1.sh: line 138: /root/01/a.out is a file: No such file or directory
    ./1.sh: line 138: /root/01/count.c is a file: No such file or directory
    ./1.sh: line 138: /root/01/hockey is a file: No such file or directory
    ./1.sh: line 138: /root/01/log. is a file: No such file or directory
    ./1.sh: line 138: /root/01/log.151009 is a file: No such file or directory
    ./1.sh: line 138: /root/01/log.151012 is a file: No such file or directory
    ./1.sh: line 138: /root/01/qwe is a file: No such file or directory
    ./1.sh: line 138: /root/01/rpm.list is a file: No such file or directory
    ./1.sh: line 138: /root/01/test is a file: No such file or directory
    2 C风格的for命令
    for (( i=1; i<=10; ++i ))
    do
    echo “the next number is $i”
    Done
    输出
    the next number is 1
    the next number is 2
    the next number is 3
    the next number is 4
    the next number is 5
    the next number is 6
    the next number is 7
    the next number is 8
    the next number is 9
    the next number is 10

    3 while命令
    While test command
    Do
    other command
    Done

    4 until命令
    Until test commands
    Do
    Other commands
    Done
    三、处理用户输入

    $# 这个变量可以统计命令行中输入了多少个参数。

    初识sed和gawk
    1)Sed
    sed options script file

    sed编辑器自身不会修改文本文件的数据,只会将修改后的数据发送到STDOUT.
    Sed -e s/test/big test/ 用big test替换test
    Sed -f rule.txt 2.t 用-f选项指定文件,过滤规则在文件中
    Cat rule.txt
    S/you/I/
    S/are/am/

    2)Gawk
    Gawk options program file

    Gawk ‘{print “hello John!”}’
    Print命令:将文本打印到STDOUT。
    Gawk中默认的字段分隔符是空白字符(礼服)。

    从文本中读取gawk的规则
    Cat gawk.rule
    {
    Test=”’s home directory is ”
    print 1test6 }

    Gawk -F: -f gawk.rule /etc/passwd

    可以用BEGIN命令和END命令,打印处理数据前和后的Log
    gawk ‘BEGIN { print “the data4 file contents:” } { print $0 } END { print “End of life” }’ data4
    the data4 file contents:
    line1
    line2
    line3
    line4
    End of life
    [root@localhost 01]#

    3)sed编辑器基础
    Sed ‘s/字符串/替换成的字符串/替换标记’
    有4钟可用的替换标记:
    数字:表明新文本将替换第几处匹配的地方
    G:替换所有的
    P:打印出原来行的内容

    sed ‘/very/s/good/bad/g w 22’ 2.txt
    thest y you are good or bad, not good
    very bad,so bad 表示只修改了very开头的行中的字符。
    [root@localhost 01]#

    sed ‘s/good/bad/g p w 22’ 2.txt
    thest y you are bad or bad, not bad
    thest y you are bad or bad, not bad
    very bad,so bad
    very bad,so bad 即显示 又全部替换 又将替换的保存了起来

    Sed编辑器会采用正则表达式的特性来帮助很好的匹配模式。

    [root@localhost 01]# sed ‘2{

    s/so/very/
    s/good/buautiful/
    }’ 2.txt
    thest y you are good or bad, not good
    very buautiful,very good
    [root@localhost 01]#

    删除命令sed ‘2d’ 2.txt 删除第2 行
    Sed ‘d’ 2.txt 删除所有
    Sed ‘2,3d’ 2.txt 删除第2行和3行
    Sed ’3,$d’ 2.txt从第三行删除到结尾

    修改命令 sed ‘3c\how are you ‘
    正则表达式
    正则表达式区分大小写,识别空格,还包括以下特殊字符:
    .*[]……^{}+?|()
    如果要使用某个特殊字符作为文本字符,必须转义,前面加上 \

    ^ 脱字符:在行首检查,
    [root@localhost 01]# echo “this ^ is a test” | sed -n ‘/s ^/p’
    this ^ is a test
    [root@localhost 01]# 若将该字符放到模式中的其他位置而不是开头,则当作普通字符。
    $ 行尾查找

    过滤出数据流中的空白行
    [root@localhost 01]# cat 2.txt

    thest y you are good or bad, not good

    very good,so good

    very good,so good
    [root@localhost 01]# sed ‘/^/d’ 2.txt  thest y you are good or bad, not good  very good,so good  very good,so good  [root@localhost 01]# 将^组合在一起,不加任何文本,过滤出数据流中的空白行。

    . 点字符:用来匹配任意的单字符,若点字符旁边没有字符,则不成立。

    [] 字符数组:
    [root@localhost 01]# cat 2.txt

    thest y you are good or bad, not good

    very good,so good

    very good,so good

    this test is at line two.
    that is so good

    at school
    [root@localhost 01]# sed -n ‘/[^ch]at/p’ 2.txt
    this test is at line two.
    通过排除字符组,正则表达式模式会匹配c或h之外的任何字符,但即使是排除,字符数组仍然必须匹配一个字符,因此at开头的仍然未能匹配模式。

    使用区间,单破折号。
    [root@localhost 01]# echo “146g” |sed -n ‘/^[0-9][0-9][0-9][a-z]$/p’
    146g
    [root@localhost 01]#

    • 星号:说明该字符将在匹配模式中出现0次或者多次。
      [root@localhost 01]# echo “color” | sed -n ‘/colou*r/p’
      color
      [root@localhost 01]#

    扩展正则表达式

    问号 :类似于*号,不过前面的字符表示可以出现0次或者1次,不会匹配多次出现的该字符。

    [root@localhost 01]# echo “beeet” | gawk ‘/be?t/{print 0}’  [root@localhost 01]# echo “bet” | gawk ‘/be?t/{print0}’
    bet
    [root@localhost 01]#
    如果字符数组中的字符出现了0次或者1次,模式匹配就成立。但如果两个字符都出现了,或者如果一个字符出现了两次,模式匹配都不成立。
    [root@localhost 01]# echo “beeet” | gawk ‘/be?t/{print 0}’  [root@localhost 01]# echo “bet” | gawk ‘/be?t/{print0}’
    bet
    [root@localhost 01]# echo “beat” | gawk ‘/b[ae]?t/{print 0}’  [root@localhost 01]# echo “bat” | gawk ‘/b[ae]?t/{print0}’
    bat
    [root@localhost 01]# echo “bet” | gawk ‘/b[ae]?t/{print 0}’  bet  [root@localhost 01]# echo “bt” | gawk ‘/b[ae]?t/{print0}’
    bt
    [root@localhost 01]#

    Sed进阶
    Sed编辑器包含了3个用来处理多航文本的特殊命令。
    N:将数据流中的下一行加进来创建一个多行组来处理。
    D: 删除多行组中的一行
    P:打印多行组中的一行
    在脚本中使用sed

    PMS :包管理系统 linux中广泛使用的是dpkg和rpm

    展开全文
  • 组件嵌套 使用道具和子组件来配置可重复使用的卡组件。 样式化语义UI Create React App入门 该项目是通过引导的。 可用脚本 在项目目录中,可以运行: npm start 在开发模式下运行应用程序。 打开在浏览器中查看它...
  • 挂起的 DDL 在嵌套目录中被构建为 Liquibase 脚本。 要运行将应用这些脚本的工具,请运行如下的 groovy 脚本。 基本命令 这是基本命令。 运行它会显示更多的使用说明: ./ApplyPendingDDL.sh 结果是 error: ...
  • 需要使用shell编写一个简单实用的计算机脚本 一共想出了两套方案 本套使用了while循环以及if嵌套的方式 基本使用界面大概是这样 分析需要的功能 我的构思将其分成五个部分 加法部分 减法部分 乘法部分 除法部分 ...

    一些想法

    1. 需要使用shell编写一个简单实用的系统工具箱脚本
    2. 一共想出了两套方案
    3. 本套综合了一些自己的想法不是很熟练大家看个乐 (^o ^ )

    基本使用界面大概是这样
    在这里插入图片描述

    分析需要的功能

    我的构思将其分成7个部分

    1. 磁盘挂载信息部分
    2. 内存使用部分
    3. CPU利用率和负载部分
    4. 网络端口信息部分
    5. 进程信息部分
    6. 磁盘每秒进程下的IO读、写请求数量部分
    7. 没有匹配项重新显示菜单部分

    构建整体框架

    1、定义了函数

    #<-----------------------询问继续使用工具箱函数定义
    whether () { read -p "Continue to use[y],sign out[n]:" play
            if [[ "$play" == "y" ]];then
            clear
            else
                    echo "Thank you for your use. Have a nice day!";exit
            fi
    }
    #<-------------------------菜单显示函数定义
    ToolboxMenu () {
    echo -e "\033[5;34m ========This is a system detection toolbox============\033[0m"
    echo -e "\033[33m |            1.查看磁盘挂载信息                           | \033[0m"
    echo -e "\033[33m |            2.查看内存信息                              | \033[0m"
    echo -e "\033[33m |            3.查看CPU信息                               | \033[0m"
    echo -e "\033[33m |            4.查看网络端口信息                           | \033[0m"
    echo -e "\033[33m |            5.查看进程信息                              | \033[0m"
    echo -e "\033[33m |            6.磁盘每秒进程下的I0读写数量                  | \033[0m"
    echo -e "\033[33m |            7.Exit Toolbox                            | \033[0m"
    echo -e "\033[33m | Current Time:$(date "+%Y-%m-%d %H:%M:%S") welcome!!engineer! |\033[0m"
    echo -e "\033[5;34m =============System detection toolbox=================\033[0m"
    }
    

    2、使用交互定义变量邀请用户输入

    #<----------------邀请用户输入需要检测的信息
    read -p "Please enter your choice![1..7]" number
    

    3、使用while循环让工具箱一直使用
    4、中间为case判断选项
    5、最后一部分为没有匹配项的匹配

    #<------------------没有匹配项重新显示菜单
                    *)
                            echo -e "\033[31m  Error redirecting to menu for you ! \033[0m"
                    ;;
    

    着手完整代码

    #!/bin/bash
    #Author:Pakho
    #Date:2021.5.21
    #File:SystemToolbox.sh
    #VersionNumber:v1.0.1
    #https://blog.csdn.net/sixeleven611
    #Demand:Write system toolbox
    #——————————————————————————————————
    #script start
    #<-----------------------询问继续使用工具箱函数定义
    whether () { read -p "Continue to use[y],sign out[n]:" play
            if [[ "$play" == "y" ]];then
            clear
            else
                    echo "Thank you for your use. Have a nice day!";exit
            fi
    }
    #菜单显示函数定义
    ToolboxMenu () {
    echo -e "\033[5;34m ========This is a system detection toolbox============\033[0m"
    echo -e "\033[33m |            1.查看磁盘挂载信息                          | \033[0m"
    echo -e "\033[33m |            2.查看内存信息                             | \033[0m"
    echo -e "\033[33m |            3.查看CPU信息                             | \033[0m"
    echo -e "\033[33m |            4.查看网络端口信息                          | \033[0m"
    echo -e "\033[33m |            5.查看进程信息                             | \033[0m"
    echo -e "\033[33m |            6.磁盘每秒进程下的I0读写数量                 | \033[0m"
    echo -e "\033[33m |            7.Exit Toolbox                           | \033[0m"
    echo -e "\033[33m | Current Time:$(date "+%Y-%m-%d %H:%M:%S") welcome!!engineer! |\033[0m"
    echo -e "\033[5;34m =============System detection toolbox=================\033[0m"
    }
    #<----------------邀请用户输入需要检测的信息
    while :
    do
            ToolboxMenu
            read -p "Please enter your choice![1..7]" number
                    case $number in
    #<-----------------------------------------------------------磁盘挂载信息
                    1)
                                    echo -e "\033[5;34m ============Partition information${z}============\033[0m"
                                    df -hT
                                    whether
                    ;;
    #<------------------------------------------------------内存使用情况
                    2)
                            echo -e "\033[5;34m ============Memory usage============\033[0m"
                            free -h
                            n=1
                            for i in {1..3}
                            do
                                    echo -e "\033[5;34m ============Memory usage${n}============\033[0m"
                                    vmstat | awk '{if(NR==3){print "You have free memory left:" $4}}'
                                    let ++n
                                    sleep 1
                            done
                            whether
                    ;;
    #<-------------------------------------------------------CPU利用率和负载
                    3)
                            v=1
                            for i in {1..3}
                            do
                                    echo -e "\033[5;34m ============CPU usage${v}===========\033[0m"
                                    uptime
                                    vmstat | grep 2 |awk '{if (100-$15<=10){print 100-$15 "%","您的CPU很安全"}else{print 100-$15 "%","您的CPU即将满载请留意"}}'
                                    let ++v
                                    sleep 1
                            done
                                    whether
                    ;;
    #<---------------------------------------------------------------网络端口信息
                    4)
                            while :
                            do
                                    echo -e "\033[5;34m ============Network port information============\033[0m"
                                    read -p "Please enter the network port number you want to query:" Port
                                    netstat -anpt | head -2
                                    netstat -anpt | grep $Port
                                    read -p "Do you want to check the port?[y/n]" see
                                    if [[ ! $see == "y" ]];then
                                            echo "Thank you for your use. Have a nice day!";exit
                                    else
                                            break
                                    fi
                            done
                            whether
                    ;;
    #<----------------------------------------------------------------进程信息查询
                    5)
                            echo -e "\033[5;34m ============Process information============\033[0m"
                            read -p "Please enter the process information you want to query:" Process
                            ps aux | grep -v grep |grep $Process
                            whether
                    ;;
    #<-------------------------------------------磁盘每秒进程下的IO读、写请求数量
                    6)
                            b=1
                            for i in {1..3}
                            do
                                    echo -e "\033[5;34m ============Number of IO read / write requests issued by the process${b}============\033[0m"
                                    iostat | grep ^sd | awk '{print $1,$2}'
                                    let ++b
                                    sleep 1
                            done
                                    whether
                    ;;
    #<---------------------------------退出
                    7)
                            echo -e "\033[36 Thank you for your use. Have a nice day!\033[0m"
                            exit
                    ;;
    #<------------------没有匹配项重新显示菜单
                    *)
                            echo -e "\033[31m  Error redirecting to menu for you ! \033[0m"
                    ;;
            esac
    done
    #script end                       
    
    展开全文
  • 该存储库包含帮助程序/包装程序脚本,以使构建Electron更容易。 安装 构建Electron本身需要一些先决条件,例如git,python和npm。 这些可以在“ 找到。 npm也可以与build-tools一起使用,但是我们已经将其配置为可与...
  • cmd-args是Rust的命令行解析器,可用于轻松构建命令行界面。 介绍 您可能已经注意到,在rust-ecosystem中,目前有许多命令行解析器解决方案可用,那么为什么还要打扰并编写另一个呢? 我开始这个项目是因为我正在...
  • 脚本最初是作为对上一个的答复而构建的。 确保下载所有文件: 免责声明:我们没有以任何方式与Adobe相关联。 有关Adobe产品或Adobe脚本的任何问题,请直接与他们联系。 我们从来没有遇到过问题,但是使用此脚本...
  • 转自:http://www.iteye.com/topic/78973 下面是一个通用的构建文件,它很适合作为一个模板。构建文件包括元素,以及其中嵌套的、 和 元素。

    转自:http://www.iteye.com/topic/78973

    Ant是一款类似make的工具,用来编译/运行/打包Java程序。在构建、包装和发布过程中几乎每一件事都可以由Ant的任务来处理。
    Ant的buildfile是用XML写的。编写build.xml时,下面是一个基本的模板。一个构建文件主要由三部分组成:Project、Target、Task。

    <project name="" basedir="" default="">
        <property />
        <taskdef name="" classpathref="" resource="" />
        <target name="all" depends="">
            <copy />
            <javac />
            <jar />
            <exec />
            <customTask />
        </target>
    </project>

    1、project

    每个build.xml有且只能存在一个project。project的基本属性:

    name:项目名称

    default:缺省开始执行的target

    basedir:用于计算所有其他路径的基路径。该属性可以被basedir property覆盖。当覆盖时,该属性被忽略。如果属性和basedir property都没有设定,就使用buildfile文件的父

    目录。

    2、target

    一个项目可以定义一个或多个target。
    一个target是一系列你想要执行的任务,如编译任务、打包任务、混淆任务。
    Ant在执行时以target为单位,执行顺序是从下至上,依次执行;如果某个Target有depends属性,那么就先顺序执行depends属性中的被依赖的target,然后再执行该target。
    一个target只能被执行一次,即使有多个target依赖于它。
    target的基本属性: 

    name:target的名字

    depends:该target依赖关系。用逗号分隔的target的名字列表,也就是依赖表。Ant在执行时以target为单位,target的depends属性又决定了哪个Target先执行,因此我们可以
    通过Target来构造编译顺序。;如果被依赖的target无法运行,这种depends对于指定了依赖关系的target就没有影响。Ant会依照depends属性中target出现的顺序(从左到
    右)依次执行每个target。然而,要记住的是只要某个target依赖于一个target,后者就会被先执行。

    举例:

    <target name="D" depends="C,B,A"/>
    <target name="A"/>
    <target name="B" depends="A"/>
    <target name="C" depends="B"/>
    <target name="E"/>

    假定我们要执行target D。从它的依赖属性来看,你可能认为先执行C,然后B,最后A被执行。错了,C依赖于B,B依赖于A,所以先执行A,然后B,然后C,最后D被执行。

    description: target的描述信息。

    3、Task

    Ant执行的一系列任务是由target构成的,而target又是由数个小的task构成的,task任务是最小的运行单位。
    task主要有两类:Ant内置的task类和自定义task。

    3.1. Ant内置的task类

    (1)Javac

    编译Java源代码,样例:

    <javac 
    srcdir="{src}:{src2}"
    destdir="{build}" 
    includes="mypackage/p1/**,mypackage/p2/**"
    excludes="mypackage/p1/testpackage/**"
    classpath="xyz.jar"
    debug="on"/>
    解释:

    编译{src}和{src2}目录及其子目录下的所有Java文件;多个目录时用":"分割。
    但是package/p1/**,mypackage/p2/**将被编译,而mypackage/p1/testpackage/**将不会被编译。
    Class文件将放在{build}指定的目录下
    classpath表示需要用到的类文件或者目录,仅指我们定义的类库;而bootclasspath参数(启动类库):它已经包含了jre/lib目录下的rt.jar,以及我们自定义的类库。
    debug设置为on表示输出debug信息

    (2)Java

    执行指定的Java类

    A.运行一个类

    <java classname="${main}" classpath="${classpath}"/> 
    解释:classname中指定要执行的类,classpath设定要使用的环境变量;

    B.运行某一特定类,并加上运行参数

    <java fork="true" classname="proguard.ProGuard" classpath="${proguard.classpath}"> 
      <arg line="-libraryjars ${proguard.classpath}"/>  
      <arg line="-injars temp/${app.project}_tmp.jar"/>  
      <arg line="-outjar temp/${app.project}_obf.jar"/>  
      <arg line="-defaultpackage ''"/>  
      <arg line="-dontusemixedcaseclassnames"/>  
      <arg line="-keep public class ${app.midlet}"/> 
    </java>
    解释:fork参数:为true时,在新的JVM实例中运行,不影响当前JVM工作。

    (3)Jar

    将编译好的CLASS文件编译成jar包。样例:

    <jar destfile="{dist}/lib/app.jar"
    basedir="{build}/classes"
    includes="mypackage/test/**"
    excludes="**/Test.class"
    manifest="my.mf"
    />
    解释:将{build}/classes下面的所有文件打包到{dist}/lib/app.jar中,但是包括mypackage/test/所有文件不包括所有的Test.class;manifest属性指定自己的META-INF/MANIFEST.MF文件,而不是由系统生成。

    (4)exec

    用来调用外部程序

    <exec executable="${LIB_PATH}/preverify.exe">
        <arg line="-classpath ${compile.classpath} -d temp/build temp/obfuscate"/>
    </exec>

    (5)File(Directory)类

    A、mkdir

    创建一个目录,如果他的父目录不存在,也会被同时创建。
    例子:

    <mkdir dir="build/classes"/>
    解释:如果build不存在,也会被同时创建

    B、copy

    拷贝一个(组)文件、目录
    例子:
    b1.拷贝单个的文件:

    <copy file="myfile.txt" tofile="mycopy.txt"/>
    b2.拷贝单个的文件到指定目录下
    <copy file="myfile.txt" todir="../some/other/dir"/>
    b3.拷贝一个目录到另外一个目录下
    <copy todir="../new/dir">
    <fileset dir="src_dir"/>
    </copy>
    b4.拷贝一批文件到指定目录下
    <copy todir="../dest/dir">
    <fileset dir="src_dir">
    <include name="**/*.java"/>
    <iexclude name="**/Test.java"/>
    </fileset>
    </copy>
     
    <copy todir="../dest/dir">
    <fileset dir="src_dir" excludes="**/*.java"/>
    </copy>
    b5.拷贝一批文件到指定目录下,将文件名后增加.bak后缀
    <copy todir="../backup/dir">
    <fileset dir="src_dir"/>
    <mapper type="glob" from="*" to="*.bak"/>
    </copy>
    b6.替换拷贝

    <copy todir="temp/build">
       <fileset dir="temp/classes" includes="*.class" />
       <filterset>
            <filter token="@Time@" value="${app.time}"/>
       </filterset>
    </copy>

     解释:<filterset>过滤集,可以将temp/classes文件夹下的存在@Time@标记的文件,替换为变量${app.time}值。这样在完成拷贝的同时也完成了替换任务。

    C、delete

    删除一个(组)文件或者目录

    例子:
    1.删除一个文件

    <delete file="/lib/ant.jar"/>
    2.删除指定目录及其子目录
    <delete dir="lib"/>
    3.删除指定的一组文件
    <delete>
    <fileset dir="." includes="**/*.bak"/>
    </delete>
    4.删除指定目录及其子目录,包括他自己
    <delete includeEmptyDirs="true">
    <fileset dir="build"/>
    </delete>

    D、move

    移动或重命名一个(组)文件、目录
    例子:
    1.移动或重命名一个文件

    <move file="file.orig" tofile="file.moved"/>
    2.移动或重命名一个文件到另一个文件夹下面
    <move file="file.orig" todir="dir/to/move/to"/>
    3.将一个目录移到另外一个目录下
    <move todir="new/dir/to/move/to">
    <fileset dir="src/dir"/>
    </move>
    4.将一组文件移动到另外的目录下
    <move todir="some/new/dir">
    <fileset dir="my/src/dir">
    <include name="**/*.jar"/>
    <exclude name="**/ant.jar"/>
    </fileset>
    </move>
    5.移动文件过程中增加.bak后缀
    <move todir="my/src/dir">
    <fileset dir="my/src/dir">
    <exclude name="**/*.bak"/>
    </fileset>
    <mapper type="glob" from="*" to="*.bak"/>
    </move>
    3.2.自定义task

    自定义task必须保证该类是从Task类继承过来的。在脚本中使用标签为<taskdef> </taskdef>,样例及用法如下:

      <taskdef name="filesorter" classname="com.duomi.ant.FileSorter" classpath="${duomi.home}/ant/pkgutil.jar" /> 
      <target name="main"> 
       <filesorter file="input.txt" tofile="output.txt" /> 
      </target>
    在打包脚本pkgutil.jar中,FileSorter类的源码实现如下:
    public class FileSorter extends Task {
        private File file;
        private File tofile;
    
        // ant在进行任务处理时会调用execute()方法
        public void execute() throws BuildException {
            System.out.println("Sorting file=" + file);
    
            try {
                BufferedReader from = new BufferedReader(new FileReader(file));
                BufferedWriter to = new BufferedWriter(new FileWriter(tofile));
                List allLines = new ArrayList();
    
                // read in the input file
                String line = from.readLine();
    
                while (line != null) {
                    allLines.add(line);
                    line = from.readLine();
                }
    
                from.close();
                // sort the list
                Collections.sort(allLines);
    
                // write out the sorted list
                for (ListIterator i = allLines.listIterator(); i.hasNext();) {
                    String s = (String) i.next();
                    to.write(s);
                    to.newLine();
                }
    
                to.close();
            } catch (FileNotFoundException e) {
                throw new BuildException(e);
            } catch (IOException e) {
                throw new BuildException(e);
            }
        }
    
        // file参数
        public void setFile(File file) {
            this.file = file;
        }
    
        // tofile参数
        public void setTofile(File tofile) {
            this.tofile = tofile;
        }
    }
    
    这个task类FileSorter,在使用时需要设置源文件和输出文件两个参数。Ant通过setter方法将build.xml中用到的属性名与task类中的实现方法相关联,方法就是:自定义task类中的方法名称命名规则为"set"+属性名。属性名是作为字符串来指定的,因此我们的 setter 方法的参数可以是一个字符串。在这样的情况下,Ant 将在展开值所引用的任何属性之后,使用该属性的字符串值来调用我们的方法。但有时我们想把属性的值看作是一种不同的类型。上述示例任务就是这种情况,其中的属性值引用文件系统上的文件,而不只是引用任意的字符串。可以通过将方法参数声明为 java.io.File 类型来容易地做到这点。Ant 将接受属性的字符串值,并把它解释为一个文件,然后传递给我们的方法。

    Ant 能够对其他类型执行类似的转换,比如 boolean 和 int 类型。但如果提供具有相同名称但是具有不同参数的两个方法,Ant 将使用更明确的那一个方法,因此文件类型将优先于字符串类型。


    展开全文
  • Linux命令行与shell脚本编程大全(第2版)

    千次下载 热门讨论 2014-02-20 13:51:01
    第10章 构建基本脚本 10.1 使用多个命令 10.2 创建shell脚本文件 10.3 显示消息 10.4 使用变量 10.4.1 环境变量 10.4.2 用户变量 10.4.3 反引号 10.5 重定向输入和输出 10.5.1 输出重定向 10.5.2 输入...
  • 可用脚本 在项目目录中,可以运行: npm start 在开发模式下运行应用程序。 打开在浏览器中查看它。 如果您进行编辑,则页面将重新加载。 您还将在控制台中看到任何棉绒错误。 npm test 在交互式监视模式下启动...
  • 是网页中视觉元素的基本对象,所有视觉元素通过排列、嵌套等组合方式,完成了; HTML元素属性——CSS样式 用于对HTML元素进行精细的视觉效果的控制,比如:元素的基本大小、元素内字体的大小、元素的位置;每个...
  • AutoTCG简介 1.AutoTCG 是一款在线自动化测试用例设计平台,通过在线创建可视化测试模型,自动生成测试用例 2.AutoTCG采用先进的数学算法,可实现...支持子模型多层嵌套,分解复杂的业务逻辑 2、输入参数设计 分步骤
  • AutoTCG简介 1.AutoTCG 是一款在线自动化测试用例设计平台,通过在线创建可视化测试模型,自动生成测试用例 2.AutoTCG采用先进的数学算法,可实现...支持子模型多层嵌套,分解复杂的业务逻辑 2、输入参数设计 分步骤
  • 一方面,描述提供了映像的布局(分区布局,UBI或LVM卷等),以及可以以任意深度嵌套的方式在分区上安装哪些文件系统。 另一方面,描述提供了一种将文件打包到文件系统中的方式(例如,来自tarball,目录或手册列表...
  • 在《一个fully retryable的rootbuild packer脚本,从0打造matecloudos(2)》中,我们见到了一种用数组化命令字符串和统一compiletarget()的的方式来构建lfs9的compiletc11基础部分,在那文的结尾,我们提到,为了清晰...
  • 支持函数,并且函数是一等公民,可以嵌套声明函数,支持闭包。 支持面向对象特性。 构建和开发 从代码库中克隆下代码以后,可以基于源代码构建一个项目。 或者使用里面原来带的idea项目文件。 后面我将提供Maven的...
  • Labrador 是一个专为微信小程序开发的组件化开发框架。 特性 使用Labrador框架可以使微信开发者工具支持加载海量NPM包 ...自动化测试,非常容易编写单元测试脚本,不经任何额外配置即可自动化测试...
  • 索引嵌套循环联接(INLJ) 该项目是关于使用半流联接(INLJ)实现构建和分析数据仓库原型。 操作数据仓库 数据仓库的操作可以分为三个主要步骤: 创建数据仓库。 使用INLJ算法提取,转换和加载。 使用OLAP查询...
  • Chaco是一个Python绘图应用程序工具包,可帮助编写各种复杂程度的绘图应用程序,从带有硬编码数据的简单脚本到具有复杂数据相互关系和大量交互工具的大型绘图程序。 Chaco可以生成吸引人的静态图进行发布和演示,...
  • 项目介绍 qtum-web-wallet 是量子链推出的网页版钱包。 ... 项目采用vue搭建。...通过网页可以实现钱包的创建备份转账以及智能合约的部署调用功能。...这个vue项目采用了vue-loader,所以...build 构建脚本,还包括开发...
  • 这些模块不需要更改即可构建脚本,而是依靠Cake脚本的标准别名和生命周期事件将脚本集成到环境中。 构建系统 当前,该模块支持: Azure管道 这适用于TFS,Azure管道和Azure DevOps服务器 每个任务的单独时间表记录 ...
  • 与构建系统无关(例如,与“composer”、“drush-make”和手动编写的构建脚本同样有效) 与分支/提交/审查过程无关(例如,适用于个人读/写存储库以及需要拉取请求的 GitHub 存储库) 限制: IO 密集型——执行...
  • 为了构建站点,我使用了一些Gulp构建脚本来加快开发速度。 请注意,使用了CSS预处理程序步骤,因此我可以将媒体查询嵌套在选择器中,而TypeScript用于我需要的少量JavaScript,因为我更喜欢编写ES6语法,并且...
  • IDE自动完成:使用kts构建脚本的好处之一是IDE可以提供自动完成。 这样可以节省多次前往settings.gradle[.kt]脚本或项目结构的旅程,以记住您要查找的模块的名称。 渐进式升级:它支持Groovy gradle,因此,如果您...
  • 在支持YAML的情况下,通过文档字符串和类型注释构建CLI。 ArgBind是一种将参数绑定到函数或命令行或.yml文件的简单方法! 它支持参数范围界定,类似于和类的其他框架。 ArgBind非常小(一个文件中只有约400行代码)...
  • 由于 BorderLayout 可以相互嵌套,因此它们可用于在 MATLAB 中构建具有专业外观的 GUI。 此提交中包含四个文件: BorderLayout.m:布局管理器。 ExampleSimple.m:显示图形窗口中使用的单个 BorderLayout 的小...
  • 本网上超市与管理系统设计是基于HTML语言,嵌套VBScript源代码的ASP编程技术,以IIS为服务平台,实现网上超市系统的构建。本篇论文介绍了网站开发环境和运行平台、ASP、HTML脚本及VBScript。而后台的数据库则使用...
  • 开源报表BIRT开发手册

    2014-02-13 14:50:28
    3.5.2 构建数据集 25 3.5.3 对报表进行布局 25 3.5.4 设定分组数据 25 3.5.5 格式化报表 27 3.6 交叉报表 28 3.6.1 构建数据源 28 3.6.2 构建数据集 28 3.6.3 在报表中加入交叉报表 28 3.6.4 数据准备 29 3.6.5 向...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 207
精华内容 82
关键字:

构建脚本嵌套