首页 > 解决方案 > 如何过滤掉 ./gradlew project:dependencies 命令的某个部分?(第 2 版)

问题描述

我发布了如何过滤掉 ./gradlew project:dependencies 命令的某个部分?不久前并实施了已接受的答案。但是,它似乎给了我错误的信息。

我有以下(简化)build.gradle文件

dependencies {
    implementation("com.myco.security:security-service-client:1.0.199")
}

当我运行命令时

$ ./gradlew :project:dependencies | tee deps.txt

我在文件中看到了以下内容deps.txt,缩写为仅显示我想要的工件。

compileClasspath - Compile classpath for source set 'main'.
+--- com.myco.security:security-service-client:1.0.199 -> 1.0.148
+--- com.myco.security:security-service-client:1.0.148 (*)
default - Configuration for default artifacts.
+--- com.myco.security:security-service-client:1.0.199 -> 1.0.148
+--- com.myco.security:security-service-client:1.0.148 (*)
+--- com.myco.security:security-service-client:1.0.148 (*)
implementation - Implementation only dependencies for source set 'main'. (n)
+--- com.myco.security:security-service-client:1.0.199 (n)
+--- com.myco.security:security-service-client:1.0.148 (n)
runtimeClasspath - Runtime classpath of source set 'main'.
+--- com.myco.security:security-service-client:1.0.199 -> 1.0.148
testCompileClasspath - Compile classpath for source set 'test'.
+--- com.myco.security:security-service-client:1.0.199 -> 1.0.148
+--- com.myco.security:security-service-client:1.0.148 (*)
testRuntimeClasspath - Runtime classpath of source set 'test'.
+--- com.myco.security:security-service-client:1.0.199 -> 1.0.148
+--- com.myco.security:security-service-client:1.0.148 (*)

IOW,我的build.gradle文件中的依赖项出现多次。现在,如果我在原始链接帖子中应用答案,我会得到

com.myco.security:security-service-client:1.0.199
com.myco.security:security-service-client:1.0.148

作为工件,而不是以下内容,这是我想要匹配build.gradle文件中的依赖项的内容。

com.myco.security:security-service-client:1.0.199

如何改进awk链接帖子中的命令?IOW

cat deps.txt | awk '/^\+.*com\.myco/ && !seen[$2]++{print $2}' | some_other_cmd

应该只给我

com.myco.security:security-service-client:1.0.199

标签: bashshellgradleawksed

解决方案


你可以使用这个 awk:

awk -F '[: ]+' -v OFS=: '/^\+.*com\.myco/ && !seen[$2,$3]++{print $2, $3, $4}' deps.txt

com.myco.security:security-service-client:1.0.199

细节:

  • 使用-F '[: ]+'我们在空格或冒号上拆分列
  • 使用-v OFS=:我们使用冒号作为输出文件分隔符
  • seen[$2,$3]使用group:module依赖作为数组键
  • print $2, $3, $4印刷group:module:version

推荐阅读