redacted-compiler-plugin
一个多平台 Kotlin 编译器插件,用于生成经过编辑的 toString()
实现。
灵感来自 AutoValue 的 auto-value-redacted
扩展。
使用方法
在项目中引入 gradle 插件,定义一个 @Redacted
注解,并将其应用于你想要编辑的属性。
@Retention(SOURCE)
@Target(PROPERTY)
annotation class Redacted
data class User(val name: String, @Redacted val phoneNumber: String)
当你调用 toString()
时,任何带有 @Redacted
注解的属性都会被隐藏:
User(name=Bob, phoneNumber=██)
如果你将注解应用于类,那么 toString()
将会输出一个单一的替换字符串:
@Retention(SOURCE)
@Target(CLASS)
annotation class Redacted
@Redacted
data class SensitiveData(val ssn: String, val birthday: String)
SensitiveData(██)
安装
应用 gradle 插件。
plugins {
id("dev.zacsweers.redacted") version <版本号>
}
就这么简单!默认配置会添加多平台的 -annotations
构件(其中包含一个可以使用的 @Redacted
注解)并自动进行所有配置。只需为你想要编辑的内容添加注解即可。
你可以通过 redacted
扩展中的属性来配置自定义行为。
redacted {
// 定义自定义注解。如果你定义了自己的注解,那么 -annotations 构件不会自动添加到依赖中!
// 注意,这必须是一个字符串格式,其中包名用 '/' 分隔,类名用 '.' 分隔,例如 "kotlin/Map.Entry"
redactedAnnotation = "dev/zacsweers/redacted/annotations/Redacted" // 默认值
// 定义自定义的未编辑注解
unredactedAnnotation = "dev/zacsweers/redacted/annotations/Unredacted" // 默认值
// 定义是否启用此功能。在你想要根据动态构建配置来控制此功能时很有用。
enabled = true // 默认值
// 定义编辑内容的自定义替换字符串
replacementString = "██" // 默认值
}
开发版本的快照可在 Sonatype 的 snapshots
仓库中获取。
支持的平台
编译器插件本身支持所有多平台项目类型。官方提供的注解构件也是多平台的,支持所有常见的 JVM、JS 和原生目标。
注意事项
- Kotlin 编译器插件不是稳定的 API!使用此插件编译的输出 应该 是稳定的,但在更新版本的 kotlinc 中使用不能保证稳定性。
- 目前不支持 IDE。参见 #8。
高级用法
在需要编辑所有内容并选择性地不编辑某些属性的情况下,提供了两个选项:
类编辑
对于可能包含大量需要编辑的字段的个别类,你可以增强 @Redacted
类的行为:
@Redacted
data class User(@Unredacted val name: String, val phoneNumber: String, val ssn: String)
User(name=Bob, phoneNumber=██, ssn=██)
超类编辑
在需要强制 API 只接受经过编辑的输入的情况下,你可以将 @Redacted
应用于父接口。
@Redacted
interface RedactedObject
data class User(@Unredacted val name: String, val phoneNumber: String, val ssn: String) : RedactedObject
User(name=Bob, phoneNumber=██, ssn=██)
许可证
Copyright (C) 2018 Zac Sweers
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.