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

в 7:43, , рубрики: dlang, dmd, dub, linux, Ubuntu, web, Веб-разработка, Песочница, Убунтариум, метки: , , , , , , ,

Этот материал родился благодаря статье Простой сайт на 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 в терминале и запустить его снова. Все файлы, автоматически перекомпилируются.

Автор: VMANTER

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js