请查看我的环境详细信息。
环境
nvm
nvm use v16.17.0
Ganache
桌面应用程序。solcjs
作为 npm
包。合同
// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.4.25 <0.9.0;
import "@openzeppelin/contracts/access/Ownable.sol";
contract CallerContract is Ownable {
}
项目结构 节点模块安装在合约的 truffle 项目后面的一个文件夹中,如下所示。
├── caller
│ ├── build
│ ├── contracts
│ ├── migrations
│ ├── test
│ └── truffle-config.js
├── oracle
│ ├── build
│ ├── contracts
│ ├── migrations
│ ├── test
│ └── truffle-config.js
├── node_modules
├── package-lock.json
├── package.json
输出
truffle compile
在终端中工作正常。失败
Solidity: Compile Contract
时。它输出Retrieving compiler information:
Compiler using default compiler (embedded on extension), solidity version: 0.8.9+commit.e5eed63a.Emscripten.clang
ParserError: Source "@openzeppelin/contracts/access/Ownable.sol" not found: File import callback not supported
--> path to contracts/contracts/CallerContract.sol:7:1:
|
| import "@openzeppelin/contracts/access/Ownable.sol";
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Compilation failed with 1 errors
我已经尝试了很多方法来解决这里提到的这个问题,主要是这个解决方案。
"solidity.packageDefaultDependenciesContractsDirectory": "",
"solidity.packageDefaultDependenciesDirectory": "node_modules",
我也有同样的情况。我尝试了vscode设置也无济于事。 在圈子里谷歌搜索似乎是一个环境问题。
我的解决方法是在导入前面添加路径,如下所示:
import "../nodemodules/@openzeppelin-etc".....
然后当我需要在 Hardhat 中实际编译时,我将它们改回来 不理想 - 希望有人有更好的答案。
我也有同样的问题。对我来说解决这个问题的方法是转到 Solidity 扩展设置,然后
Package Default Dependencies Directory
,然后单击 Edit in settings.json
并添加此行:
"solidity.packageDefaultDependenciesDirectory": "node_modules",
无需重新启动 VS Code,错误就消失了。我希望这有帮助!
假设您的存储库结构如下所示(openzeppelin-solidity 位于 node_modules 中):
如果你在根级别打开 vscode,你应该像这样配置:
"solidity.packageDefaultDependenciesContractsDirectory": "",
"solidity.packageDefaultDependenciesDirectory": "src/node_modules"
因为 Vscode 的 Solidity 扩展可以解析从 Vscode 中打开的文件夹的顶层导入。 如果您在不同的文件夹中有多个项目,它也可能会干扰扩展解析导入的能力,最好独立打开每个项目(一一打开)。 最重要的node_modules文件夹应包含在打开的Vscode文件夹的根级别