VS Code 中的 Solidity 扩展无法解析从 node_modules 的导入

问题描述 投票:0回答:3

请查看我的环境详细信息。

环境

  • 节点安装有
    nvm
  • Truffle 安装在不同的节点环境中,只需通过
    nvm use v16.17.0
  • 更改节点即可切换
  • 在我的 VS Code 中,我为 VS Code 扩展安装了 Truffle,它也紧密依赖于 Solidity 扩展。
  • 我已经安装了
    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 编译在所有节点版本中使用
    truffle compile
    在终端中工作正常。
  • 在 VS code truffle 扩展的 Truffle 合约浏览器部分成功编译了合约。

失败

  • 我面临一个失败,那就是当我右键单击
    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",
javascript solidity smartcontracts visual-studio-extensions truffle
3个回答
1
投票

我也有同样的情况。我尝试了vscode设置也无济于事。 在圈子里谷歌搜索似乎是一个环境问题。

我的解决方法是在导入前面添加路径,如下所示:

import "../nodemodules/@openzeppelin-etc".....

然后当我需要在 Hardhat 中实际编译时,我将它们改回来 不理想 - 希望有人有更好的答案。


0
投票

我也有同样的问题。对我来说解决这个问题的方法是转到 Solidity 扩展设置,然后

Package Default Dependencies Directory
,然后单击
Edit in settings.json
并添加此行:

    "solidity.packageDefaultDependenciesDirectory": "node_modules",

无需重新启动 VS Code,错误就消失了。我希望这有帮助!


0
投票

假设您的存储库结构如下所示(openzeppelin-solidity 位于 node_modules 中):

如果你在根级别打开 vscode,你应该像这样配置:

"solidity.packageDefaultDependenciesContractsDirectory": "",
"solidity.packageDefaultDependenciesDirectory": "src/node_modules"

因为 Vscode 的 Solidity 扩展可以解析从 Vscode 中打开的文件夹的顶层导入。 如果您在不同的文件夹中有多个项目,它也可能会干扰扩展解析导入的能力,最好独立打开每个项目(一一打开)。 最重要的node_modules文件夹应包含在打开的Vscode文件夹的根级别

© www.soinside.com 2019 - 2024. All rights reserved.