从Gradle构建中排除临时Realm文件 [英] Exclude temporary Realm files from Gradle build

查看:124
本文介绍了从Gradle构建中排除临时Realm文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Realm提供了一个名为"Realm Studio"的数据库查看器,允许用户浏览其数据库的内容.当应用程序用于查看数据库时,它将在数据库目录中创建几个临时"文件,即:

Realm provides a database viewer called "Realm Studio" that allows users to browse the contents of their database. When the application is used to view a database, it creates several "temporary" files in the directory of the database, namely:

  • 一个.realm.lock文件.
  • 一个.realm.note文件.
  • 一个.realm.management目录,其中包含:
    • 一个access_control.control.mx文件.
    • 一个access_control.new_commit.cv文件.
    • 一个access_control.pick_writer.cv文件.
    • 一个access_control.write.mx文件.
    • A .realm.lock file.
    • A .realm.note file.
    • A .realm.management directory containing:
      • A access_control.control.mx file.
      • A access_control.new_commit.cv file.
      • A access_control.pick_writer.cv file.
      • A access_control.write.mx file.

      在Android上下文中,有时会将应用程序附带一个预先存在的Realm数据库,方法是将该数据库放在/assets目录中.因此,当使用Realm Studio查看该数据库时,上述文件将在/assets中生成.由于未知原因,这会导致Gradle在:app:generateDebugAssets任务之后无限期挂起,显然是在:app:mergeDebugAssets任务上.

      In the context of Android, a preexisting Realm database is sometimes shipped with an application by placing the database in the /assets directory. Thus, when the Realm Studio is used to view this database, the aforementioned files are generated in /assets. For unknown reasons, this causes Gradle to hang indefinitely after the :app:generateDebugAssets task, apparently at the :app:mergeDebugAssets task.

      因此,我想找到一种从构建中排除这些文件的方法.我尝试了几种方法,例如:

      As such, i'd like to find a way to exclude these files from the build. I've tried several methods, such as:

      applicationVariants.all { variant ->
          if (variant.buildType.name == 'debug') {
              variant.mergeAssets.doLast {
                  delete(fileTree(dir: variant.mergeAssets.outputDir, includes: ['**/*.cv', '**/*.mx', '**/*.lock', '**/*.note']))
              }
          }
      }
      

      和其他方法,例如:

      sourceSets.main.assets.exclude 'appData.realm.management'
      sourceSets.main.assets.exclude 'appData.realm.management/access_control.control.mx'
      sourceSets.main.assets.exclude 'appData.realm.management/access_control.new_commit.cv'
      sourceSets.main.assets.exclude 'appData.realm.management/access_control.pick_writer.cv'
      sourceSets.main.assets.exclude 'appData.realm.management/access_control.write.mx'
      sourceSets.main.assets.exclude 'appData.realm.lock'
      sourceSets.main.assets.exclude 'appData.realm.note'
      

      无济于事.

      运行构建时,如何指示Gradle排除这些文件?

      How can one instruct Gradle to exclude these files when running a build?

      编辑:来自./gradlew -d app:mergeDebugAssets的重复输出的小片段:

      Small snippet of repeated output from ./gradlew -d app:mergeDebugAssets:

      [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
      [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired on daemon addresses registry.
      [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
      [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
      [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired on daemon addresses registry.
      [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
      [org.gradle.process.internal.health.memory.MemoryManager] Emitting OS memory status event {Total: 8589934592, Free: 2572066816}
      [org.gradle.launcher.daemon.server.health.LowMemoryDaemonExpirationStrategy] Received memory status update: {Total: 8589934592, Free: 2572066816}
      [org.gradle.process.internal.health.memory.MemoryManager] Emitting JVM memory status event {Maximum: 1431830528, Committed: 308281344}
      [org.gradle.process.internal.health.memory.MemoryManager] Emitting OS memory status event {Total: 8589934592, Free: 2567909376}
      [org.gradle.launcher.daemon.server.health.LowMemoryDaemonExpirationStrategy] Received memory status update: {Total: 8589934592, Free: 2567909376}
      [org.gradle.process.internal.health.memory.MemoryManager] Emitting JVM memory status event {Maximum: 1431830528, Committed: 308281344}
      [org.gradle.launcher.daemon.server.Daemon] DaemonExpirationPeriodicCheck running
      [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
      [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired on daemon addresses registry.
      [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
      [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
      [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired on daemon addresses registry.
      [org.gradle.cache.internal.DefaultFileLockManager] Releasing lock on daemon addresses registry.
      [org.gradle.process.internal.health.memory.MemoryManager] Emitting OS memory status event {Total: 8589934592, Free: 2564087808}
      [org.gradle.launcher.daemon.server.health.LowMemoryDaemonExpirationStrategy] Received memory status update: {Total: 8589934592, Free: 2564087808}
      [org.gradle.process.internal.health.memory.MemoryManager] Emitting JVM memory status event {Maximum: 1431830528, Committed: 308281344}
      [org.gradle.process.internal.health.memory.MemoryManager] Emitting OS memory status event {Total: 8589934592, Free: 2560860160}
      [org.gradle.launcher.daemon.server.health.LowMemoryDaemonExpirationStrategy] Received memory status update: {Total: 8589934592, Free: 2560860160}
      [org.gradle.process.internal.health.memory.MemoryManager] Emitting JVM memory status event {Maximum: 1431830528, Committed: 308281344}
      [org.gradle.launcher.daemon.server.Daemon] DaemonExpirationPeriodicCheck running
      [org.gradle.cache.internal.DefaultFileLockManager] Waiting to acquire shared lock on daemon addresses registry.
      [org.gradle.cache.internal.DefaultFileLockManager] Lock acquired on daemon addresses registry.
      ...
      

      推荐答案

      猜测您使用的是Realm Studio的旧版本, 因为根据 issue#842 3.12 应该已修复(基本上是6月18日之后的任何版本) .如果那不能解决问题,那么您最好的办法是在问题#842下报告该问题;或提出一个新的问题,该问题引用了问题#842.还检查文件系统权限,以确保运行gradle的用户可以在那里删除;手动移开文件可能会失去帮助,因此当前用户可以重新创建它们,然后可以删除自己的文件.

      guess you might be using an elder version of Realm Studio, because according to issue #842 and pull request #847, those directories should meanwhile be properly cleaned up - and also report, in case not - instead of stalling. the current version 3.12 should have that fixed (basically any release after the 18th of June). if that should not help, the best you can do is to report it below issue #842; or file a new one issue, which is referencing issue #842. also check the file-system permissions, that the user which runs gradle is permitted to delete there; manually moving files out of the way "might" help, so the current user may re-create them and then subsequently is able to delete his own files.

      这两种使用gradle的方法都是解决方法-因为它首先不应该发生.

      both methods using gradle are workarounds - because it should not happen in the first place.

      为了获取为什么停顿"的更多信息,请在终端中运行以下命令:

      in order to obtain further information "why it stalls", run this command in the terminal:

      ./gradlew -d app:generateDebugAssets
      

      分别在Windows上(问题既不表示操作系统也不表示Realm Studio版本):

      respectively on Windows (the question does neither indicate the OS nor the Realm Studio version):

      gradlew.bat -d app:generateDebugAssets
      

      编辑:甚至可以在每次构建之前删除这些文件:

      edit: one could even delete these files before each build:

      task cleanupRealm(type: Delete) {
          delete project.projectDir.path + "/src/main/assets/.realm.management"
          delete project.projectDir.path + "/src/main/assets/appData.realm.lock"
          delete project.projectDir.path + "/src/main/assets/appData.realm.note"
      }
      
      tasks.whenTaskAdded { task ->
          if (task.name == "preDebugBuild" || task.name == "preReleaseBuild") {
              task.dependsOn cleanupRealm
          }
      }
      

      将任务图更改为:

      :app:checkDebugClasspath
      :app:cleanupRealm
      :app:preBuild
      :app:preDebugBuild
      

      这篇关于从Gradle构建中排除临时Realm文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