Truffle
部署多個具有依賴關係的松露合約
假設我想遷移 2 個相互依賴的契約。這可以通過
var contract1 = artifacts.require("contract1"); var contract2 = artifacts.require("contract2"); module.exports = function(deployer) { deployer.deploy(contract1).then(function(){ return deployer.deploy(contract2, contract1.address) }); };
但是,如果我嘗試使用以下程式碼嵌套第三個契約,該契約依賴於前兩個契約:
var contract1 = artifacts.require("contract1"); var contract2 = artifacts.require("contract2"); var contract3 = artifacts.require("contract3"); module.exports = function(deployer) { deployer.deploy(contract1).then(function(){ deployer.deploy(contract1, contract2.address).then(function(){ return deployer.deploy(contract3, contract1.address, contract2.address) }) })};
然後
truffle deploy
在這個遷移文件上執行只部署第一個合約,而不是剩下的兩個。部署 3 個甚至最多 n 個合約的正確語法是什麼?有比這種醜陋的嵌套更好的方法嗎?另一個問題,比如說需要為契約 3 計算一個額外的參數,那麼正確的語法是什麼?例如。我想做類似的事情
var contract1 = artifacts.require("contract1"); var contract2 = artifacts.require("contract2"); var contract3 = artifacts.require("contract3"); var someSol = artifacts.require("someSol.sol"); module.exports = function(deployer) { deployer.deploy(contract1).then(function(){ deployer.deploy(contract1, contract2.address).then(function(){ const someAddress = await someSol.foo(contract1.address, contract2.address); return deployer.deploy(contract3, contract1.address, contract2.address, someAddress) }) })};
非常感謝任何幫助
這是一個 JavaScript 問題。
更簡單的是使用 async/await 模式。這樣你就不需要嵌套承諾。
所以它可能看起來像這樣:
module.exports = function(deployer, network, accounts) { deployer.then(async () => { await deployer.deploy(A); await deployer.deploy(B, A.address); //... }); };