Работающий программист

Приступаем к работе с Oak

Тэд Ньюард

Ted NewardИногда интересно посмотреть на изменения, которые произошли в нашей отрасли за последние 50 лет. Выпускник колледжа в 1960 году вполне (и заслуженно) мог получить работу в качестве программиста и на протяжении своей карьеры наблюдать, как его работа меняется от заполнения перфокарт до программирования машины размером с комнату с целыми 4 Кб активной памяти (и безо всякого хранилища постоянной готовности); он видел расцвет таких языков программирования, как COBOL на мейнфреймах, а затем мини-компьютеры вроде IBM PC; переживал перемены в технологиях UI и переход на GUI и видел, как лэптопы становятся стандартными компьютерами; был свидетелем зарождения Интернета и Web — и, в конце концов, ушел на пенсию как раз перед тем периодом, когда планшеты и мобильные устройства становятся основными потребительскими вычислительными устройствами.

Но ровным счетом те же перемены происходили и в определенных нишах индустрии, «революции» того же рода случались в более узких областях технологий. Одна из таких быстро меняющихся областей технологий — все тот же вездесущий веб-сайт: сначала скрипты Common Gateway Interface (CGI), написанные на Perl или C, затем такие расширения веб-серверов, как ISAPI, потом технологии наподобие ASP, «ориентированные на страницы»; от них к более мощным инфраструктурам, стоящим за технологиями, ориентированными на страницы (ASP.NET, поддерживаемая CLR, а не неуправляемым кодом), и т. д. Все чаще основной подход к этим технологиям отходит от языков со статической типизацией, например C#, и движется в сторону языков с большей динамической типизацией, таких как Ruby или Python. Однако все это привело к тому, что с новой силой вспыхнули яростные дебаты по поводу серьезности издержек, связанных с программированием на динамических языках (в которых компилятор не может отлавливать распространенные ошибки), и насколько велик выигрыш, который они дают по сравнению со статическим языком. Явного победителя в этих дебатах нет и пока не предвидится; в итоге некоторые разработчики стали присматриваться к вариантам, позволяющим использовать лучшее из двух миров.

Oak — это проект с открытым исходным кодом Амира Раджана (Amir Rajan) (Twitter: @amirrajan; Web: amirrajan.net), который является одной их таких попыток использовать динамические возможности, заложенные в C# (через ключевое слово/тип dynamic и Dynamic Language Runtime [DLR], введенные в Visual Studio 2010), и добиться большей производительности труда, присущих системам вроде Ruby on Rails, в то же время оставшись в рамках языка (C#), который предлагает статическую проверку и верификацию типов.

Подготовка

Oak доступен в виде NuGet-пакета, но разработчики, решившие использовать Oak, должны понимать, что прежде всего Oak является в большей мере подходом к стилю разработки, чем «просто» библиотекой. Oak потребует другого подхода к созданию приложений — отличного от того, к которому, возможно, привык разработчик, применяющий традиционную технологию ASP.NET MVC. Например, акцент на чрезвычайно быстрой обратной связи будет означать, что Oak потребуется непрерывная фоновая сборка (или, по крайней мере, нечто похожее), и тогда простого сохранения файла .cs будет достаточно, чтобы увидеть результаты в браузере, — явные этапы «сборки» не нужны. (Как Oak на самом деле достигает этого, не бог весть какая наука, и вы сами убедитесь в этом.) Конечным результатом разработки на основе Oak будет «традиционное» приложение ASP.NET, поэтому операторы, к счастью, никогда не узнают, что вы создали его вовсе не так, как обычно.

Инструментарий

