我正在構建一個需要用戶名和密碼才能訪問外部資源的 Gradle 插件;為了避免明文密碼,我使用插件nu.studer.credentials。
為了測驗我的插件,我使用了 Spock;以下測驗檔案CredentialsFunctionTest.groovy被剝離到僅相關部分,以顯示問題:
package my.gradle.plugin
import org.gradle.testkit.runner.GradleRunner
import spock.lang.Specification
import spock.lang.TempDir
/**
* A simple functional test for the credentials acquisition.
*/
class CredentialsFunctionalTest extends Specification {
@TempDir
private File projectDir
private getBuildFile() {
new File( projectDir, "build.gradle" )
}
private getSettingsFile() {
new File( projectDir, "settings.gradle" )
}
def "can run task"() {
given:
//---> Begin of settings file <------------------------------------------------
settingsFile << """
plugins {
id 'nu.studer.credentials' version '3.0'
}
"""
//---> End of settings file <--------------------------------------------------
//---> Begin of build file <---------------------------------------------------
buildFile << """
plugins {
id 'nu.studer.credentials'
}
String username = credentials.forKey( 'myUser' )
System.out.printf( 'Username: %s%n', username )
String password = credentials.forKey( 'myPassword' )
System.out.printf( 'Password: %s%n', password )
task doSomething {
}
"""
//---> End of build file <-----------------------------------------------------
when:
def runner = GradleRunner.create()
runner.forwardOutput()
runner.withPluginClasspath()
runner.withArguments("doSomething" )
runner.withProjectDir( projectDir )
def result = runner.build()
then:
result.output.contains( "Alive!" )
}
}
“用戶名”和“密碼”的輸出是null——預期測驗會失敗,因為在"Alive!"任何地方都沒有字串的輸出。
當我將檔案settings.gradle和build.gradle(下面的內容)放置到一個空檔案夾中,并使用 呼叫 gradle 時gradle doSomething,我得到了預期的輸出。
settings.gradle:
plugins {
id 'nu.studer.credentials' version '3.0'
}
build.gradle:
plugins {
id 'nu.studer.credentials'
}
String username = credentials.forKey( 'myUser' )
System.out.printf( 'Username: %s%n', username )
String password = credentials.forKey( 'myPassword' )
System.out.printf( 'Password: %s%n', password )
task doSomething {
}
該nu.studer.credentials插件將值存盤在 中$GRADLE_USER_HOME/gradle.encrypted.properties,因此一個假設是 Spock 正在使用不同的臨時用戶和/或主檔案夾。
uj5u.com熱心網友回復:
根據Leonard Brünings在對我的問題的評論中給我的提示,我能夠確定問題并創建解決方案。
正如倫納德所說,問題不在于 Spock 本身,而GradleRuner在于執行測驗的 :這將使用與“常規”Gradle 執行不同的“Gradle 用戶主目錄”。
使用引數-gor --gradle-user-home,這可以改變,但在測驗 Gradle 插件時不推薦這樣做(我們在這里使用 Gradle 測驗 Gradle ...)。
幸運的是,該nu.studer.credentials插件提供了一個配置引數,允許指定保存加密憑據的檔案的位置:-PcredentialsLocation=<path>.
所以解決方案看起來像這樣(我只when:從原始測驗腳本中提取了部分):
…
when:
def runner = GradleRunner.create()
runner.forwardOutput()
runner.withPluginClasspath()
runner.withArguments( "-PcredentialsLocation=%s/.gradle".formatted( System.getProperty( "user.home" ) ), "doSomething" )
runner.withProjectDir( projectDir )
def result = runner.build()
…
當然,測驗仍然失敗,但它現在顯示username和 的正確值password!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/400975.html
上一篇:如何將來自Xamarin應用程式的事件接收到我的ASP.NETWeb應用程式中?
下一篇:enterned_text=enterned_text.get()UnboundLocalError:賦值前參考了區域變數“enterned_text”
