And*_*rew 42 gradle build.gradle android-gradle-plugin
我正在尝试让我的gradle构建使用堆栈溢出中的示例在控制台提示输入密码
当我有一个例如:
def password = System.console().readLine("Enter keystore password ")
Run Code Online (Sandbox Code Playgroud)
当我跑步时,我得到了错误
Cannot invoke method readLine() on null object
Run Code Online (Sandbox Code Playgroud)
似乎控制台出现了null
.我读过这个需要java 6,如果我进入命令提示符并键入java -version
我正在运行Java(TM)SE运行时环境(版本1.6.0_27-b07).
在Gradle的Github存储库中正在跟踪此问题:无法使用带有Gradle守护程序的System.console().
Jas*_* Tu 45
出于某种原因,在守护进程模式下运行gradle会导致空控制台对象.如果指定适当的命令行标志,
./gradlew assembleRelease --no-daemon
它会工作的.
Mar*_* L. 20
我在https://www.timroes.de/2014/01/19/using-password-prompts-with-gradle-build-files找到了一个解决方案,稍作修改.然而,所有的积分都归蒂姆罗斯!
gradle.taskGraph.whenReady { taskGraph ->
if(taskGraph.hasTask(':app:assembleRelease')) {
def storePass = ''
def keyPass = ''
if(System.console() == null) {
new SwingBuilder().edt {
dialog(modal: true, title: 'Enter password', alwaysOnTop: true, resizable: false, locationRelativeTo: null, pack: true, show: true) {
vbox { // Put everything below each other
label(text: "Please enter store passphrase:")
def input1 = passwordField()
label(text: "Please enter key passphrase:")
def input2 = passwordField()
button(defaultButton: true, text: 'OK', actionPerformed: {
storePass = input1.password;
keyPass = input2.password;
dispose();
})
}
}
}
} else {
storePass = System.console().readPassword("\nPlease enter store passphrase: ")
keyPass = System.console().readPassword("\nPlease enter key passphrase: ")
}
if(storePass.size() <= 0 || keyPass.size() <= 0) {
throw new InvalidUserDataException("You must enter the passwords to proceed.")
}
storePass = new String(storePass)
keyPass = new String(keyPass)
android.signingConfigs.release.storePassword = storePass
android.signingConfigs.release.keyPassword = keyPass
}
}
Run Code Online (Sandbox Code Playgroud)
在某个gradle文件中的某个位置,您可以定义发布签名的配置.
android {
...
signingConfigs {
...
release {
storeFile file(System.getProperty("user.home")+"\\android-key")
storePassword ''
keyAlias "standard"
keyPassword ''
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
(别忘了import groovy.swing.SwingBuilder
.)
关于第二部分,您还可以看看如何使用Gradle创建一个发布的签名apk文件?
And*_*rew 16
好吧,之所以不起作用的原因是愚蠢的,但万一其他人遇到它,我以为我会发帖.
我通过android studio运行任务,并没有意识到控制台对象总是为空.从命令行运行时,"command"对象不为null,它可以正常工作.
当属性出现时,System.getConsole()
从Gradle执行,或者从IntelliJ或Android Studio等IDE执行时,它返回.因此,例如,变得不可能.org.gradle.daemon
true
null
System.console().readLine()
此外,默认情况下,从Gradle 3.0 gradle.daemon
开始.
然后System.getConsole()
使用ant.input
类似的方法代替使用我的替代方法的变通方法:
task avoidNullOnConsole << {
ant.input(message: 'Enter keystore password:', addproperty: 'userInputPassword', defaultValue : '1234')
def password = ant.properties.userInputPassword
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,ant.input
显示message
并添加用户输入ant.properties
作为属性名称使用中定义的值addProperty
.如果没有用户输入,则default
使用属性中定义的值.
一旦执行,您可以使用ant.properties.yourProperty
或获取用户输入ant.properties['yourProperty']
.
您可以在ant.input
此处检查其余属性.
注意:如果要ant.input
多次使用,请考虑到无法覆盖和现有属性,因此addProperty
每个属性必须不同.
请查看此博客文章(https://www.timroes.de/2013/09/22/handling-signing-configs-with-gradle/).
它描述了处理签名配置的多种方法,其中之一就是关于密码的控制台输入的问题.
要解决此问题,我将标准输入流用作下一个:
println "Enter keystore password"
def password = System.in.newReader().readLine()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
17712 次 |
最近记录: |