gradle腳本
『壹』 minecraft我的世界gradle構建,總是失敗,求告訴詳細教程。不要發網址,要會的人。不會的
最近在項目中遇到一個不大,但是還蠻煩人的問題,在Maven的約定中,一個標准java項目的代碼結構如下:
project
--src
--main
--java
--resources
--test
--java
--resources
當『gradle idea』構建intelliJ項目文件時,會自動幫忙設置好所有的Source Root,Test Source Root。但是,在我工作的部門中,我們希望可以把測試分為unit,intg2個類別,這樣可以更加容易區分測試的目的,同時提供了Build Pipeline分別運行不同類別測試的能力。因此,我們部門內的標准Java項目結構如下:
project
--src
--main
--java
--resources
--test
--common
--java
--unit
--java
--resources
--intg
--java
--resources
有了這個目錄結構之後我們剩下2個問題要解決:
1. 如何區分運行IntegrationTest和Unit Test
2. 如何保證『gradle idea』以後,無需重新設置Test Source Root。因為gradle不具備識別新的代碼結構的能力。
如何寫一個Gradle Plugin
語言:
Java,Groovy,Scala都可,推薦用Groovy,畢竟Gradle本質上來說就是一個用Groovy寫的DSL,使用Groovy可以更一致一點。
注入方式:
Gradle支持3種形式的定製Plugin注入:
1. 直接把Plugin源代碼直接寫在Build Script裡面。
2. 把Pluigin源代碼寫到rootProjectDir/buildSrc/src/main/groovy目錄下
3. 用一個單獨的project來寫Plugin源代碼,然後以jar依賴的形式注入項目。
個人覺得,都想到要自己寫一個Plugin了,那麼一定是有多個項目公用這個Plugin了,否則的話,直接把Plugin的代碼直接寫到腳本里就好了。因此,要定製Plugin,在我看來,一定是需要以一個單獨的jar形式注入的。
寫project-structure Plugin:
在Gradle中,寫一個Plugin非常簡單,首先,添加項目依賴,我使用Groovy來寫插件,所以添加了localGroovy依賴。
Gradle代碼
apply plugin: 'groovy'
dependencies {
compile gradleApi()
compile localGroovy()
}
然後寫Plugin的實現代碼,實現代碼只需要實現Plugin<Project>介面即可,在我的實現代碼中,做了兩件事,一是定製了項目的代碼結構,二是添加了integrationTest Task,該Task只運行*IntegrationTest.class, 這樣可以在Build Pipeline分階段運行Unit Test和IntegrationTest。
Groovy代碼
import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.testing.Test
class ProjectStructurePlugin implements Plugin<Project> {
@Override
void apply(Project project) {
project.logger.info "Configuring Project Structure for $project.name"
project.configurations {
integrationTestCompile { extendsFrom testCompile }
integrationTestRuntime { extendsFrom integrationTestCompile, testRuntime }
}
configureSourceSets(project)
addIntegrationTestTask(project)
}
private void addIntegrationTestTask(Project project) {
Test intgTest = project.getTasks().create("integrationTest", Test.class);
intgTest.testClassesDir = project.sourceSets.integrationTest.output.classesDir
intgTest.includes = ["**/*IntegrationTest.class"]
intgTest.inputs.dir 'src'
intgTest.outputs.dir project.sourceSets.integrationTest.output.classesDir
project.check.dependsOn project.integrationTest
intgTest.dependsOn project.test
}
private void configureSourceSets(Project project) {
project.sourceSets {
test {
java {
srcDir 'src/test/unit/java'
srcDir 'src/test/common/java'
}
resources {
srcDir 'src/test/unit/resources'
}
}
integrationTest {
java {
srcDir 'src/test/intg/java'
srcDir 'src/test/common/java'
}
resources {
srcDir 'src/test/intg/resources'
}
compileClasspath = project.sourceSets.main.output + project.sourceSets.test.output + project.configurations.integrationTestCompile
runtimeClasspath = output + compileClasspath + project.configurations.integrationTestRuntime
}
}
}
}
接著,在項目的src/main/resources/META-INF/gradle-plugins目錄下,創建一個文件:<plugin-name>.properties,在該文件中指定Plugin的實現類:
Java代碼
implementation-class=com.xianlinbox.plugins.ProjectStructurePlugin
在項目中使用該Plugin
首先,需要在build.gradle腳本中引入該Plugin的jar包依賴,可以是以文件的形式,當然個人更推薦的是把jar包發布到Maven庫中,以Maven依賴的形式的注入,本例中使用的是本地文件依賴:
Groovy代碼
buildscript {
dependencies {
classpath fileTree(dir: 'libs', include: '*.jar')
}
}
然後,注入編寫的插件,注意,該插件必須和java plugin一起使用,因為其中使用到SourceSets屬性是從該插件中引入進來的:
Groovy代碼
apply plugin: 'java'
apply plugin: 'project-structure'
有了這個插件之後,就可以通過『gradle test』和『gradle integrationtTest』區別運行UnitTest和IntrgrationTest了。
最後,解決自動設置Test Source Root的問題,只需要在build.gradle為ideaMole Task增加識別Test Source Root的能力即可:
Groovy代碼
apply plugin: 'idea'
...
idea {
mole {
testSourceDirs += file('src/test/intg/java')
testSourceDirs += file('src/test/intg/resources')
}
}
當然,我們也可以把它寫到Plugin中去,在設置為Project-Structrue之後:
Groovy代碼
......
compileClasspath = project.sourceSets.main.output + project.sourceSets.test.output + project.configurations.integrationTestCompile
runtimeClasspath = output + compileClasspath + project.configurations.integrationTestRuntime
project.idea {
mole {
testSourceDirs = testSourceDirs + new File('src/test/intg/java') + new File('src/test/intg/resources')
}
}
1、安裝
Gradle安裝和Maven一樣方便,只需要,下載(http://www.gradle.org/downloads )==》解壓==》配置環境變數(GRADLE_HOME & PATH),配置好環境變數之後記得使用 source命令使新的環境變數生效。配置成功之後,可以在命令行通過 「gradle -v"驗證是否安裝成功。
2、Gradle編譯Maven風格的java項目
首先,在項目根目錄創建"build.gradle"文件,編譯java項目需要使用gradle的java插件
Groovy代碼
apply plugin: 'java'
,因為要集成maven的功能,需要添加maven插件
Groovy代碼
apply plugin: 'maven'[
。
接著,配置項目的Repository,風格如下
Groovy代碼
repositories{
mavenCentral();
}
,上面例子使用的是默認的maven的中央庫,如果想用自己的本地庫,可通過如下方式配置
Groovy代碼
def localMavenRepo = 'file://' + new File(System.getProperty('user.home'), '.m2/repository').absolutePath
repositories {
// Use local Maven repo location. We don't need this if we only want to install
// an artifact, but we do need it if we want to use dependencies from the local
// repository.
mavenRepo urls: localMavenRepo
mavenCentral()
}
再然後,配置項目依賴的第三方庫,配置模板如下:
Groovy代碼
dependencies{
compile group: '<group-id>',name:'<artifact-id>',version:'<version>'
}
,舉個例子,假設項目依賴了4.10版本的junit,那麼配置就是
Groovy代碼
compile group: 'junit',name:'junit',version:'4.10'
另外Depencies還可以按如下方式簡寫
Groovy代碼
compile '<group-id>:<artifact-id>:<version>'
例子
Groovy代碼
compile 'junit:junit:4.10'
最後,如何把自己的項目發布到Repository中,
Groovy代碼
uploadArchives {
repositories {
mavenDeployer {
repository(url: "file://localhost/tmp/myRepo/")
}
}
『貳』 如何使用gradle構建工具打包groovy腳本成jar文件
准備工作安裝 gradle, groovy。
要使用gradle的groovy plugin 來打包groovy 腳本,項目結構。
目錄 含義
src/main/java Java 代碼
src/main/resources Java需要的資源文件
src/main/groovy Groovy代碼,也可以包含Java代碼
src/test/java Java 測試代碼
src/test/resources 測試需要的資源文件
src/test/groovy Groovy測試需要的資源文件
src/sourceSet/java Java代碼源
src/sourceSet/resources 資源文件源
src/sourceSet/groovy Groovy代碼源
我們只需要編譯打包groovy腳本 所以只需要創建 src/main/groovy目錄結構。例子:
gradle_groovy_archive項目 結構是:
gradle_groovy_archive
創建helloWorld.groovy腳本,代碼如下:
package hello
println 'Gradle compile groovy'
創建Gradle構建文件:
apply plugin: 'groovy'
apply plugin: 'maven'
group = 'com.hello'
archiveBaseName = 'hello'
version = '0.1-SNAPSHOT'
defaultTasks 'clean', 'jar'
configurations {
deployerJars
}
repositories {
mavenCentral()
}
dependencies {
//使用本地groovy環境
groovy localGroovy()
//groovy group: 'org.codehaus.groovy', name: 'groovy', version: '1.8.6'
compile fileTree( dir: 'lib', include: ['*.jar'])
deployerJars 'org.apache.maven.wagon:wagon-webdav-jackrabbit:1.0-beta-7'
}
sourceSets {
main {
groovy {
srcDir 'src/main/groovy'
}
}
}
uploadArchives {
repositories.mavenDeployer {
uniqueVersion = false
configuration = configurations.deployerJars
repository(id : repositoryId, url : repositoryUrl) {
authentication (userName : 'deployment', password : 'deployment')
proxy()
}
}
}
創建構建文件屬性文件:
//根據不同情況修改
repositoryId=ND
repositoryUrl=ND
systemProp.http.proxyHost=ND
systemProp.http.proxyPort=8080
systemProp.http.proxyUser=ND
systemProp.http.proxyPassword=ND
在命令行中 敲 gradle 運行,會自動運行 defaultTasks,clean 和 jar,會把 所有groovy下的腳本打成jar包。
『叄』 gradle.properties文件在哪
通常在項目的根目錄,在Android Studio 創建一個項目的時候,根目錄下會生成gradle.properties和local.properties文件。
properties的數據格式:
採用鍵值對的方式,寫法:key=value
(3)gradle腳本擴展閱讀
項目結構
1、app/build:app模塊編譯輸出的文件。
2、app/libs: 放置引用的類庫文件。
3、app/src: 放置應用的主要文件目錄。
4、app/src/androidTest:單元測試目錄。
5、app/src/main:主要的項目目錄和代碼。
6、app/src/main/assets:放置原生文件,裡面的文件會保留原有格式,文件的讀取需要通過流。
7、app/src/main/java:項目的源代碼。
8、build:系統生成的文件目錄。
9、gradle: wrapper的jar和配置文件所在的位置。
10、.gitattributes:用於設置文件的對比方式。
11、.gitignore: 忽略的文件或者目錄。
12、build.gradle:項目的gradle編譯文件。
13、gradle.properties: gradle相關的全局屬性設置。
14、gradlew: 編譯腳本,可以在命令行執行打包。
15、gradlew.bat:windows下的gradle wrapper可執行文件。
16、local.properties:配置SDK/NDK所在的路徑。
17、MyApplication.iml:保存該模塊的相關信息。
18、README.md:文本編輯器,記錄一些相關信息。
19、settings.gradle:設置相關的gradle腳本。
20、External Libraries:項目依賴的庫,編譯時自動下載。
『肆』 如何更改gradle默認執行順序
1
gradle的解析順序:rootproject 的setting.gradle,然後是rootproject的build.gradle,然後是各個subproject。所以project下的build.gradle會先於app下的build.gradle。
2
在build.gradle中,我們可以通過apply plugin: 引入插件,也可以通過 apply from .gradle引入其他gradle腳本中的函數定義或task等
3
你說的check,clean實際是task,一般hook我們指的是gradle的生命周期:
『伍』 如何在android studio中查看當前使用的gradle版本和gradle插件版本
Gradle是可以用於Android開發的新一代的 Build System, 也是 Android Studio默認的build工具。
Gradle腳本是基於一種JVM語言 -- Groovy,再加上DSL(領域特定語言)組成的。
因為Groovy是JVM語言,所以可以使用大部分的Java語言庫。所謂DSL就是專門針對Android開發的插件,比如標准Gradle之外的一些新的方法(Method)、閉包(Closure)等。
由於Gradle的語法足夠簡潔,而且可以使用大部分的java包,當之無愧地成為新一代 Build System。
使用Android Studio新建一個工程後,默認會生成兩個build.gralde文件,一個位於工程根目錄,一個位於app目錄下。還有另外一個文件 --settings.gradle。
根目錄下的腳本文件是針對mole的全局配置,它的作用閾所包含的所有 mole 是通過settings.gradle來配置。
app文件夾就是一個mole,如果在當前工程中添加了一個新的mole -- lib,就需要在settings.gralde文件中包含這個新的mole。
gradle腳本的基本結構
用我現在的工程舉例來說,根目錄的build.gradle的內容如下所示:
[plain] view plainprint?
// Top-level build file where you can add configuration options common to all sub-projects/moles.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.0.0-rc4'
// NOTE: Do not place your application dependencies here; they belong
// in the indivial mole build.gradle files
}
}
allprojects {
repositories {
jcenter()
maven {
url 'http://mvnrepo.xxx.com/mvn/repository'
}
}
}
classpath 'com.android.tools.build:gradle:1.0.0-rc4'就是Android特有的插件,maven倉庫位於通過方法jCenter() 獲取,這也是默認的maven倉庫。當然也可以添加額外的maven倉庫地址,例如以上文件中的
maven {
url 'http://mvnrepo.xxx.com/mvn/repository'
}
『陸』 為什麼應該選擇gradle
Ø gradle對多工程的構建支持很出色,工程依賴是gradle的第一公民。
Ø gradle支持局部構建。
Ø 支持多方式依賴管理:包括從maven遠程倉庫、nexus私服、ivy倉庫以及本地文件系統的jars或者dirs
Ø gradle是第一個構建集成工具(the first build integration tool),與ant、maven、ivy有良好的相容相關性。
Ø 輕松遷移:gradle適用於任何結構的工程(Gradle can adapt to any structure you have.)。你可以在同一個開發平台平行構建原工程和gradle工程。通常要求寫相關測試,以保證開發的插件的相似性,這種遷移可以減少破壞性,盡可能的可靠。這也是重構的最佳實踐。
Ø gradle的整體設計是以作為一種語言為導向的,而非成為一個嚴格死板的框架。
Ø 免費開源
gradle提供了什麼
1.一種可切換的,像maven一樣的基於約定的構建框架,卻又從不鎖住你(約定優於配置)
Switchable, build-by-convention frameworks a la Maven. But we never lock you in!
2. 強大的支持多工程的構建
3. 強大的依賴管理(基於Apache Ivy),提供最大的便利去構建你的工程
Language for dependency based programming
4. 全力支持已有的Maven或者Ivy倉庫基礎建設
5. 支持傳遞性依賴管理,在不需要遠程倉庫和pom.xml和ivy配置文件的前提下
6 基於groovy腳本構建,其build腳本使用groovy語言編寫
7 具有廣泛的領域模型支持你的構建A rich domain model for describing your build.
『柒』 gradle scripts裡面都有什麼文件
gradle編譯相關的腳本
『捌』 如何用gradle執行ionic build android
如何用gradle執行ionic build android –release的時候自動簽名
假設android的platform和keystore已經有了,我們可以看到如下目錄結構
其中release-signing.properties這個時候應該是沒有的,現在我們新建一個release-signing.properties
storeFile=YiShangpu.keystore
key.store.password=your password
key.alias=YiShangpu
key.alias.password=your password
『玖』 如何在python腳本中嵌入gradle 命令
首先下載安裝python,建議安裝2.7版本以上,3.0版本以下,由於3.0版本以上不向下兼容,體驗較差。
打開文本編輯器,將文件保存成 .py格式,editplus和notepad支持識別python語法。
腳本第一行一定要寫上 #!usr/bin/python
表示該腳本文件是可執行python腳本
如果您的python目錄不在usr/bin目錄下,則替換成當前python執行程序的目錄
編寫完腳本之後注意調試、可以直接用editplus調試。調試方法可自行網路。腳本寫完之後,打開CMD命令行,前提是python 已經被加入到環境變數中,如果沒有加入到環境變數,請網路
在CMD命令行中,輸入 「python」 + 「空格」,即 」python 「;
將已經寫好的腳本文件拖拽到當前游標位置,然後敲回車運行即可
『拾』 運行與Gradle咕嚕問題,怎麼解決
build.gradle
//設置腳本的運行環境
buildscript {
//支持java 依賴庫管理(maven/ivy),用於項目的依賴。
repositories {
mavenCentral()
}
//依賴包的定義。支持maven/ivy,遠程,本地庫,也支持單文件
dependencies {
classpath 'com.android.tools.build:gradle:0.4'
}
}
//聲明構建的項目類型,這里當然是android了
apply plugin: 'android'
//設置編譯android項目的參數
android {
compileSdkVersion 17
buildToolsVersion "17"
defaultConfig {
minSdkVersion 8
targetSdkVersion 17
}
//Android默認配置
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
//測試所在的路徑,這里假設是tests文件夾,沒有可以不寫這一行
instrumentTest.setRoot('tests')
}
//這個是解決lint報錯的代碼
lintOptions {
abortOnError false
}
/**
* 簽名設置
*/
signingConfigs {
myConfigs {
storeFile file("簽名文件地址")
keyAlias "..."
keyPassword "..."
storePassword "..."
}
}
/**
* 混淆設置
*/
buildTypes {
release {
signingConfig signingConfigs.myConfigs
runProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
/**
* 渠道打包(不同包名)
*/
proctFlavors {
qqqq {
applicationId = '包名'
}
hhhhh {
applicationId='包名'
}
}
}
/**
* .so文件的導入
*/
task NativeLibs(type: Copy) {
from fileTree(dir: 'libs', include: 'armeabi/*.so') into 'build/lib'
}
tasks.withType(Compile) {
options.encoding = "UTF-8"
}
tasks.withType(Compile) {
compileTask -> compileTask.dependsOn NativeLibs
}
clean.dependsOn 'cleanCopyNativeLibs'
tasks.withType(com.android.build.gradle.tasks.PackageApplication) { pkgTask ->
pkgTask.jniFolders = [new File(buildDir, 'lib')]
}
//依賴庫
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
gradle 作為構建工具,能夠很方便的使用本地jar包,以下為使用的代碼塊。
ependencies {
//單文件依賴
compile files('libs/android-support-v4.jar')
//某個文件夾下面全部依賴
compile fileTree(dir: 'libs', include: '*.jar')
}
android {
}
gradle 同時支持maven,ivy,由於ivy我沒用過,所以用maven 作為例子,以下為代碼塊:
repositories {
//從中央庫裡面獲取依賴
mavenCentral()
//或者使用指定的本地maven 庫
maven{
url "file://F:/githubrepo/releases"
}
//或者使用指定的遠程maven庫
maven{
url "遠程庫地址"
}
}
dependencies {
//應用格式: packageName:artifactId:version
compile 'com.google.android:support-v4:r13'}
android {
}
對於項目依賴 android library的話,就不是依賴一個jar,那麼簡單了,在這里需要使用gradle mulit project 機制。在過去,android library並沒有一個很好的包管理方式,簡單來說,在gradle出現以前,官方並沒有一種用於管理android library 依賴包的方式,一般我們都是直接下載別人的android library project 源碼進行集成,而對於第三方的android-maven-plugin 用的是apklib 格式。
而現在,官方終於推出一種android library的打包格式,擴展名為*.aar。前面提到,目前android gradle插件並不支持本地直接使用*.aar文件,不過,支持包管理庫的引用方式,下面,我為大家說一下,怎麼對android library 發布使用。
打包android library
對android library 進行打包直接在library項目下面使用gradle build 即可,然後,你就會在 build/libs 目錄下看到兩個*.aar文件,一個debug包用的,一個是release 下用的,看個人需求使用,這里我們用的是release 版本的 .aar 文件。