EOS開(kāi)發(fā)IDE工具Visual Studio code 和CLion的配置

每一個(gè)開(kāi)發(fā)人員都需要一個(gè)良好的IDE,EOS開(kāi)發(fā)也是一樣,為項(xiàng)目開(kāi)發(fā)過(guò)程構(gòu)建一個(gè)良好的IDE環(huán)境是第一步。這就是為什么我們要寫(xiě)這個(gè)如何使用VS Code或者CLion進(jìn)行EOS開(kāi)發(fā)的快速教程的原因。

我們還為VS Code創(chuàng)建了一些腳本,這些腳本將你在終端中使用的一些命令自動(dòng)化。

設(shè)置Visual Studio Code

首先,如果你還沒(méi)有這些VS Code擴(kuò)展的話,安裝一下。對(duì)于EOS Dapp開(kāi)發(fā),它們將非常有幫助:

  • C/C++ - VS Code的智能感知、調(diào)試和代碼瀏覽
  • CMake - Visual Studio Code的CMake語(yǔ)言支持
  • CMake Tools - Visual Studio Code擴(kuò)展CMake支持
  • WebAssembly - 用于WebAssembly文本表示的語(yǔ)法高亮顯示

當(dāng)我們開(kāi)發(fā)EOSIO dApps時(shí),我們需要編寫(xiě).hpp和.cpp文件中的代碼。然而,這是整個(gè)過(guò)程中很小的一部分。大多數(shù)時(shí)候,我們需要生成一些其他文件,這些文件將用于在區(qū)塊鏈上部署合約,進(jìn)行單元測(cè)試等等。這就是CMake有用的地方。

CMake是用于控制軟件編譯過(guò)程的命令行工具。一旦它在你的IDE內(nèi)正確設(shè)置的話,會(huì)使整個(gè)開(kāi)發(fā)過(guò)程更加容易。

既然我們要使用CMake工具,我們應(yīng)該對(duì)我們的項(xiàng)目結(jié)構(gòu)做一些改變。我們將重用EOSIO項(xiàng)目的構(gòu)架,因?yàn)樗鼡碛形覀兯枰囊磺?。?dāng)然,我們有一些小的變化。

我們有一張圖片,展示了新的項(xiàng)目結(jié)構(gòu)。讓我們看一看。

匯智網(wǎng)

首先,我們有了build文件夾。這是放置所有構(gòu)建內(nèi)容的地方。你所使用的每一個(gè)生成文件都在那里。接下來(lái)是CMakeModules,它包含一些有用的Cmake模塊,這些自定義模塊用于編譯過(guò)程。

contracts是我們的核心文件夾。這就是我們要放置智能合約的地方。目前,eosiolib, libc++musl默認(rèn)存在這里用于編譯。緊接著是externalslibraries。兩個(gè)文件夾都包含用于使整個(gè)編譯過(guò)程更容易的庫(kù)。

項(xiàng)目結(jié)構(gòu)中最后一個(gè)重要的東西是配置文件CMakeLists.txt。每個(gè)目錄都有自己的帶有命令的CMakeLists.txt文件。

可以在我們的repo中找到所有的文件夾和腳本的新項(xiàng)目結(jié)構(gòu)。

CMakeLists

讓我們看一些配置文件,因?yàn)槟阈枰廊绾问褂盟鼈儭?/p>

1.CMakeLists.txt(4)

這是設(shè)置編譯過(guò)程的主要配置文件。你應(yīng)該知道,當(dāng)你開(kāi)發(fā)Dapp時(shí),你需要設(shè)置項(xiàng)目名稱(chēng)。版本和語(yǔ)言是可選的。

# Set the minimum required version of cmake for a project
cmake_minimum_required(VERSION 3.5)

# Set a name, version, and enable languages for the entire project.
project( ProjectName )

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/libraries/fc/CMakeModules")
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CMakeModules")

# Load and run CMake code from a file or module.
include( GNUInstallDirs )
include( SetupTargetMacros )

# Set a normal, cache, or environment variable to a given value
set( CMAKE_CXX_STANDARD 14 )
set( CMAKE_CXX_EXTENSIONS ON )
set( CXX_STANDARD_REQUIRED ON)

set( CLI_CLIENT_EXECUTABLE_NAME cleos )
set( GUI_CLIENT_EXECUTABLE_NAME eosio )

set(CMAKE_EXPORT_COMPILE_COMMANDS "ON")


