惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Threatpost
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
J
Java Code Geeks
博客园_首页
Google Online Security Blog
Google Online Security Blog
Hugging Face - Blog
Hugging Face - Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
I
Intezer
P
Palo Alto Networks Blog
V
Vulnerabilities – Threatpost
雷峰网
雷峰网
O
OpenAI News
SecWiki News
SecWiki News
小众软件
小众软件
酷 壳 – CoolShell
酷 壳 – CoolShell
美团技术团队
N
News | PayPal Newsroom
Project Zero
Project Zero
Forbes - Security
Forbes - Security
IT之家
IT之家
A
Arctic Wolf
WordPress大学
WordPress大学
Jina AI
Jina AI
T
Tor Project blog
博客园 - 三生石上(FineUI控件)
S
Secure Thoughts
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
博客园 - 聂微东
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Privacy International News Feed
Cloudbric
Cloudbric
G
GRAHAM CLULEY
博客园 - 叶小钗
H
Hacker News: Front Page
腾讯CDC
量子位
Help Net Security
Help Net Security
人人都是产品经理
人人都是产品经理
C
Cyber Attacks, Cyber Crime and Cyber Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
宝玉的分享
宝玉的分享
爱范儿
爱范儿
L
Lohrmann on Cybersecurity
Hacker News - Newest:
Hacker News - Newest: "LLM"
Recorded Future
Recorded Future
C
CERT Recently Published Vulnerability Notes

See you soon

试试将文章版本化管理吧 | See you soon 使用 Quadlet 将 Podman 中的 Postgres 当作 systemd 服务运行 | See you soon 大他者,那个无时无刻都在盯着你的东西 | See you soon Laws of Software Engineering,软件工程定律 | See you soon 浅记多因素身份认证 | See you soon Linux 内核中的度量单位 | See you soon 重置 GPG 智能密钥 | See you soon 向 NAS 引入 samba | See you soon 无法重复键入的 Fcitx5 | See you soon ZFS 降级事故 | See you soon 记被 XanMod Kernel 和 AppArmor 联合坑的一次踩坑 | See you soon agent 的 skill 与 toolcall | See you soon 记一次服务器被挂恶意挖矿二进制 | See you soon 活着的 Arc | See you soon 令 acme.sh 使用 Cloudflare 的 DNS API 签发与续签证书 | See you soon 于 Tokio 中卸载 CPU Bound 任务 | See you soon 如我所见,梦破碎的时候 | See you soon 74LS 家族手册 | See you soon JDK Projects 备忘录 | See you soon 关于历史 | See you soon 用 curl 下载 OnePlus 的 ROM | See you soon 实用命令切片 | See you soon 再见,Oh My Zsh。 | See you soon 你不应该复用 strings.Builder | See you soon 博客的明日 | See you soon 被 AppArmor 击杀的 Dockge | See you soon AI 时代的自我 | See you soon 支持删除的布隆过滤器 | See you soon 基于栈的虚拟机与基于寄存器的虚拟机 | See you soon RVA23 包含了什么 | See you soon Rust 的边界检查是否已经有很大的进步 | See you soon 使用 Rust 编写操作系统:Barebones | See you soon 使用 Rust 编写操作系统:引言 | See you soon 编译器笔记:rope | See you soon 编译器笔记:CST | See you soon Paradoxical 札记 | See you soon 简单的相似去重算法(基于向量) | See you soon 更加现代的 PaperMC Minecraft 插件设计指南 | See you soon 简单的 CFG 语法分析方法 | See you soon 简单地使用 Caddy 实现 CORS 配置 | See you soon 让 OpenCV 可以被静态链接 | See you soon 图片搜索笔笺 | See you soon 电路板设计笔记-保护 | See you soon 使用 Rust 实现 SnowflakeId | See you soon 农夫乐事 FaQ 启示 | See you soon 使用 Rust 实现拓展系统札记 | See you soon 遗传学定律的代码实现 | See you soon EN:The Journey of Rust and Procps | See you soon ZH:Rust 与 Procps 之旅 | See you soon 使用 debootstrap 与 schroot 构建一个纯净环境 | See you soon GPG添加新的用户信息 | See you soon GSoC2024 笔记:使用 Rust 重新实现 procps | See you soon JWT 小册 | See you soon 使用密钥登录 SSH | See you soon Guava:Cache | See you soon 编译器笔记:增量编译 | See you soon Minecraft:原始经济系统设计简述 | See you soon TinyRemapper笔记 | See you soon MicroOS:进阶 | See you soon MicroOS:起步 | See you soon Swapfile 指北 | See you soon GPG 物理密钥的安装与密钥的迁移 | See you soon 用GPG签名告诉大家这就是我的提交 | See you soon DFS:深度优先搜索 | See you soon 文章翻译:从init.vim到init.lua | See you soon 目录遍历攻击 | See you soon 如何挂载.img文件,以及如何使用QEMU模拟arm64环境 | See you soon 在树莓派上编译 OpenCV | See you soon 关于卸载BlueStacks后遇到的问题 | See you soon
Gradle秘境:添加一个类似modCompileOnly的依赖块 | See you soon
Krysztal Huang · 2023-09-17 · via See you soon

