Gradle:强制自定义任务始终运行(无缓存)

2024-01-03

我编写了一个自定义 Gradle 任务来处理路径可配置的文件系统上的一些依赖项解析。我希望这种类型的任务始终运行。我猜它们似乎只运行一次,因为输入似乎永远不会改变。

我知道使用configurations { resolutionStrategy.cacheChangingModulesFor 0, 'seconds' }有效地禁用缓存,但我只希望它适用于非常特定的任务。我也知道--rerun-tasks命令行提示符,也类似。两者都不是最好的解决方案,必须有一种方法可以在自定义任务定义中正确设置它。

以下是我当前的实现。我还有一个之前的版本,其中前 3 个 def String 语句是 @Input 带注释的 String 声明。

class ResolveProjectArchiveDependency extends DefaultTask {
    def String archiveFilename = ""
    def String relativeArchivePath = ""
    def String dependencyScope = ""

    @OutputFile
    File outputFile

    @TaskAction
    void resolveArtifact() {
        def arcFile = project.file("dependencies/"+dependencyScope+"/"+archiveFilename)
        def newArcFile = ""

        if(project.hasProperty('environmentSeparated') && project.hasProperty('separatedDependencyRoot')){
            println "Properties set denoting the prerelease environment is separated"
            newArcFile = project.file(project.ext.separatedDependencyRoot+relativeArchivePath+archiveFilename)
        }   else {
            newArcFile = project.file('../../'+relativeArchivePath+archiveFilename)
        }

        if(!newArcFile.isFile()){
            println "Warn: Could not find the latest copy of " + archiveFilename + ".."

            if(!arcFile.isFile()) {
                println "Error: No version of " + archiveFilename + " can be found"
                throw new StopExecutionException(archiveFilename +" missing")
            }
        }

        if(!arcFile.isFile()) {
            println archiveFilename + " jar not in dependencies, pulling from archives"
        } else {
            println archiveFilename + " jar in dependencies. Checking for staleness"

            def oldHash = generateMD5(new File(arcFile.path))
            def newHash = generateMD5(new File(newArcFile.path))

            if(newHash.equals(oldHash)) {
                println "Hashes for the jars match. Not pulling in a copy"
                return
            }
        }

        //Copy the archive
        project.copy {
            println "Copying " + archiveFilename
            from newArcFile
            into "dependencies/"+dependencyScope
        }
    }

    def generateMD5(final file) {
       MessageDigest digest = MessageDigest.getInstance("MD5")
       file.withInputStream(){is->
       byte[] buffer = new byte[8192]
       int read = 0
          while( (read = is.read(buffer)) > 0) {
                 digest.update(buffer, 0, read);
             }
         }
       byte[] md5sum = digest.digest()
       BigInteger bigInt = new BigInteger(1, md5sum)
       return bigInt.toString(16)
    }
}

这是该任务的使用示例:

task handleManagementArchive (type: com.moremagic.ResolveProjectArchiveDependency) {
    archiveFilename = 'management.jar'
    relativeArchivePath = 'management/dist/'
    dependencyScope = 'compile/archive'
    outputFile = file('dependencies/'+dependencyScope+'/'+archiveFilename)
}

您可以通过设置来实现这一点outputs.upToDateWhen { false }关于任务。

这可以在您的build.gradle file:

handleManagementArchive.outputs.upToDateWhen { false }

也可以在自定义任务的构造函数中完成。

