Картинка блога

Хочу поделится с вами своим подходом к разработке модулей, тем и других частей Orchard CMS. В качестве контроля вермий я использую SVN, но думаю эту-же идею можно использовать с любым другим контролем версий. Все файлы лежат в отдельной папке репозитория, а в CMS они попадают с помощью символьных ссылок. Вспомогательные скрипты позволяют пересоздать базу и переустановить сайт с помощью одной команды, но обо всем по порядку:

Репозиторий модулей с NTFS символические линки.

Я использую файловую систему NTFS, так как в Windows только она позволяет создавать символические линки на файлы и папки. Мой репозиторий имеет следующую структуру:

\branches
\tags
\trunk
  \Files
    dev.recipe.xml
    [name].recipe.xml
    help.txt
  \Modules
    \[ModuleName]
  \Themes
    \[ThemeName]
  config-[name].bat
  mklinks-files.bat
  mklinks-modules.bat
  mklinks-themes.bat
  setup.bat

Таким образом, все проекты и файлы рассортированы по своим местам. Возможно, имеет смысл вынести вспомогательные «.bat» файлы в отдельную папку, но это уже дело вкуса.

Файлы установки

Файлы mklinks-*.bat и setup.bat имеют схожую структуру, и делают одно действие над содержимым или самим Orchard.

mklinks-files- создаем ссылки на файлы

В моем случае создает только одну символическую ссылку на рецепт, который я успользую при установке.

@echo off
if %web_root%=="" exit

set svn_files=%svn_root%\Files
echo Files SVN=%svn_files%

set recipe_name=dev.recipe.xml
mklink %web_root%\Modules\Orchard.Setup\Recipes\%recipe_name% %svn_files%\%recipe_name%

mklinks-modules — создаем ссылки на модули

Устанавливает модули. Для добавления еще одного модуля, достаточно скопировать 2 строки и сменить название.

::
@echo off
if %web_root%=="" exit

set src_modules=%web_root%\Modules
set svn_modules=%svn_root%\Modules

echo Modules Source=%src_modules%
echo Modules SVN=%svn_modules%

set module_name=[module-name]
mklink /d %src_modules%\%module_name% %svn_modules%\%module_name%

mklinks-themes — создаем ссылки на шаблоны

Похож на mklinks-modules, только ставит линки на шаблон.

::
@echo off
if %web_root%=="" exit

set src_themes=%web_root%\Themes
set svn_themes=%svn_root%\Themes

echo Templates Source=%src_themes%
echo Templates SVN=%svn_themes%

set theme_name=[theme-name]
mklink /d %src_themes%\%theme_name% %svn_themes%\%theme_name%

setup — переустанавливаем Orchard

Пересоздает базу данных и запускает orchard setup

::
if %web_root%=="" exit
set asqlcmd="c:\Program Files\Microsoft SQL Server\100\Tools\Binn\SQLCMD.exe"
iisreset

cd %web_root%\bin
set app_data=%web_root%\App_Data
del /q %app_data%\*.*
rd /q /s %app_data%\Dependencies
rd /q /s %app_data%\Logs
rd /q /s %app_data%\RecipeQueue
rd /q /s %app_data%\Sites

%asqlcmd% -Q"drop database orchard"
%asqlcmd% -Q"create database orchard"
%asqlcmd% -Q"use orchard; CREATE USER [user] FOR LOGIN [user]"
%asqlcmd% -Q"use orchard; EXEC sp_addrolemember N'db_owner', N'user'"

::orchard setup /SiteName:test /AdminUsername:admin /AdminPassword:adminPassword /DatabaseProvider:SQLServer /DatabaseConnectionString:"Data Source=localhost;Initial Catalog=orchard;Persist Security Info=True;User ID=user;Password=password"
orchard setup /SiteName:test /AdminUsername:admin /AdminPassword:adminPassword  /DatabaseProvider:SQLServer /DatabaseConnectionString:"Data Source=localhost;Initial Catalog=orchard;Persist Security Info=True;User ID=user;Password=password" /Recipe:Development

pause

Ход действий такой:

  1. Удалить содержимое папки App_Data
  2. Удалить базу orchard
  3. Создать базу orchard и дать доступ соответствующему пользователю
  4. Запустить команду setup с соответствующим рецептом (рецепт будет описан ниже).

config-[name].bat — вызов всего что перечислено выше

Этот файл должен запускатся для установки.

