每个开发人员都须要一个良好的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的开发。
这里是原文