每個開發人員都須要一個良好的IDE,EOS開發也是同樣,爲項目開發過程構建一個良好的IDE環境是第一步。這就是爲何咱們要寫這個如何使用VS Code或者CLion進行EOS開發的快速教程的緣由。html
咱們還爲VS Code建立了一些腳本,這些腳本將你在終端中使用的一些命令自動化。ios
首先,若是你尚未這些VS Code擴展的話,安裝一下。對於EOS Dapp開發,它們將很是有幫助:c++
當咱們開發EOSIO dApps時,咱們須要編寫.hpp和.cpp文件中的代碼。然而,這是整個過程當中很小的一部分。大多數時候,咱們須要生成一些其餘文件,這些文件將用於在區塊鏈上部署合約,進行單元測試等等。這就是CMake有用的地方。git
CMake是用於控制軟件編譯過程的命令行工具。一旦它在你的IDE內正確設置的話,會使整個開發過程更加容易。github
既然咱們要使用CMake工具,咱們應該對咱們的項目結構作一些改變。咱們將重用EOSIO項目的構架,由於它擁有咱們所須要的一切。固然,咱們有一些小的變化。shell
咱們有一張圖片,展現了新的項目結構。讓咱們看一看。編程
首先,咱們有了build文件夾。這是放置全部構建內容的地方。你所使用的每個生成文件都在那裏。接下來是CMakeModules,它包含一些有用的Cmake模塊,這些自定義模塊用於編譯過程。json
contracts是咱們的核心文件夾。這就是咱們要放置智能合約的地方。目前,eosiolib, libc++和musl默認存在這裏用於編譯。緊接着是externals和libraries。兩個文件夾都包含用於使整個編譯過程更容易的庫。架構
項目結構中最後一個重要的東西是配置文件CMakeLists.txt。每一個目錄都有本身的帶有命令的CMakeLists.txt文件。app
能夠在咱們的repo中找到全部的文件夾和腳本的新項目結構。
讓咱們看一些配置文件,由於你須要知道如何使用它們。
1.CMakeLists.txt(4)
這是設置編譯過程的主要配置文件。你應該知道,當你開發Dapp時,你須要設置項目名稱。版本和語言是可選的。
# 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)
第二個配置文件在contracts文件夾內。每個新的智能合約都應該做爲這個配置中的子目錄來添加。重要的是不要忘了這一步合約不會編譯。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)
每一個智能合約都有本身的配置文件。這裏須要注意的是,每一個合約都有不一樣的TARGET,大部分狀況下,它就是文件夾的名稱。
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} )
如今,當咱們有了新的項目結構時,咱們必須定製命令來編譯和構建咱們所作的每一件事。可是怎麼開始呢?幸運的是,VS Code有一些很酷的東西叫作Tasks。它幫助咱們自動化每一個命令,只需點擊幾下。
首先,咱們必須生成包含咱們的自定義命令的tasks.json文件。按⇧+⌘+P打開VS代碼中的command palette,而後鍵入「「Tasks」並選擇「Configure Task」。
而後下一步選擇Create tasks.json file from template,而後Others:
VS code將建立一個名爲「.vscode」的文件夾,在裏面,你能夠找到tasks.json
。如今咱們須要添加命令。複製並粘貼下面的代碼到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}", } ] }
咱們已經建立了三個自定義命令,命名爲CMake、Build和Generate ABI。它們執行三個shell腳本compile.sh,build.sh和generate.sh。前兩個腳本基本上都是相同的,除了build.sh還進行了編譯之外。可能大多數時候你會使用第二個。
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
另外一方面,使用第三個腳本generate.sh(生成智能合約ABI)。在生成過程當中須要生成一些文件。必須在合約文件夾內執行命令。選擇一個.cpp文件並運行它。
generate.sh
echo "Current working directory -" $1 cd $1 eosiocpp -g $2.abi $2.cpp
使人驚歎的!咱們已經準備好了VS Code。爲了使整個開發變得更容易,咱們將爲咱們的命令建立快捷方式。當你仍然在VS代碼中時,點擊Preferences – Keyboard Shortcuts。快捷方式窗口找到並打開keybindings.json(它在頂部):
一旦keybindings.json打開,咱們將建立快捷方式。對於咱們的命令,咱們選擇了cmd+e、cmd+r和cmd+i,可是你能夠選擇其餘。這是你必須添加的json:
一旦你已經完成了全部的設置,如今準備在VS Code上開發EOS DApps吧.
與VS Code相比,設置CLion很是簡單。當加載CLion中的架構時,IDE會自動在cmake-build-debug文件夾中建立全部生成文件。一旦準備就緒,就可使用「⌘+F9」快捷方式執行實際構建。這就是你須要作的一切,太簡單了吧?
可是,若是你想爲CMake設置附加項,能夠從Preferences – Build, Execution, Deployment中選擇。
更多關於配置CLion中的CMake的信息,你能夠在CLion IDE的官方文檔中找到。寫的很是好!
=========================================================
分享一個交互式的在線編程實戰,EOS智能合約與DApp開發入門:
本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、帳戶與錢包、發行代幣、智能合約開發與部署、使用代碼與智能合約交互等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
這裏是原文