# add defaults for openssl
if ("${OPENSSL_ROOT_DIR}" STREQUAL "")
   if (NOT "$ENV{OPENSSL_ROOT_DIR}" STREQUAL "")
      set(OPENSSL_ROOT_DIR $ENV{OPENSSL_ROOT_DIR})
      set(OPENSSL_INCLUDE_DIR ${OPENSSL_ROOT_DIR}/include)
   elseif (APPLE)
      set(OPENSSL_ROOT_DIR "/usr/local/opt/openssl")
      set(OPENSSL_INCLUDE_DIR "/usr/local/opt/openssl/include")
   elseif(UNIX AND NOT APPLE)
      set(OPENSSL_ROOT_DIR "/usr/include/openssl")
      set(OPENSSL_INCLUDE_DIR "/usr/include/openssl/include")
   else()
      message(FATAL_ERROR "openssl not found and don't know where to look, please specify OPENSSL_ROOT_DIR")
   endif()
endif()

if(UNIX)
  if(APPLE)
    set(whole_archive_flag "-force_load")
    set(no_whole_archive_flag "")
  else()
    set(whole_archive_flag "--whole-archive")
    set(no_whole_archive_flag "--no-whole-archive")
  endif()
else()
  set(whole_archive_flag "--whole-archive")
  set(no_whole_archive_flag "--no-whole-archive")
endif()

SET( Boost_USE_STATIC_LIBS ON CACHE STRING "ON or OFF" )
IF( WIN32 )
  SET(BOOST_ROOT $ENV{BOOST_ROOT})
  set(Boost_USE_MULTITHREADED ON)
  set(BOOST_ALL_DYN_LINK OFF) # force dynamic linking for all libraries
ENDIF(WIN32)
FIND_PACKAGE(Boost 1.66 REQUIRED COMPONENTS
    thread
    date_time
    filesystem
    system
    program_options
    signals
    serialization
    chrono
    unit_test_framework
    context
    locale
    iostreams)

# Add a subdirectory to the build.
add_subdirectory(externals)

include(wasm)

add_subdirectory(libraries)
add_subdirectory(contracts)

2.CMakeLists.txt (3)

第二個(gè)配置文件在contracts文件夾內(nèi)。每一個(gè)新的智能合約都應(yīng)該作為這個(gè)配置中的子目錄來(lái)添加。重要的是不要忘了這一步合約不會(huì)編譯。CMake不知道。

set(DEFAULT_SYSTEM_INCLUDE_FOLDERS ${CMAKE_SOURCE_DIR}/contracts/libc++/upstream/include ${CMAKE_SOURCE_DIR}/contracts/musl/upstream/include ${Boost_INCLUDE_DIR})
set(STANDARD_INCLUDE_FOLDERS ${CMAKE_SOURCE_DIR}/contracts ${CMAKE_SOURCE_DIR}/externals/magic_get/include)

add_subdirectory(eosiolib)
add_subdirectory(musl)
add_subdirectory(libc++)

# Your contracts (add the name of the folder which contains you smart contract)
add_subdirectory(Players)

3.CMakeLists.txt(2)

每個(gè)智能合約都有自己的配置文件。這里需要注意的是,每個(gè)合約都有不同的TARGET,大部分情況下,它就是文件夾的名稱(chēng)。

file(GLOB ABI_FILES "*.abi")
configure_file("${ABI_FILES}" "${CMAKE_CURRENT_BINARY_DIR}" COPYONLY)

# Change "Players" with the name of the folder containing your smart contracts
add_wast_executable(TARGET Players
  INCLUDE_FOLDERS "${STANDARD_INCLUDE_FOLDERS}"
  LIBRARIES libc libc++ eosiolib
  DESTINATION_FOLDER ${CMAKE_CURRENT_BINARY_DIR}
)

現(xiàn)在,當(dāng)我們有了新的項(xiàng)目結(jié)構(gòu)時(shí),我們必須定制命令來(lái)編譯和構(gòu)建我們所做的每一件事。但是怎么開(kāi)始呢?幸運(yùn)的是,VS Code有一些很酷的東西叫做Tasks。它幫助我們自動(dòng)化每個(gè)命令,只需點(diǎn)擊幾下。

VS Code的Tasks

首先,我們必須生成包含我們的自定義命令的tasks.json文件。按?+?+P打開(kāi)VS代碼中的command palette,然后鍵入““Tasks”并選擇“Configure Task”。

匯智網(wǎng)

然后下一步選擇Create tasks.json file from template,然后Others

匯智網(wǎng)

VS code將創(chuàng)建一個(gè)名為“.vscode”的文件夾,在里面,你可以找到tasks.json。現(xiàn)在我們需要添加命令。復(fù)制并粘貼下面的代碼到tasks.json

{
    "version": "2.0.0",
    "reveal": "always",
    "options": {
        "cwd": "${workspaceRoot}"
    },
    "tasks": [
        {
            "label": "CMake",
            "type": "shell",
            "command": "sh ${workspaceRoot}/.vscode/scripts/compile.sh"
        },
        {
            "label": "Build",
            "type": "shell",
            "command": "sh ${workspaceRoot}/.vscode/scripts/build.sh"            
        },
        {
            "label": "Generate ABI",
            "type": "shell",
            "command": "sh ${workspaceRoot}/.vscode/scripts/generate.sh ${fileDirname} ${fileBasenameNoExtension}",
        }
    ]
}

