Свой Web проект на D под ОС Ubuntu

Website developmentD
Sandbox
Этот материал родился благодаря статье Простой сайт на D автора danial72. Только там был разобран момент под ОС Windows. В моей же статье, будет пошагово рассмотрен процесс подготовки рабочего окружения для создания собственного Web-проекта на языке программирования D на примере ОС Ubuntu 13.04.

Речь идет о том, если у вас сложный и ресурсоемкий проект, а мысли о том, что десятки тысяч строк php-кода будут парситься каждый раз при вызове страницы, а там и классы с наследованием, и шаблонизаторы какие-нибудь, да еще и активных пользователей будет тысячи, вызывают у вас панику и ужас, то и есть смысл подумать о рациональном и оптимальном решении для реализации такой разработки. Напротив, если вы никогда об этом и не задумывались, то вероятнее всего у вас не абы какой мощный Сервер.

Марк Цукерберг и его команда, в свое время решили эту проблему, разработав HipHop, который конвертировал PHP-скрипт в C++ и тот в свою очередь собирался в скомпилированный сервер, заточенным под этот проект. Мы же с вами, сделаем нечто похожее, только будем сразу все писать на компилируемом языке, чтоб избежать лишних трансляций кода и избежать возможных багов при этом процессе. Тем более, язык D настолько удобен, что можно с легкостью его использовать для решения своих задач.

Следующие шаги, покажут как развернуть все это дело:
  1. Посещаем страницу DLang.org и скачиваем дистрибутив для вашей системы.
  2. Далее необходимо установить DUB менеджер. С его помощью мы будем развертывать, компилировать и запускать наш проект. Нужно добавить репозиторий, ключ и обновить зависимости
    $ sudo wget http://netcologne.dl.sourceforge.net/project/d-apt/files/d-apt.list -O /etc/apt/sources.list.d/d-apt.list
    $ sudo apt-get update && sudo apt-get -y --allow-unauthenticated install --reinstall d-apt-keyring && sudo apt-get update
    
    После этого
    $ sudo apt-get install dub
    
  3. По завершению установки, создаем папку projects, в которой будет создаваться наш проект.
    $ cd /home/<имя пользователя>/projects
    $ dub init <имя проекта>
    
    Эта операция, создаст в папке вашего проекта следующую структуру файлов
    public/
    source/
       app.d
    views/
    package.json
    
  4. Нас интересует файлик package.json. Открываем его и добавляем, следующий текст:
    "dependencies": {
       "vibe-d": ">=0.7.16"
    }
    
    Теперь, во время компиляции, DUB автоматически скачает последний пакет vibe.d
  5. Далее, любым редактором открываем файл app.d. Я б советовал использовать IDE, но к сожалению, полноценной IDE аля MS Visual Studio 2008 или Borland Delphi для языка D под Ubuntu я так и не нашел, а то что есть можно использовать только частично или с костылями. Свой выбор, я пока остановил на Geany.
    В файле в самом начале пишем…
    #!/usr/bin/rdmd
    эта команда указывает на то, что файл будет скомпилирован автоматически в момент выполнения, с помощью утилиты RDMD из пакета DMD.
    Сам файл делаем исполняемым
    chmod 775
    
    Кроме этого, заданный пример в файле, сгенерированный автоматически, можно удалить и вставить этот код
    import vibe.d;
    import std.file;
    
    void image(HTTPServerRequest req, HTTPServerResponse res)
    {
        auto file = format("./public/images/%s", req.params["f"]);
        
        if(exists(file))
        {
            auto image = cast(ubyte[]) read(file);
            res.writeBody(image,"image");
        }
        else
        {
            res.writeBody("Not Found","text/plain");
        }
    }
    
    void css(HTTPServerRequest req, HTTPServerResponse res) {
        auto css = readText(format("./public/css/%s", req.params["f"]));
        res.writeBody(css,"text/css");
    }
    
    void index_req(HTTPServerRequest req, HTTPServerResponse res)
    {
        auto request = req.params["r"];
        res.renderCompat!("index.dt", HTTPServerRequest, "req",string,"title")(req,request);
    }
    
    void index(HTTPServerRequest req, HTTPServerResponse res)
    {
        res.renderCompat!("index.dt", HTTPServerRequest, "req")(req);
    }
    
    shared static this()
    {
        auto router = new URLRouter;
        router.get("/:r",&index_req);
        router.get("/", &index);
        router.get("/css/:f",&css);
        router.get("/images/:f",&image);
    
        auto settings = new HTTPServerSettings;
        settings.port = 8080;
    
        listenHTTP(settings, router);
    }

    Стили и картинки, как вы наверное успели заметить на данном примере, должны хранится в папках public/css/ и public/images/ соответственно.
    В папку views необходимо добавить два файла:
    layout.dt
    !!! 5
    html
    	head
    		title Example page
    	body
    		block body
    
    и index.dt
    extends layout
    
    block body
    	h1 Example page - Home
    	p Hello, World!
    
    Это шаблонизатор. Как конвертировать ваши страницы, описано здесь, а автоматический конвертер, есть здесь.
    Сохраняем все наши файлы.
  6. Переходим в папку нашего проекта и в командной строке запускаем DUB
    $ cd /home/<имя пользователя/projects/<имя проекта>
    $ dub
    
    Если все без ошибок, на экране должен появиться следующий текст:
    Checking dependencies in '/home/<имя пользователя>/Projects/<имя проекта>'
    Building configuration "application", build type debug
    Running dmd (compile)...
    Compiling diet template 'index.dt' (compat)...
    Compiling diet template 'index.dt' (compat)...
    Linking...
    Running /tmp/dub/1994091216/<имя проекта>...
    Listening for HTTP requests on :::8080
    Failed to listen on 0.0.0.0:8080
    
    Последняя строка, вроде как бы и соответствует ошибке, но на самом деле это попытка прослушать IPv6, который у меня не активен. Используется только IPv4.

    В окне браузера вбиваем 127.0.0.1:8080

    Вуаля… наш сайт.

После любых изменений, достаточно прервать работу DUB в терминале и запустить его снова. Все файлы, автоматически перекомпилируются.
Tags:ddlangwebubuntulinuxserverdmddubvibe-d
Hubs: Website development D
+4
5.1k 22
Comments 9

Popular right now

Системный администратор Linux
from 100,000 to 160,000 ₽ProfitClicksКраснодарRemote job
Remote backend middle/senior developer
from 150,000 to 250,000 ₽Vezzer.noМоскваRemote job
Системный администратор
to 120,000 ₽ЭкспобанкНовосибирск
Frontend developer/ Angular
from 200,000 ₽VMS SoftwareСанкт-ПетербургRemote job