Отчасти перемены в стиле, к которому вы привыкли, потребуются еще и потому, что Oak — это не просто NuGet-пакет, вместе с ним нужно использовать ряд других средств, которые должны быть установлены на вашем компьютере до того, как вы сможете приступить к работе. Одно из таких средств — IIS Express, который уже есть у многих разработчиков для Microsoft .NET Framework, если они экспериментировали с Visual Studio LightSwitch. Другой инструмент — Ruby, который применяется в некоторых частях автоматизации сборки и других средствах. Ruby не понадобится на производственных серверах, но вы должны установить его, чтобы начать разработку на Oak. На момент написания этой статьи был выпущен Ruby версии 2.0, но и версия 1.9 будет работать нормально (и как по мне, так прежняя версия даже лучше, потому что на версии 2.0 у меня всплыла какая-то странная ошибка, с которой больше никто пока не сталкивался). Наконец, ввиду своей интерактивности Oak требуется возможность выводить вам сообщения из системы непрерывной компиляции в фоновом режиме, поэтому для Oak нужно установить Growl for Windows — систему уведомления, которая будет выводить небольшие сообщения на рабочий стол (как это делал MSN Messenger), когда происходит некое событие, например успешное или неудачное завершение фоновой сборки. (Кстати, Growl API мы рассмотрим в одной из следующих статей этой рубрики, потому что это полезный инструмент, который всегда должен быть у вас под рукой.)

После установки всего перечисленного необходим еще один шаг: используемым в Oak скриптам Ruby нужны некоторые пакеты, доступные через диспетчер пакетов Ruby — gem. (Кстати, Ruby gem послужил толчком к созданию NuGet и других диспетчеров языковых пакетов, например Node npm и Haskell Cabal.) Пропишите окно командной строки для Ruby в PATH и введите следующую команду из командной строки:

C:\Projects\Exploration\Oak\Blog>gem install warmup

Пакет warmup gem (bit.ly/15e51Lx) как раз и является средством запуска проекта Oak — он скачивает шаблон, содержащий все основные «движущиеся части», необходимые для работы Oak.

Очевидно, вы уже поняли, что это очень сильно отличается от выбора File | New | Project, к которому вы скорее всего давно привыкли.

Создание нового Oak-проекта

Создание и запуск нового Oak-проекта включает использование warmup gem из командной строки для получения начального шаблона (seed template) с его веб-страницы, например:

C:\Projects\Exploration\Oak\Blog>warmup https://github.com/amirrajan/loam Blog

Этот начальный проект (после того, как он загружается на ваш компьютер) содержит скелетную реализацию «weblog» (я заключил слово «weblog» [блог] в кавычки, потому что, если это можно назвать блогом, тогда я лучший баскетболист в NBA). Как только диск перестанет вертеться, откройте скачанный файл решения Blog.sln для Visual Studio (у вас появится комфортная среда Visual Studio). Затем из командной строки, где вы уже вводили команду warmup, наберите еще две команды:

C:\Projects\Exploration\Oak\Blog>rake
C:\Projects\Exploration\Oak\Blog>rake server

Rake — это средство «сборки» для Ruby, во многом аналогичное утилите make, которая долгие годы была средством сборки для C/C++; оно выдаст последовательность операций согласно выбранной цели. Первая команда соберет решение, а вторая сообщит Rake развернуть код в каталог IIS Express и запустить IIS Express. Теперь порт 3000 (по умолчанию) будет готов принимать входящие HTTP-запросы.

Если вас интересует полный список поддерживаемых Rakefile целей, введите rake –T и вы увидите в командной строке вывод, показанный на рис. 1. (Примечание Команда rake –D выдает гораздо более длинный список целей для тех, кто хочет видеть полный справочный текст по каждой задаче.)

Рис. 1. Список поддерживаемых Rakefile целей

C:\Projects\Exploration\Oak\Blog>rake -T
rake build                  # builds the solution
rake default                # builds and deploys website to directories iis...
rake deploy                 # deploys MVC app to directory that iis express...
rake export                 # if you have the nuget package oak installed, ...
rake reset                  # if you have the nuget package oak installed, ...
rake sample                 # if you have the nuget package oak installed, ...
rake server                 # start iis express for MVC app
rake simulate_load_balance  # simulate the web application as if it were lo...
rake stop_nginx             # stops nginx
rake sync[file]             # synchronizes a file specfied to the website d...
rake tests                  # run nspec tests
rake ui                     # run ui automation tests
rake ui_tests               # runs ui tests (without building)

