一.背景
使用习惯git,用回svn在Android Studio中忽略文件不好使,所以自己撸一个脚本插件来实现自动化忽略svn中的文件。
ps:在网上找过好多文章,几乎千篇一律都是说在commit提交后就无法配置,本文给出解决方案。
二.解决方案
svn的忽略文件以安卓项目为例,要忽略以下文件或者文件夹。
*.iml
.idea/
/.gradle
gradle/
gradlew
gradlew.bat
local.properties
# 各个模块下build文件夹
app/build/
使用git很容易配置忽略规则,在项目.gitignore文件中根据需求写入相应配置即可,但是使用svn情况下是无法根据配置文件忽略文件,只能在配置中添加忽略规则。
2.1 Ignored Files 配置
在Android Studio中setting -> Version Control -> Ignored Files 中配置。
but,每次checkout svn上的工程项目都需要重新配置,本着程序是来提高效率的,想着可不可以编写脚本使整个自动配置。
2.2 Ignored Files 原理
在Android Studio 配置 Ignored Files 规则后在项目根目录.idea/workspace.xml文件<component name="ChangeListManager"> 里面保存添加的忽略规则。
2.3 Ignored Files 自动化
so,我们只要在workspace.xml添加相应字段即可达到在setting中配置忽略规则的效果。
import groovy.xml.XmlUtil
def ignoreSvn() {
try {
def ignoredMap = [
["name": "path", value: ".idea/"],
["name": "path", value: ".gradle/"],
["name": "path", value: "gradle/"],
["name": "path", value: "build/"],
["name": "path", value: "gradlew"],
["name": "path", value: "gradlew.bat"],
["name": "path", value: "local.properties"],
["name": "mask", value: "*.iml"],
]
rootDir.list().each { if (file("$rootDir/$it/build").exists()) { ignoredMap.add(["name": "path", "value": "$it/build/"]) } }
File workspaceFile = file("$rootDir/.idea/workspace.xml")
def workspace = new XmlParser().parseText(workspaceFile.getText())
def changeListManager = workspace.component.find { it.attribute("name") == "ChangeListManager" }
if (changeListManager == null) { changeListManager = workspace.appendNode("component", ["name": "ChangeListManager"]) }
ignoredMap.each {
def ignoredNode = changeListManager.ignored.find { ignoredNode -> ignoredNode.attribute(it.name) == it.value }
if (ignoredNode == null) { changeListManager.appendNode("ignored", ["${it.name}" : "${it.value}"]) }
}
PrintWriter pw = new PrintWriter(workspaceFile)
pw.write(XmlUtil.serialize(workspace))
pw.close()
} catch (Exception e) { println "svn ignore error, meesage = ${e.message}" }
}
ignoreSvn()
2.4 脚本使用
将上面脚本复制到项目根目录build.gradle中底部即可实现自动配置svn忽略规则,每次同步gradle都会检查规则并配置。
其中脚本中ignoreMap保存了忽略规则,path描述目录和文件,mask只能描述文件(这一点比不上.gitignore)
注意:由于脚本在build.gradle中配置阶段执行,这是修改workspace.xml文件是无法立即生效,需要gradle sync now同步一遍才生效。
三. svn忽略规则插件
插件已经编写完成,按照一下在根目录build.gradle配置即可。
- 在
repositories添加jcenter() - 在
dependencies添加classpath 'com.owm.svn:ignore:1.0.2' - 在
build.gradle顶部应用插件apply plugin: 'com.owm.svn.ignore'
apply plugin: 'com.owm.svn.ignore'
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.2'
classpath 'com.owm.svn:ignore:1.0.2'
}
allprojects {
repositories {
google()
jcenter()
}
}
将gradle 同步两下就可以了。