ResolveProjectArchiveDependency() {
    outputs.upToDateWhen { false }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gradle:强制自定义任务始终运行(无缓存) 的相关文章

  • 使用 Gradle 构建 Kotlin 项目有时会失败并出现 NoClassDefFoundError

    我无法可靠地重现这个问题 因为它是零星的 这就是我构建时得到的Kotlin项目与Gradle Could not perform incremental compilation Could not connect to Kotlin com
  • Java 中有没有类似 cmake 的工具?

    迄今为止我所知道的最好的Java构建工具似乎是maven 但它仍然没有提供像 cmake 那么多的灵活性 有人知道 java 的类似 cmake 的工具吗 只为您的兴趣 我在 CMake 中开发了 Java 支持 它从 2 8 6 版本开始
  • Spotbugs 在 gradle 项目中排除过滤器

    我是 gradle 新手 正在尝试配置 Spotbugs 我已将该插件添加到 build gradle 中 并且出现了 Spotbugs 问题 不过 我想排除 Findbugs EI EXPOSE REP 和 EI EXPOSE REP2
  • 开始使用 Groovy/Grails? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我对Java有了一些了解 我想学习Groovy grails 因此 请向我推荐任何好的网站和博客 我可以在其中找到文档以及 Groovy
  • 如何在 Eclipse RCP 项目中使用 groovy?

    我有一个 Eclipse RCP 项目 我想在其中使用 Groovy 我尝试做的是 1 添加 Groovy Nature 2 在 src 文件夹下创建Groovy文件3 从 View 的createPartControl 方法调用groov
  • Gradle 任务语法:从 Groovy 角度如何解释?

    我很难理解 Gradle 的 Groovy DSL 的工作原理 不幸的是 Gradle 是我在日常工作中遇到的 Groovy 的主要用例 而且我注意到对于许多开发人员来说 他们接触 Groovy 的方式完全是通过 Gradle 因此 大多数
  • 如何在gradle中执行jar文件?

    当我使用 ant 构建我的 android 项目时 我需要这样的任务
  • Gradle:找不到提供的方法()(组)

    为什么Gradle找不到方法provided当这是语法时指定的 https mvnrepository com artifact javax javaee api 7 0通过马文 thufir doge NetBeansProjects g
  • Android 设备监视器未出现

    当我单击 Android Studio 中的 ADM 图标时 我在日志中收到以下错误 我看到这里已经有一个关于此问题的线程 但解决方案似乎是针对 Eclipse 的 但是 今天 gradle 方面出现了一些问题 因此我在属性文件中将 htt
  • create-react-app 之后 React npm start 不起作用

    我正在学习 React 而且我的英语很差 我已经有两个反应项目 但它们也不起作用 我按照以下步骤操作 npx 创建反应应用程序我的应用程序 cd 我的应用程序 npm 启动 但它不起作用 我尝试清理缓存并再次安装 npm 但没有成功 我该如
  • 构建配置变量。错误:找不到符号

    在项目中我有几个flavors 一些buildTypes和几个folders用于组合 构建组合 文件夹结构 在每个文件夹中我都有自定义Application class AndroidManifest注册这个Application clas
  • Gradle Javadoc 失败并显示“错误:包...不存在”

    为我们开发的库构建 Android Studio 项目的 Javadocs 时 我们的 Gradle 构建脚本失败 出现以下错误 MY LOCAL PATH MyClass java 5 错误 包 com google gson 不存在 导
  • Groovy List> 的行为类似于 List

    我在生产代码中发现了一个铸造List
  • 如何从詹金斯管道获取所有参数(参数化构建)?

    我正在较新版本的 jenkins 中构建一个参数化管道作业 在较旧版本的 jenkins 中 我使用 getbinding getVariables 来检索所有参数 但较新的版本它返回空值 如何在新版本的詹金斯中检索参数 全部 您可以使用
  • 访问静态范围内的全局变量

    有没有办法从同一脚本中声明的类的静态方法访问脚本中声明的全局变量 例如 def s 12345 class MyClass static def method println s 因为这样它会因错误而失败 You attempted to
  • Visual Studio:如何正确构建和指定 x64 和 x86 的配置和平台

    使用 Visual Studio 2012 Professional 和 Ultimate 以及所有最新更新 如何正确指定配置和平台以正确构建 x86 和 x64 当您第一次创建 Winforms 应用程序时 Visual Studio 会
  • __stack_chk_fail_local 和 -fno-stack-protector - 如何让它工作?

    Update 我刚刚发现问题出在我的项目 libxml2 中包含的预构建库上 它是在启用堆栈保护的情况下构建的 因此依赖于 stack chk fail local方法 我现在已经重建了该库 fno stack protector也是 一切
  • Android Studio/Gradle 测试文件夹命名约定

    我看过很多在 Android Studio Gradle 项目上进行测试的教程和帮助项目 我很好奇测试文件夹的命名约定 我见过两个类似的命名 test and androidTest 有什么真正的区别吗 IDE Gradle 框架是否以不同
  • 升级 Grails 应用程序时compileAssets 失败

    我有一个运行版本 3 3 的 Grails 应用程序 我最近升级到版本4 0 3 我通常升级的方式 据我所知可能不是最好的方式 是将我的环境升级到新的 Grails 版本 然后创建一个全新的 Grails 项目 我正在使用 IntelliJ
  • 我可以在 Groovy 中编写注释吗?

    我知道我可以在 Groovy 中使用注释来注释我的类 但是我可以在 Groovy 中编写注释本身吗 而不是仅使用用 Java 编写的注释 如果有 从哪个版本开始 您可以在 Groovy 中定义注释 查看更多 http docs groovy

随机推荐

  • Blazor 输入复选框

    所以总体目标是我希望在表格上有复选框 所有不同的图案和不同类型的剪裁 男装 女装 通用 并且我希望能够检查图案 x y 和 z 然后剪裁类型男士和女士 然后将我检查过的值传递或访问到一个方法 然后该方法执行所有独特的配置 然后调用我的数据访
  • 如何在业务逻辑层实现事务

    我在我的 asp net 应用程序中使用企业库数据访问块 我想从业务逻辑层跨多个存储过程实现事务 Entlib 打开一个新连接以进行数据库访问 按以下方式使用 Transaction Scope 是否会导致分布式事务 using Trans
  • 我们可以重载Java中的main方法吗?

    我们可以超载吗main Java 中的方法 You can超载main 方法 但仅public static void main String args 当你的类被 JVM 启动时将会被使用 例如 public class Test pub
  • LINQ ToDictionary 和 ToLookup 之间有什么区别

    LINQ ToDictionary 和 ToLookup 之间有什么区别 他们似乎做同样的事情 字典是 1 1 映射 每个键映射到单个值 并且字典在事后是可变的 可编辑的 查找是一个 1 many 映射 多映射 每个键都映射到一个IEnum
  • Spotify 的自定义网络播放器

    据我所知 不可能开发一个Web应用程序 在spotify com之外 提供播放Spotify歌曲的自定义Web播放器 对吗 唯一的选择似乎仍然是 Spotify 播放按钮 但功能非常有限 然而我刚刚看到这个例子 1 http static
  • 如何应对 R 中的“非数字矩阵范围”错误?

    我正在尝试使用标准随机方程从学生的 t 分布生成模拟值的数据框 我使用的函数如下 matgen lt function means chi covariancematrix cols lt ncol means normals lt mvr
  • 如何使用 Python 在 Spark 中添加两个稀疏向量

    我到处搜索 但找不到如何使用 Python 添加两个稀疏向量 我想添加两个稀疏向量 如下所示 1048576 110522 0 6931 521365 1 0986 697409 1 0986 725041 0 6931 749730 0
  • Grails 3.2 JSON 视图中的 Java 8 LocalDate

    当我尝试使用 a 来解析包含 Java 8 LocalDateTime 的简单域模型对象时json视图 http docs grails org latest guide single html whatsNewJSONViews 我收到一
  • 如何使用反射调用自定义运算符

    在我的小项目中我使用System Reflection类来生成可执行代码 我需要打电话给 自定义类型的运算符 有谁知道如何使用 C 反射调用自定义类的自定义运算符 C 编译器将重载运算符转换为具有名称的函数op XXXX where XXX
  • 如何处理 .ajax post 中的 FileStream 返回类型?

    我通过以下代码发送 JSON 对象 控制器返回 CSV 格式的值 应提示打开或保存为 CSV 文件 我无法理解成功应该编写什么代码 函数 结果 导出链接 Html ActionLink Export null new onclick ret
  • 如何让 Java 应用程序与网站交互

    我有一个程序 可以从 Excel 文件中获取数据并为用户进行操作 但为了获取 Excel 文件的更新 需要从网站下载它们 我最初尝试使用机器人类导航到网站 使用用户名和密码登录 然后导航到网站的正确部分 找到 下载 Excel 电子表格 按
  • “所选目录不是 JDK 的有效主目录”Android Studio

    我一直在使用安卓工作室直到我更新到0 2 6 现在 我无法编译或创建新项目 会发生什么 我不确定 但我认为安卓工作室不知道我的 sdk 文件夹在哪里 我的意思是我的 android studio 目录中的 sdk 文件夹 我做了什么 我已经
  • Matplotlib vline 标签参数未显示

    我想用 matplotlib 的 vline 命令标记垂直线 但由于某种原因 label 参数在最终绘图上不执行任何操作 显示任何内容 有谁知道如何让标签显示出来 plt vlines x pah ymin 0 ymax 0 6 color
  • graphviz - 比较图形树

    我必须用 graphviz 来做一份工作 我需要可视化几棵树的图形表示 但无论如何我都必须比较两棵树以查看它们的差异 像这样 我有树 A 和树 B 创建它们的表示并比较它们后 我只需要查看没有共同点的节点 有人告诉我使用 EMF Compa
  • 如何在 TFS 构建定义中获取签入评论/消息?

    是否可以在 TFS 2013 构建定义 工作流程文件 中获取签入注释 消息 我看过BuildDetail但还没找到 注释是 a 的属性 a变更集 http msdn microsoft com en us library microsoft
  • 当锚标记仅触发 jQuery 操作而不重定向用户时,可以替代

    我的页面上有许多锚标记 它们仅触发同一页面上的 jQuery 操作 不会将用户重定向到另一个位置 这是锚标记的正常预期行为 我不想在我的应用程序中为每个操作都提供静态 URL 但是 我也不喜欢每次用户单击其中一个时都将其发送到页面顶部 a
  • 如何使椭圆跟随画布上的曲线

    我在尝试让椭圆正确遵循画布上的路径时遇到问题 我认为问题源于这样一个事实 我的迷你语法定义了 x 和 y 值之间的移动 但仅针对目标属性中的这些值之一 例如 Canvas Top or Canvas Left 我似乎在画布上找不到任何附加的
  • 我可以自动保存正在运行的 jupyter python 笔记本而不在浏览器选项卡中打开它吗?

    所以我有一个长期运行的Python笔记本 只要在我的浏览器选项卡中打开它 它就会每 2 分钟自动保存一次 生活很美好 即使我关闭浏览器选项卡 是否可以保持自动保存 当我关闭选项卡时 内核已经继续运行 这很棒 这有点像 屏幕 但是在 jupy
  • 模板参数上的 C++ 函数模板重载

    是否可以像这样重载函数模板 仅在使用enable if的模板参数上 template
  • Gradle:强制自定义任务始终运行(无缓存)

    我编写了一个自定义 Gradle 任务来处理路径可配置的文件系统上的一些依赖项解析 我希望这种类型的任务始终运行 我猜它们似乎只运行一次 因为输入似乎永远不会改变 我知道使用configurations resolutionStrategy