- 浏览: 5159838 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
silence19841230:
先拿走看看
SpringBoot2.0开发WebSocket应用完整示例 -
wallimn:
masuweng 写道发下源码下载地址吧!三个相关文件打了个包 ...
SpringBoot2.0开发WebSocket应用完整示例 -
masuweng:
发下源码下载地址吧!
SpringBoot2.0开发WebSocket应用完整示例 -
masuweng:
SpringBoot2.0开发WebSocket应用完整示例 -
wallimn:
水淼火 写道你好,我使用以后,图标不显示,应该怎么引用呢,谢谢 ...
前端框架iviewui使用示例之菜单+多Tab页布局
转自:http://www.cnblogs.com/chenjie0949/p/4757702.html
引言:通过上一篇的论述,我们知道gradle脚本是如假包换的groovy代码,但是这个groovy代码是运行在他的上下文环境里面的,学名叫语义模型。这一篇我们就来看看他的语义模型到底是什么,如何使用。
gradle下载安装
gradle的下载安装并没有什么出乎意料的东西,进入他的官网(http://gradle.org/),下载gradle压缩包,解压,配置bin路径到Path即可。
我安装在c盘下,进入目录C:\gradle-2.4\docs\userguide,打开userguide.pdf文件,这个就是gradle的向导帮助文档。
gradle 语义模型
gradle使用project和task来实现构建的操作,project对应工程,task对应具体的任务,例如编译,压缩,生成帮助文档。我们从userguide.pdf的chap 6中截取一个hello world的Demo来说明,以便有个初步的印象。
创建一个空文件夹Demo,进入,再创建一个build.gradle文件,并写入如下的代码:
task hello {
println "hello world"
}
在命令行中输入 gradle -q hello (-q 参数用于删除冗余的输出),会得到hello world的输出。这一段脚本通过调用project类的task方法,添加了一个新的task在project的task map中,其主键是“hello”,后面跟着一个闭包,里面的代码用于配置这个task的一些属性,相当于初始化这个task,这在下面action的例子中表现最明显。需要注意的是这里的task是关键字,并不是调用某一个方法,在解析的过程中,gradle还需要根据这个关键字进行转化才能生成标准的groovy代码。
在gradle中,project和build.gradle文件是一一对应的,通过这个文件可以配置project的各种属性。project的初始化流程如下:
(1)首先创建一个Settings的实例。(对应 org.gradle.api.initialization 下的 Interface Settings )
(2)如果当前目录有settings.gradle,那么用这个文件来配置Settings实例。
(3)用Settings实例来创建Project的层次关系。
(4)最后,如果项目中存在build.gradle就通过它来执行每个Project。项目中,项目分别依次横向执行,以此子项目一定在父项目之后执行。这个规则可以通过调用evaluationdependsonchildren()或加入一个明确的依赖usingevaluationdependson(String)。
从初始化流程来看,项目之间的层次和依赖关系是通过settings.gradle来配置的,而project的具体任务执行是通过build.gradle来配置的。在build.gradle中可以添加系统提供的task和自定义的task,例如上例就是自定义的task。Project还可以通过添加插件来添加能支持的task。task是由action组成,action可以理解成真正的执行功能的代码块,可以调用doFirst,doLast,leftShift和<<添加action。我们举一个既有配置代码,又有action的例子,看下面的代码:
action的例子
我们用上一个例子中运行task的方法调用hello1,即输入:gradle hello1,输出为:
# gradle hello1
hello world
hello world1
:hello1
hello world1 action
BUILD SUCCESSFUL
Total time: 2.086 secs
可以看出初始化的代码是一定执行的,而Task hello的Action代码,要用gradle指定task才能执行。
从上面的两个例子,我们有了一个最初的印象,gradle构建从上到下的机构顺序应该是project---》task---》action。
每一个Project都通过一个TaskContainer来添加和管理他的task,这是一个task的容器,可以通过调用project的getTasks()方法来获得,不过一般来说大家都通过task关键字来生成task,范例如下:
当然可以直接用project里面的task()方法,使代码更加groovy一点:
一旦task被创建,就可以用它的名字来引用它。
执行结果:
nTask3 -- action
nTask3
:nTask3 UP-TO-DATE
:nTask4
nTask4 -- action
BUILD SUCCESSFUL
Total time: 2.927 secs
上面说Task中具体的执行步骤是通过Action来完成的,Action的结构十分简单,只有一个方法
void execute(T t)
Action在Task中排列成一个队列,依次执行。增加Action有4个方法,上面已经提过,看下面的例子:
输出结果为:
# gradle nTask4
this is config
:nTask4
nTask4 -- doFirst
nTask4 -- add action by <<
nTask4 -- add action by leftShift
nTask4 -- doLast
BUILD SUCCESSFUL
Total time: 2.935 secs
结果一目了然,doFirst最先执行,<<和leftShift的调用时序决定先后顺序,而doLast在最后。能这样做的数据结构,当然是队列,事实也确实如此,在Task接口中,用的是List,而在抽象类AbstractTask中用ArrayList实现的。
Project和Task的属性设置和依赖关系可以参考这篇博客:http://www.blogjava.net/wldandan/archive/2012/07/05/382246.html。
增加一个例子作说明
输出结果为:
# gradle hello
build
build
hello world
:hello
ext properties :ext projectProperties-value
ext properties :chang the extension propertise
chang the extension propertise
this is a msg
BUILD SUCCESSFUL
Total time: 3.028 secs
通过上面的例子说明了动态增加属性的方式。由此可以见,一个Project增加属性和Task都是可行的。当某一类Task需要集体带入的话(比如整个android的编译过程),一个个通过task方法加入就过于麻烦了,解决方案也很简单,我把Project的实例给这一类Tasks的管理类(比如XXManager,在gradle中叫XXPlugin,或者直接叫 java,android),由这个管理类自己添加需要的task,举个例子:
Task已经加入,我们直接使用就可以了,输出结果为:
# gradle showTime showDate
:showTime
Current time is 15:52:15.841
:showDate
Current date is 09/01/2015
BUILD SUCCESSFUL
Total time: 2.132 secs
参考:
负责task转换的类:org.gradle.groovy.scripts.internal.TaskDefinitionScriptTransformer.java
http://www.gradle.org/docs/current/javadoc/org/gradle/api/Project.html
http://www.gradle.org/docs/current/javadoc/org/gradle/api/Task.html
引言:通过上一篇的论述,我们知道gradle脚本是如假包换的groovy代码,但是这个groovy代码是运行在他的上下文环境里面的,学名叫语义模型。这一篇我们就来看看他的语义模型到底是什么,如何使用。
gradle下载安装
gradle的下载安装并没有什么出乎意料的东西,进入他的官网(http://gradle.org/),下载gradle压缩包,解压,配置bin路径到Path即可。
我安装在c盘下,进入目录C:\gradle-2.4\docs\userguide,打开userguide.pdf文件,这个就是gradle的向导帮助文档。
gradle 语义模型
gradle使用project和task来实现构建的操作,project对应工程,task对应具体的任务,例如编译,压缩,生成帮助文档。我们从userguide.pdf的chap 6中截取一个hello world的Demo来说明,以便有个初步的印象。
创建一个空文件夹Demo,进入,再创建一个build.gradle文件,并写入如下的代码:
task hello {
println "hello world"
}
在命令行中输入 gradle -q hello (-q 参数用于删除冗余的输出),会得到hello world的输出。这一段脚本通过调用project类的task方法,添加了一个新的task在project的task map中,其主键是“hello”,后面跟着一个闭包,里面的代码用于配置这个task的一些属性,相当于初始化这个task,这在下面action的例子中表现最明显。需要注意的是这里的task是关键字,并不是调用某一个方法,在解析的过程中,gradle还需要根据这个关键字进行转化才能生成标准的groovy代码。
在gradle中,project和build.gradle文件是一一对应的,通过这个文件可以配置project的各种属性。project的初始化流程如下:
(1)首先创建一个Settings的实例。(对应 org.gradle.api.initialization 下的 Interface Settings )
(2)如果当前目录有settings.gradle,那么用这个文件来配置Settings实例。
(3)用Settings实例来创建Project的层次关系。
(4)最后,如果项目中存在build.gradle就通过它来执行每个Project。项目中,项目分别依次横向执行,以此子项目一定在父项目之后执行。这个规则可以通过调用evaluationdependsonchildren()或加入一个明确的依赖usingevaluationdependson(String)。
从初始化流程来看,项目之间的层次和依赖关系是通过settings.gradle来配置的,而project的具体任务执行是通过build.gradle来配置的。在build.gradle中可以添加系统提供的task和自定义的task,例如上例就是自定义的task。Project还可以通过添加插件来添加能支持的task。task是由action组成,action可以理解成真正的执行功能的代码块,可以调用doFirst,doLast,leftShift和<<添加action。我们举一个既有配置代码,又有action的例子,看下面的代码:
action的例子
task hello { println "hello world"//初始化 }<<{ println "hello world action" } task hello1 { println "hello world1"//初始化 }<<{ println "hello world1 action" }
我们用上一个例子中运行task的方法调用hello1,即输入:gradle hello1,输出为:
# gradle hello1
hello world
hello world1
:hello1
hello world1 action
BUILD SUCCESSFUL
Total time: 2.086 secs
可以看出初始化的代码是一定执行的,而Task hello的Action代码,要用gradle指定task才能执行。
从上面的两个例子,我们有了一个最初的印象,gradle构建从上到下的机构顺序应该是project---》task---》action。
每一个Project都通过一个TaskContainer来添加和管理他的task,这是一个task的容器,可以通过调用project的getTasks()方法来获得,不过一般来说大家都通过task关键字来生成task,范例如下:
task myTask1 task myTask2 { println "myTask2" } task myType3 << { println "myTask2 -- action" } task myTask4("dependsOn": myType3) task myTask5("dependsOn": myType3) { println "myTask5 -- action" }
当然可以直接用project里面的task()方法,使代码更加groovy一点:
task nTask1 task nTask2,{ println "nTask1" } task nTask3,{ println "nTask3" }<<{ println "nTask3 -- action" } task nTask4,{ dependsOn(nTask3) }
一旦task被创建,就可以用它的名字来引用它。
task nTask3,{ println "nTask3" }<<{ println "nTask3 -- action" } task nTask4,{ dependsOn(nTask3) } nTask4 << { println "nTask4 -- action" }
执行结果:
nTask3 -- action
nTask3
:nTask3 UP-TO-DATE
:nTask4
nTask4 -- action
BUILD SUCCESSFUL
Total time: 2.927 secs
上面说Task中具体的执行步骤是通过Action来完成的,Action的结构十分简单,只有一个方法
void execute(T t)
Action在Task中排列成一个队列,依次执行。增加Action有4个方法,上面已经提过,看下面的例子:
task nTask4 { println "this is config"//配置这个task } nTask4 << { println "nTask4 -- add action by <<" //通过 <<来增加action } nTask4.leftShift { println "nTask4 -- add action by leftShift "//通过leftShift方法来增加action,等同 << } nTask4.doFirst { println "nTask4 -- doFirst" //在action队列的最前面插入一个Action } nTask4.doLast { println "nTask4 -- doLast" //在action队列的最最后插入一个Action }
输出结果为:
# gradle nTask4
this is config
:nTask4
nTask4 -- doFirst
nTask4 -- add action by <<
nTask4 -- add action by leftShift
nTask4 -- doLast
BUILD SUCCESSFUL
Total time: 2.935 secs
结果一目了然,doFirst最先执行,<<和leftShift的调用时序决定先后顺序,而doLast在最后。能这样做的数据结构,当然是队列,事实也确实如此,在Task接口中,用的是List,而在抽象类AbstractTask中用ArrayList实现的。
Project和Task的属性设置和依赖关系可以参考这篇博客:http://www.blogjava.net/wldandan/archive/2012/07/05/382246.html。
增加一个例子作说明
//project 自带属性 println Project.DEFAULT_BUILD_DIR_NAME println DEFAULT_BUILD_DIR_NAME //本地属性 String msg = "hello world" //extension 属性 ext{//用 ext 关键字 projectProperties = "ext projectProperties-value" } //直接调用方法 project.getExtensions().create("mMsg", Msg) task hello (){ println msg //初始化 }<<{ println "ext properties :"+projectProperties projectProperties = "chang the extension propertise" println "ext properties :"+projectProperties // println project.property(projectProperties) //无法执行 println project.property("projectProperties") println mMsg.des } class Msg { String des = "this is a msg" int id = 10 }
输出结果为:
# gradle hello
build
build
hello world
:hello
ext properties :ext projectProperties-value
ext properties :chang the extension propertise
chang the extension propertise
this is a msg
BUILD SUCCESSFUL
Total time: 3.028 secs
通过上面的例子说明了动态增加属性的方式。由此可以见,一个Project增加属性和Task都是可行的。当某一类Task需要集体带入的话(比如整个android的编译过程),一个个通过task方法加入就过于麻烦了,解决方案也很简单,我把Project的实例给这一类Tasks的管理类(比如XXManager,在gradle中叫XXPlugin,或者直接叫 java,android),由这个管理类自己添加需要的task,举个例子:
apply plugin: DateAndTimePlugin dateAndTime { timeFormat = 'HH:mm:ss.SSS' dateFormat = 'MM/dd/yyyy' } class DateAndTimePlugin implements Plugin<Project> { void apply(Project project) { project.extensions.create("dateAndTime", DateAndTimePluginExtension) project.task('showTime') << { println "Current time is " + new Date().format(project.dateAndTime.timeFormat) } project.tasks.create('showDate') << { println "Current date is " + new Date().format(project.dateAndTime.dateFormat) } } } class DateAndTimePluginExtension { String timeFormat = "MM/dd/yyyyHH:mm:ss.SSS" String dateFormat = "yyyy-MM-dd" }
Task已经加入,我们直接使用就可以了,输出结果为:
# gradle showTime showDate
:showTime
Current time is 15:52:15.841
:showDate
Current date is 09/01/2015
BUILD SUCCESSFUL
Total time: 2.132 secs
参考:
负责task转换的类:org.gradle.groovy.scripts.internal.TaskDefinitionScriptTransformer.java
http://www.gradle.org/docs/current/javadoc/org/gradle/api/Project.html
http://www.gradle.org/docs/current/javadoc/org/gradle/api/Task.html
发表评论
-
gradle编译错误:Could not find method compile() for arguments
2020-09-19 10:50 18491编译(IDEA+Gradle)一个别人的工程,出现一个 ... -
netty心跳检查之UDP篇
2019-09-15 08:50 2393部分UDP通信场景中,需要客户端定期发送心跳信息,以获取终 ... -
解决tomcat部署两个SpringBoot应用提示InstanceAlreadyExistsException
2019-06-30 11:49 3388两个SpringBoot应用部署在一个Tomcat中,单独 ... -
Eclipse配置MyBatis代码自动化功能
2019-06-29 10:16 17701.安装插件 Eclipse中,Help->Ecli ... -
vue.js中使用qrcode生成二维码
2019-05-20 00:00 7654一、安装包 npm install qrcodejs2 --s ... -
MySQL插入数据报错: Incorrect string value: '\xFD\xDE'
2019-03-31 23:19 1251我MySQL数据库用的uft-8字符集,插入数据一直很正常 ... -
vue自定义组件并双向绑定属性
2019-03-08 22:46 3258做了两个子组件,原理基本一样,一个是使用原生的select ... -
vue-router简单示例
2019-03-05 00:32 1150写个基本完整、稍有借鉴意义的示例,防止自己忘记。 &l ... -
“联通充值系统繁忙”轻松应对
2019-02-06 11:03 3973大过年的,联通充个值一直报“充值系统繁忙”。昨天晚上试了几 ... -
electron.js数据库应用---导航菜单(element-ui+mysql)
2019-02-05 21:33 2364一、环境搭建 略, ... -
electron.js数据库应用---入门(mysql+element-ui)
2019-01-27 23:19 7496我的机器:Windows10,64 ... -
SpringMVC 在controller层中注入成员变量request,是否线程安全
2018-12-17 21:17 2748@RestController public class ... -
VueJS 组件参数名命名与组件属性转化
2018-12-03 00:00 2073转自:https://www.cnblogs.com/meiy ... -
vue-resource拦截器实现token发送及检验自动化
2018-11-16 22:38 3077用了很长时间vue-resource,最近思考$http发 ... -
element-ui试用手记
2018-10-29 20:25 1742element-ui、iviewui都以vue.js为基础 ... -
iviewui中表格控件中render的使用示例
2018-07-07 16:46 9786示例了如何在表格中显示按钮,如何将代码转化为文字。 i ... -
Tomcat错误“Alias name tomcat does not identify a key entry”解决
2018-07-05 21:39 6571申请到了阿里云的证书后,下载、按照说明生成jks格式证书、 ... -
阿里云免费证书“fileauth.txt内容配置错误”解决
2018-07-05 20:43 5297最近研究微信小程序开发,上阿里云申请了个证书,使用文件验证 ... -
springboot2.0跨域配置
2018-07-04 22:11 5284springboot2.0跨域配置: 一、代码 ... -
微信小程序使用code换openid的方法(JAVA、SpringBoot)
2018-07-01 21:52 10398微信小程序序的代码中提示,使用code换取openid,但 ...
相关推荐
2. **版本管理**:通过`gradle/wrapper/gradle-wrapper.properties`中的`distributionUrl`属性,你可以指定所需的Gradle版本。例如,如果要设置为5.2.1版本,可以写成: ``` distributionUrl=...
Gradle项目的语义发布插件另一个gradle-semantic-release-plugin调用Gradle包装器脚本来发布。前提要应用此语义发布插件,您需要满足以下前提条件: 您的Gradle项目应通过gradle.properties (而不是build.gradle或...
`semver-gradle` 是一个针对Gradle构建工具的插件,它引入了语义版本(Semantic Versioning,简称SemVer)的概念,帮助开发者管理项目的版本号。语义版本是一种广泛采用的软件版本命名规范,旨在提供一种明确的版本...
2. **版本兼容性**:Gradle遵循语义化版本(Semantic Versioning)规则,如`X.Y.Z`,其中`X`表示主版本,`Y`表示次版本,`Z`表示补丁版本。主版本升级可能引入不兼容的API更改,次版本升级会添加新功能但保持向后...
该库的具体使用方法可能包括配置AWS凭证,定义Gradle构建脚本,然后调用上传功能将Gradle项目打包并部署到AWS云环境中。由于这里是0.0.6版本,可能不包含完整的文档和示例,因此在实际使用过程中,开发者可能需要...
2. **配置**:在`build.gradle`文件中定义项目属性、插件和任务。 3. **依赖管理**:声明项目所需的库或模块,Gradle会自动下载并管理它们。 4. **执行任务**:运行特定的任务,如`assemble`来打包项目,或`test`来...
**semver-git-plugin** 是一个Gradle插件,专门设计用于帮助开发者按照语义版本(Semantic Versioning,简称semver)规范来管理他们的项目版本。这个插件利用了Git的标签功能,使得版本号的更新自动化且符合semver...
一旦配置好,运行`gradle version`命令就能得到基于当前Git状态的语义版本号。 在`gradle-versioner-master`压缩包中,包含了插件的源码,开发者可以深入研究其内部实现,了解它是如何解析Git信息并生成版本号的。...
该项目为基于讯飞语音SDK的TTS_Online设计源码,包含124个文件,涵盖40个XML配置、37个Java源代码、20个PNG图像、7个SO库、3个Gradle脚本、3个JAR包、2个Git忽略文件、2个属性文件以及1个Markdown文档。该项目实现了...
1. **识别Git标签**:Gitversion-Gradle-plugin首先查找最近的符合语义版本规则(SemVer,即主版本.次版本.修订版本)的Git标签。这些标签通常对应于项目的重大发布、次要功能更新或补丁修复。 2. **计算修订版本**...
2. **build.gradle**:这是Gradle项目的主构建脚本,其中包含了构建项目的配置信息,如依赖项、插件、任务定义等。版本号通常在`build.gradle`的`version`属性中定义。 3. **GitHub Actions**:GitHub Actions是...
GradleKotlinConverter工具通过分析Groovy构建脚本,然后利用Kotlin的语法和语义生成对应的Kotlin DSL脚本。这个过程可能包括转换构建脚本中的任务定义、依赖管理、插件应用以及其他配置。 ### 使用步骤 1. **下载...
这些工具的配置也可以在Gradle脚本中完成: ```groovy tasks { alex { sources { include 'src/main/haskell/ToyCompiler/Lexer.x' } } happy { sources { include 'src/main/haskell/ToyCompiler/Parser.y...
`gradle-release-test`项目可能包含了官方文档中未提及的用法,例如自定义脚本、异常处理等。这些可以通过研究项目源代码来学习和理解。 总结,`gradle-release-test`项目是学习和实践`gradle-release`插件的一个...
3. 版本管理:根据Git或其他版本控制系统中的提交历史自动更新项目的版本号,遵循SemVer(语义化版本)规范。 4. 发布自动化:一旦构建和测试成功,CDeliveryBoy可以自动将新版本推送到Maven中央仓库或其他指定的包...
`build.gradle`是Gradle构建脚本,它定义了项目的构建规则、依赖关系和发布设置。以下是一些关键的配置项: 1. **group**:这是你的项目在Maven仓库中的组织ID,通常与你的域名反向表示,如`com.example`。 2. **...
Git的语义标记脚本 [版本:v0.1.1] 注意:此脚本受启发,并从 (主要是版本比较和语义版本regex)中借鉴了几行。 这是一个脚本,用于根据规范来帮助解决项目中的。 它使用Git标签来跟踪版本和版本之间的提交日志,...
5. **构建与运行脚本**:为了方便用户快速启动和测试项目,可能会包含 `build.gradle`(Gradle)、`pom.xml`(Maven)或其他构建脚本,以及 `Dockerfile`(如果项目支持容器化部署)。 学习 Swagger3 的关键知识点...
"myDemo",这通常代表项目的主代码目录或根目录,可能包含源代码文件(如.java)、配置文件(如XML或.properties)、资源文件(如音频样本、词典文件等)以及可能的构建脚本(如Maven的pom.xml或Gradle的build....
2. **编译器/解释器设计**:理解词法分析、语法分析和语义分析的基本原理。 3. **解析技术**:学习如何使用正则表达式、有限状态自动机等工具进行词法分析,以及如何使用上下文无关文法(CFG)进行语法分析。 4. **...