我們已經(jīng)創(chuàng)建了三個(gè)自定義命令,命名為CMake、BuildGenerate ABI。它們執(zhí)行三個(gè)shell腳本compile.sh,build.shgenerate.sh。前兩個(gè)腳本基本上都是相同的,除了build.sh還進(jìn)行了編譯以外。可能大多數(shù)時(shí)候你會(huì)使用第二個(gè)。

compile.sh

# Create a build folder if it doesn't exist
mkdir -p build

# Change the current directory to "build"
cd build

# Create all the build files needed
cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE=Debug ..

build.sh

# Create a build folder if it doesn't exist
mkdir -p build

# Change the current directory to "build"
cd build

# Create all the build files needed
cmake -G 'Unix Makefiles' -DCMAKE_BUILD_TYPE=Debug ..

# Build
make

另一方面,使用第三個(gè)腳本generate.sh(生成智能合約ABI)。在生成過(guò)程中需要生成一些文件。必須在合約文件夾內(nèi)執(zhí)行命令。選擇一個(gè).cpp文件并運(yùn)行它。

generate.sh

echo "Current working directory -" $1
cd $1

eosiocpp -g $2.abi $2.cpp

令人驚嘆的!我們已經(jīng)準(zhǔn)備好了VS Code。為了使整個(gè)開(kāi)發(fā)變得更容易,我們將為我們的命令創(chuàng)建快捷方式。當(dāng)你仍然在VS代碼中時(shí),點(diǎn)擊Preferences – Keyboard Shortcuts??旖莘绞酱翱谡业讲⒋蜷_(kāi)keybindings.json(它在頂部):

匯智網(wǎng)

一旦keybindings.json打開(kāi),我們將創(chuàng)建快捷方式。對(duì)于我們的命令,我們選擇了cmd+e、cmd+rcmd+i,但是你可以選擇其他。這是你必須添加的json:

匯智網(wǎng)

一旦你已經(jīng)完成了所有的設(shè)置,現(xiàn)在準(zhǔn)備在VS Code上開(kāi)發(fā)EOS DApps吧.

CLion 設(shè)置

與VS Code相比,設(shè)置CLion非常簡(jiǎn)單。當(dāng)加載CLion中的架構(gòu)時(shí),IDE會(huì)自動(dòng)在cmake-build-debug文件夾中創(chuàng)建所有生成文件。一旦準(zhǔn)備就緒,就可以使用“?+F9”快捷方式執(zhí)行實(shí)際構(gòu)建。這就是你需要做的一切,太簡(jiǎn)單了吧?

但是,如果你想為CMake設(shè)置附加項(xiàng),可以從Preferences – Build, Execution, Deployment中選擇。

匯智網(wǎng)

更多關(guān)于配置CLion中的CMake的信息,你可以在CLion IDE的官方文檔中找到。寫(xiě)的非常好!

=========================================================

分享一個(gè)交互式的在線編程實(shí)戰(zhàn),EOS智能合約與DApp開(kāi)發(fā)入門(mén)

EOS教程

本課程幫助你快速入門(mén)EOS區(qū)塊鏈去中心化應(yīng)用的開(kāi)發(fā),內(nèi)容涵蓋EOS工具鏈、賬戶與錢(qián)包、發(fā)行代幣、智能合約開(kāi)發(fā)與部署、使用代碼與智能合約交互等核心知識(shí)點(diǎn),最后綜合運(yùn)用各知識(shí)點(diǎn)完成一個(gè)便簽DApp的開(kāi)發(fā)。

  • web3j教程,主要是針對(duì)java和android程序員進(jìn)行區(qū)塊鏈以太坊開(kāi)發(fā)的web3j詳解。
  • 以太坊教程,主要介紹智能合約與dapp應(yīng)用開(kāi)發(fā),適合入門(mén)。
  • 以太坊開(kāi)發(fā),主要是介紹使用node.js、mongodb、區(qū)塊鏈、ipfs實(shí)現(xiàn)去中心化電商DApp實(shí)戰(zhàn),適合進(jìn)階。
  • python以太坊,主要是針對(duì)python工程師使用web3.py進(jìn)行區(qū)塊鏈以太坊開(kāi)發(fā)的詳解。
  • php以太坊,主要是介紹使用php進(jìn)行智能合約開(kāi)發(fā)交互,進(jìn)行賬號(hào)創(chuàng)建、交易、轉(zhuǎn)賬、代幣開(kāi)發(fā)以及過(guò)濾器和事件等內(nèi)容。
  • C#以太坊,主要講解如何使用C#開(kāi)發(fā)基于.Net的以太坊應(yīng)用,包括賬戶管理、狀態(tài)與交易、智能合約開(kāi)發(fā)與交互、過(guò)濾器和事件等。

這里是原文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容