Ktor с настройкой прогона Gradle «Не удалось разрешить подстановку значения» из переменных среды - PullRequest
0 голосов
/ 07 марта 2020

Я установил сервер в Ktor с базой данных Postgres в Docker, но решил, что было бы полезно иметь возможность разрабатывать сервер локально, не перестраивая контейнер docker каждый раз.

В application.conf у меня есть

// ...

db {
    jdbcUrl = ${DATABASE_URL}
    dbDriver = "org.postgresql.Driver"
    dbDriver = ${?DATABASE_DRIVER}
    dbUser = ${DATABASE_USER}
    dbPassword = ${DATABASE_PASSWORD}
}

, а в моей базе данных DatabaseFactory у меня есть

object DatabaseFactory {

    private val appConfig = HoconApplicationConfig(ConfigFactory.load())
    private val dbUrl = appConfig.property("db.jdbcUrl").getString()
    private val dbDriver = appConfig.property("db.dbDriver").getString()
    private val dbUser = appConfig.property("db.dbUser").getString()
    private val dbPassword = appConfig.property("db.dbPassword").getString()

    fun init() {
        Database.connect(hikari())

        transaction {
            val flyway = Flyway.configure().dataSource(dbUrl, dbUser, dbPassword).load()
            flyway.migrate()
        }
    }

    private fun hikari(): HikariDataSource {
        val config = HikariConfig()
        config.driverClassName = dbDriver
        config.jdbcUrl = dbUrl
        config.username = dbUser
        config.password = dbPassword
        config.maximumPoolSize = 3
        config.isAutoCommit = false
        config.transactionIsolation = "TRANSACTION_REPEATABLE_READ"
        config.validate()
        return HikariDataSource(config)
    }

    suspend fun <T> dbQuery(block: () -> T): T =
        withContext(Dispatchers.IO) {
            transaction { block() }
        }

}

Я отредактировал конфигурацию Gradle Run со следующей конфигурацией среды:

DATABASE_URL=jdbc:h2:mem:default;DATABASE_DRIVER=org.h2.Driver;DATABASE_USER=test;DATABASE_PASSWORD=password

Когда я запускаю задачу, я получаю эту ошибку: Could not resolve substitution to a value: ${DATABASE_URL}, но если я устанавливаю точку останова в первой строке (private val appConfig) и оцениваю System.getenv("DATABASE_URL"), она разрешается до правильного значения.

Мои вопросы:

  1. Почему это не работает?
  2. Какова наилучшая (или: хорошая) настройка для разработки сервера без упаковки это в контейнере? Желательно без запуска базы данных в другом контейнере.

1 Ответ

0 голосов
/ 08 марта 2020

Я обнаружил, что установка переменных среды для задачи в gradle.config.kts работает:

tasks {
    "run"(JavaExec::class) {
        environment("DATABASE_URL", "jdbc:postgresql://localhost:5432/test")
        environment("DATABASE_USER", "test")
        environment("DATABASE_PASSWORD", "password")
    }
}

(источник: Установка переменных среды в build.gradle.kts )

Что касается того, почему мой первоначальный подход работает только в режиме отладки, я понятия не имею. Что касается вопроса № 2, у меня есть подозрение, что у H2 и Postgres могут быть некоторые различия по синтаксису c, которые могут вызвать проблемы. Запуск контейнера базы данных в фоновом режиме пока работает нормально.

...