FabricLoom 里有类似 modCompileOnlymodApimodImplementationmodRuntimeOnly 配置块,那应该怎么做才能在自己的 Gradle 插件里实现类似的功能?

假设:你已经会了 Kotlin,并且大概知道怎么使用 Gradle,并且 Gradle 的插件项目已经成功创建,并且可以成功被加载

为什么要这么做?那是什么?

先介绍一下 FabricLoom 这个 Gradle 插件的的 modCompileOnly 等配置块的功能。

这个配置块用于在 dependencies 块里描述一个新的依赖,但是 Gradle 会依赖你写的是 implementation 或者 compileOnly 而执行对应的功能。

举个例子,你会在 FabricLoom 项目的 build.gradle 里面看到类似这样的配置块:

dependencies {

minecraft "com.mojang:minecraft:${project.minecraft_version}"

mappings "net.fabricmc:yarn:${project.yarn_mappings}:v2"

modImplementation "net.fabricmc:fabric-loader:${project.loader_version}"

}

但是你会发现,往往不需要再次声明一次对于 net.fabricmc:fabric-loader:${project.loader_version} 这个依赖的 implementation 配置块。

这是为什么?因为 modImplementation 配置块继承了 implementation 配置块,所以在这项依赖被 implementation 配置块对应的处理器处理后,可以被 FabricLoom 再次收集信息,加入 Minecraft Client 的模组加载列表里面!

很好,这下应该解释清楚了为什么要做这项工作,那么我们的正事开始——设计新的 plImplementation 配置块,并且收集所有配置块的信息。

代码实现

接下来的代码用 Kotlin 实现,所以前文需要假设你会 Kotlin(毕竟 Kotlin 不难)

先想清楚我们要做什么:添加一个叫做 plImplementation 的依赖块,可以写到 dependencies 块里,并且它可以被视为是正常的 implementation 块能被当作依赖处理。

新增一个 configuration

在 Gradle 插件进行注册的时候,我们把这段代码写到插件注册里去

configuration.register("plImplementation") {

it.extendsFrom(configuration.getByName(JavaPlugin.COMPILE_ONLY_CONFIGURATION_NAME))

it.description = "Extend from `implementation`, but it will add dependencies into `plugins` directory."

}

只要成功运行那就是注册成功,这里通过 it$extendsFrom 说明了它是继承了 implementation 块。

@TaskAction 里进行操作

@TaskAction 里我们这样写

project.configurations

.getByName("plImplementation")

.incoming

.resolutionResult

.allComponents

.forEach { result ->

result.dependencies.forEach { dependency ->

project.logger.info(":$PL_TASK_EVALUATE_PLUGIN: $dependency")

}

}

这样就可以获取到如下 plImplementation 块的依赖了,并且对他进行额外处理

dependencies {

plImplementation("net.fabricmc:fabric-loader:${project.loader_version}")

}