::
set current_path=%~dp0
set web_root=C:\Orchard14\src\Orchard.Web
set svn_root=C:\svn\orchard-modules\trunk

cd %current_path%
call mklinks-modules.bat
cd %current_path%
call mklinks-themes.bat
cd %current_path%
call mklinks-files.bat

echo Proceed with setup?
pause
cd %current_path%
call setup.bat

Ход действий такой:

  1. Установить переменные, которые будут использовать скрипты.
  2. Последовательно запустить все скрипты.
  3. Перед запуском setup.bat убедится, что его действительно надо запускать (Ctrl-Break — для выхода).

Вспомогательные рецепты

Вот рецепт, который облегчает мою жизнь ускоряя процесс переустановки:

<Orchard>
  <Recipe>
    <Name>Development</Name>
    <Description>Base development.</Description>
    <Author>admin</Author>
    <WebSite>http://binaryanalysis.net</WebSite>
    <Tags>dev</Tags>
    <Version>1.0</Version>
  </Recipe>
  <Feature
  enable="Orchard.Blogs,Orchard.Comments,Orchard.Tags,Orchard.Alias,Orchard.Autoroute,
                   TinyMce,Orchard.Media,Orchard.MediaPicker,Orchard.PublishLater,
                   Orchard.jQuery,Orchard.Widgets,Orchard.Widgets.PageLayerHinting,Orchard.ContentTypes,
                   Orchard.Scripting,Orchard.Scripting.Lightweight,
PackagingServices,Orchard.Packaging,Orchard.Warmup,Orchard.Projections,Orchard.Fields,TheThemeMachine,
Orchard.ImportExport,Orchard.Experimental,Orchard.CodeGeneration,Szmyd.CodeGeneration,				   Orchard.Experimental.WebCommandLine,Orchard.DesignerTools,Orchard.Migrations,DatabaseUpdate" />
  <Metadata>
    <Types>
      <Page ContentTypeSettings.Draftable="True" TypeIndexing.Included="true">
        <TagsPart />
        <LocalizationPart />
        <TitlePart/>
        <AutoroutePart />
      </Page>
    </Types>
    <Parts>
      <BodyPart BodyPartSettings.FlavorDefault="html" />
    </Parts>
  </Metadata>
	<Command>
layer create Default /LayerRule:"true" /Description:"The widgets in this layer are displayed on all pages"
layer create Authenticated /LayerRule:"authenticated" /Description:"The widgets in this layer are displayed when the user is authenticated"
layer create Anonymous /LayerRule:"not authenticated" /Description:"The widgets in this layer are displayed when the user is anonymous"
layer create Disabled /LayerRule:"false" /Description:"The widgets in this layer are never displayed"
layer create TheHomepage /LayerRule:"url '~/'" /Description:"The widgets in this layer are displayed on the home page"
widget create HtmlWidget /Title:"First Leader Aside" /Zone:"TripelFirst" /Position:"5" /Layer:"TheHomepage" /Identity:"SetupHtmlWidget1" /UseLoremIpsumText:true
widget create HtmlWidget /Title:"Second Leader Aside" /Zone:"TripelSecond" /Position:"5" /Layer:"TheHomepage" /Identity:"SetupHtmlWidget2" /UseLoremIpsumText:true
widget create HtmlWidget /Title:"Third Leader Aside" /Zone:"TripelThird" /Position:"5" /Layer:"TheHomepage" /Identity:"SetupHtmlWidget3" /UseLoremIpsumText:true
site setting set baseurl
page create /Slug:"welcome-to-orchard" /Title:"Welcome to Orchard!" /Path:"welcome-to-orchard" /Homepage:true /Publish:true /Text:"Welcome To Orchard!"
menuitem create /MenuPosition:"1" /MenuText:"Home" /Url:"" /OnMainMenu:true
theme activate "The Theme Machine"
	</Command>
</Orchard>

Помимо стандартных модулей, я использую Szmyd.CodeGeneration, его нужно установить предварительно.

Создание пакетов и установка на Production окружение

Для запуска комманды package create нет никаких препятствий, так что можно создать пакет, а после этого установить его на удаленном Orchard CMS.

Дополнительные идеи

В принципе, тот же подход с символическими ссылками можно использовать вместе с модулем Multi Tenant. Для предоставления доступа к пользовательскому шаблону, положив его в папку пользователя.

Метки:, ,

Один комментарий в “Разработка модулей для Orchard CMS с поддержкой SVN”

  1. Класно!
    Осваиваю orchard — всё очень интересно, спасибо 🙂