Hello World - ponyatov/nimbook GitHub Wiki
Каждое приложение поставляется в виде пакета. При необходимости вы можете скомпилировать простую программу, вызывая компилятор nim напрямую, но чаще всего программы используют дополнительные библиотеки = тоже пакеты, и их нужно скачать и скомпилировать вместе с вашей программой.
Для управления пакетами и компиляцией используется утилита nimble. Она сама отслеживает версии пакетов, закачивает свежие списки с сайта nimble.directory, обновляет библиотеки, отслеживает зависимости между файлами, и запускает компилятор nim только для изменившихся файлов. Для простых проектов её обычно достаточно, но в большинстве проектов используется еще множество других инструментов, поэтому лучше сразу научиться использовать nimble
в связке с Makefile
.
~$ find hello -t f
hello/src/hello.nim
hello/hello.nimble
В минимальный проект на языке Nim входят всего два файла:
-
project.nimble
информация о проекте, обязательно его наличие как минимум для указания, какую версию компилятора и библиотек вам нужно -
src/project.nim
исходный код -
Makefile
необязательный файл управления проектом, более универсален, и покрывает то что не умеетnimble
# Package | Пакет
version = "0.1.0"
author = "Dmitry Ponyatov <[email protected]>"
description = "Hello World"
license = "MIT"
srcDir = "src"
bin = @["hello"]
# Dependencies | Зависимости
## привязка к версии языка Nim
requires "nim >= 1.2.0"
## использование сторонней библиотеки, без указания версии
requires "ncurses"
CWD = $(CURDIR)
MODULE = $(shell echo $(notdir $(CWD)) | tr "[:upper:]" "[:lower:]" )
SRC = src/$(MODULE).nim
SRC += src/extra.nim
$(MODULE): $(SRC) $(MODULE).nimble src/nim.cfg Makefile
echo $(SRC) | xargs -n1 -P0 nimpretty --indent:2
nimble --cc:tcc build
when isMainModule:
echo("Hello, World!")
import logging
let log = newConsoleLogger(fmtStr = "[$date $time] - $levelname: ")
addHandler(log)
import os
import memfiles as mmap
proc main =
let argv = @[os.getAppFilename()] & os.commandLineParams()
for i in pairs(argv):
info "argv[", i.key, "] = <", i.val, ">"
debug "mmap ", argv[1]
src = mmap.open(argv[1])
defer: src.close()
when isMainModule: main()
./nyp nyp.py nyp.ini
[2020-06-28 11:11:37] - INFO: argv[0] = </home/ponyatov/nimbook/nyp/nyp>
[2020-06-28 11:11:37] - INFO: argv[1] = <nyp.py>
[2020-06-28 11:11:37] - INFO: argv[2] = <nyp.ini>
[2020-06-28 11:11:37] - DEBUG: mmap nyp.py