Почему компилятор солидности выдает ошибку разбора в операторах импорта? Какой обходной путь? - PullRequest
0 голосов
/ 16 января 2019

Я использовал npm install для установки зависимостей пакета узла. Мои зависимости пакета узла выглядят следующим образом:

  "dependencies": {
    "blockcypher": "^0.2.0",
    "fs-extra": "^7.0.1",
    "ganache-cli": "^6.2.4",
    "mocha": "^5.2.0",
    "openzeppelin-solidity": "^2.0.0",
    "solc": "^0.4.24"
  }

Когда я запускаю следующий скрипт компиляции с использованием узла, я получаю следующую ошибку в КАЖДОМ контракте, в котором есть оператор импорта, который ссылается на зависимость в моих node_modules.

Я использую Solidity Version: ^ 0.4.24

Ошибка солидности: ParseError: Source "node_modules / openzeppelin-solidity / ect .." не найден

const path = require("path"); //Delete all the contents in the build folder
const solc = require("solc"); //solidity compiler
const fs = require("fs-extra"); // Gives us access to the file system

//Require The Import Statements From The Contract
// import "node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
// import "node_modules/openzeppelin-solidity/contracts/ownership/Ownable.sol";
// import "node_modules/openzeppelin-solidity/contracts/token/ERC20/IERC20.sol";

//var data = require("node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.json");
//How do I use this?

const buildPath = path.resolve(__dirname, "build");
fs.removeSync(buildPath);

const campainPath = path.resolve(__dirname, "Contract.sol");
// const campainPath = path.resolve(__dirname, "contracts", "Esgro.sol");
const source = fs.readFileSync(campainPath, "utf8");

console.log("\n\n\t Compilation Output \n\n\n");
console.log(solc.compile(source, 1));
const output = solc.compile(source, 1).contracts; //Internal Error
console.log("\n\n\t Compilation Output \n\n\n");
console.log(output);

fs.ensureDirSync(buildPath);

for (let contract in output) {
  // fs.outputJsonSync(
  //   path.resolve(buildPath, contract.replace(":"", "") + ".json"),
  //   output[contract]
  // );

  console.log("\n\n\t output[contract] \n\n\n");
  console.log(output[contract]);

  fs.outputJsonSync(path.resolve(buildPath, contract), output[contract]);
}

//Compile both contracts with the solc compiler

//Write the output to the build directory

Как заставить компилятор "соединяться" со сторонними зависимостями на локальной машине? Любая помощь или указатели будут с благодарностью.

1 Ответ

0 голосов
/ 16 января 2019

правильный синтаксис для импорта зависимости npm в файл .sol следующий:

import "openzeppelin-solidity/contracts/token/ERC20/ERC20Mintable.sol"; //You don't need to write node_modules 

Документация openzeppelin гласит:

Вам нужна среда разработки ethereum для вышеупомянутого импорта заявления на работу!

так что, вероятно, лучше использовать трюфель или Embark для компиляции и переноса вашего контракта.

И последнее: OpenZeppelin использует версию ^ 0.5.0 солидности, поэтому при переходе на компиляцию не забудьте использовать подходящую версию solc.

Дайте мне знать, если это сработало

...