为何出现硬编码值?附build.gradle相关代码片段
为什么你的Corda节点配置会出现硬编码值?怎么优化?
这个问题其实挺常见的——刚接触Corda的Cordform插件时,默认的示例写法确实会把节点名称、端口这些值直接硬编码在build.gradle里。主要原因是这种方式最直观,能快速让你跑通节点部署流程,但显然在实际项目里不够灵活,后续维护也很麻烦。
下面给你几种实用的优化方案,帮你把硬编码的配置彻底解耦出来:
方案1:用Gradle属性统一管理(最简单易用)
你可以把所有需要修改的配置放到项目根目录的gradle.properties文件中,然后在build.gradle里引用这些属性,这样改配置时不用动构建脚本,还能统一管理。
步骤1:在gradle.properties中定义配置
# Notary节点配置 notary_name=O=Notary,L=London,C=GB notary_p2p_port=10002 notary_rpc_address=localhost:10003 notary_admin_address=localhost:10043 # PartyA节点配置 partya_name=O=PartyA,L=Tokyo,C=JP partya_p2p_port=10005 partya_rpc_address=localhost:10006 partya_admin_address=localhost:10046
步骤2:在build.gradle中引用属性
task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { directory "./build/nodes" node { name notary_name notary = [validating : true] p2pPort notary_p2p_port.toInteger() rpcSettings { address(notary_rpc_address) adminAddress(notary_admin_address) } cordapps = ["$corda_release_group:corda-finance:$corda_release_version"] } node { name partya_name p2pPort partya_p2p_port.toInteger() rpcSettings { address(partya_rpc_address) adminAddress(partya_admin_address) } // 补充你的其他节点配置 } }
方案2:用外部配置文件加载(适合多环境场景)
如果你的项目需要区分开发、测试、生产等不同环境,用单独的配置文件会更方便。比如创建一个node-config.properties文件,然后在build.gradle中加载它。
步骤1:创建node-config.properties配置文件
notary.name=O=Notary,L=London,C=GB notary.p2p.port=10002 notary.rpc.address=localhost:10003 notary.admin.address=localhost:10043 partya.name=O=PartyA,L=Tokyo,C=JP partya.p2p.port=10005 partya.rpc.address=localhost:10006 partya.admin.address=localhost:10046
步骤2:在build.gradle中加载并使用配置
// 加载外部配置文件 def nodeConfig = new Properties() file('node-config.properties').withInputStream { inputStream -> nodeConfig.load(inputStream) } task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { directory "./build/nodes" node { name nodeConfig.getProperty('notary.name') notary = [validating : true] p2pPort nodeConfig.getProperty('notary.p2p.port').toInteger() rpcSettings { address(nodeConfig.getProperty('notary.rpc.address')) adminAddress(nodeConfig.getProperty('notary.admin.address')) } cordapps = ["$corda_release_group:corda-finance:$corda_release_version"] } node { name nodeConfig.getProperty('partya.name') p2pPort nodeConfig.getProperty('partya.p2p.port').toInteger() rpcSettings { address(nodeConfig.getProperty('partya.rpc.address')) adminAddress(nodeConfig.getProperty('partya.admin.address')) } // 补充你的其他节点配置 } }
你还可以为不同环境创建不同的配置文件(比如node-config-dev.properties、node-config-prod.properties),通过命令行参数指定加载哪个文件,灵活性拉满。
方案3:动态生成节点配置(适合节点数量多的复杂场景)
如果你的项目有很多节点,或者配置逻辑比较复杂,可以用Groovy的循环和动态逻辑来生成节点配置,避免重复写大量相同代码。
// 把所有节点的配置数据放到一个列表里 def nodes = [ [ name: "O=Notary,L=London,C=GB", isNotary: true, p2pPort: 10002, rpcAddress: "localhost:10003", adminAddress: "localhost:10043", cordapps: ["$corda_release_group:corda-finance:$corda_release_version"] ], [ name: "O=PartyA,L=Tokyo,C=JP", isNotary: false, p2pPort: 10005, rpcAddress: "localhost:10006", adminAddress: "localhost:10046", cordapps: [] // 按需添加对应的cordapps ] ] task deployNodes(type: net.corda.plugins.Cordform, dependsOn: ['jar']) { directory "./build/nodes" // 遍历节点数据,动态生成每个节点的配置 nodes.each { nodeData -> node { name nodeData.name if (nodeData.isNotary) { notary = [validating: true] } p2pPort nodeData.p2pPort rpcSettings { address(nodeData.rpcAddress) adminAddress(nodeData.adminAddress) } cordapps = nodeData.cordapps } } }
这种方式能大幅减少重复代码,后续新增节点只需要在列表里加一条数据即可。
内容的提问来源于stack exchange,提问作者Runjie Wang
相关产品推荐
相关产品推荐