После старта IIS Express запустите утилиту непрерывной сборки — sidekick:

C:\Projects\Exploration\Oak\Blog>sidekick

Sidekick — это на самом деле командный файл, использующий компилятор C# командной строки для трансляции небольшой исполняемой программы (sidekickapp.exe), которая установит средство наблюдения за файловой системой (file-system watcher); оно будет отслеживать, какие файлы в дереве каталогов изменяются, и, если это файлы исходного кода, будет запускать MSBuild для перекомпиляции проекта. (Весьма вероятно, что с той же целью можно было бы использовать и недавние эксперименты Гленна Блока [Glenn Block] с Roslyn для создания среды C# REPL, ScriptCS.)

Краткое отступление, прежде чем продолжить: обратите внимание на рис. 1, что Rake предлагает вариант для запуска rake simulate_load_balance. Как и предполагает само имя, это симуляция того, как поведет себя приложение в среде с простой балансировкой нагрузки, действующей по принципу карусели, чтобы вы могли проверить свое приложение (и особенно его состояние) в такой среде безо всякой возни с виртуальными машинами (VM), аппаратными или программными средствами балансировки нагрузки и IIS. Это маленькое приятное дополнение для проекта в Oak.

К этому моменту Oak уже подготовлен и выполняется: для проверки можно открыть браузер по адресу localhost:3000 (рис. 2).

Переход в браузере по адресу localhost:3000 подтверждает, что Oak выполняется
Рис. 2. Переход в браузере по адресу localhost:3000 подтверждает, что Oak выполняется

Не переживайте по поводу того, что сейчас сообщает вам Oak, — об этом мы поговорим в следующий раз. А пока достаточно убедиться, что Oak выполняется.

Устранение проблем

Если Oak не работает, причина может быть в том, что Rake не знает, где ваш IIS Express ожидает хостинга веб-сайтов; Rakefile, устанавливаемый Oak, использует конфигурационный файл dev.yml, чтобы выяснить, куда устанавливать файлы, скомпилированные ASP.NET. В этом файле (он в том же каталоге, что и файл Blog.sln) укажите следующие строки, подходящие для вашей системы:

website_port: 3000
website_deploy_directory: c:\Prg\iisexpress\Blog
solution_name: Blog # just the name, no .sln extension
mvc_project: Blog # just the folder name,
  no .csproj extension
test_project: Blog.Tests # just the folder name,
  no .csproj extension
iis_express: C:\Program Files\IIS Express

В 64-разрядных системах, например, IIS Express будет установлен в каталог C:\Program Files (x86)\IIS Express.

Заключение

Нам предстоит исследовать в Oak еще очень многое — по сути, лучшим названием для этой статьи, по-видимому, было бы «Acorn» , учитывая, что это зародыш, из которого произрастает вся остальная инфраструктура (и берет начало моя серия статей). Я должен буду рассказать вам об Oak массу всего, начиная с его интеграции в традиционную структуру разработки в ASP.NET MVC (контроллеры, представления и модели) и заканчивая его взаимодействие с базой данных. Кроме того, вы еще должны будете понять, что дает вам весь этот дополнительный инструментарий (Ruby и Growl). Подождите немного — настоящее веселье начнется в следующий раз.

Удачи в кодировании!


Тэд Ньюард (Ted Neward) — глава компании Neward & Associates LLC. Автор и соавтор многочисленных книг, в том числе «Professional F# 2.0» (Wrox, 2010), более сотни статей, часто выступает на многих конференциях по всему миру; кроме того, имеет звание Microsoft MVP в области F#. С ним можно связаться по адресу ted@tedneward.com, если вы заинтересованы в сотрудничестве. Также читайте его блог blogs.tedneward.com и заметки в twitter.com/tedneward.

Выражаю благодарность за рецензирование статьи эксперту Амиру Раджану (Amir Rajan) (автор проекта Oak).