Я попытался запустить Redmine на IronRuby с некоторым успехом несколько месяцев назад. Версия Redmine, которую я использовал, была 0.9.3, версия IronRuby была 1.0v4, SQL Server 2005 и была размещена на IIS 6. На самом деле это была большая работа по ее запуску. Мне пришлось внести небольшие изменения в кучу файлов Redmine. Я также добавил несколько файлов, которых не было в моей загрузке, например new_rails_defaults.rb. Кроме того, мне пришлось получить исходный код IronRuby от GitHub и немного изменить его, чтобы заставить работать IronRack.
Чтобы заставить IIS работать, мне пришлось перенаправить весь трафик на .Net для обработки в созданном мною веб-приложении Redmine IIS. Это было сделано путем добавления сопоставления расширения приложения в «C: \ Windows \ Microsoft.NET \ Framework \ v2.0.50727aspnet_isapi.dll»
Затем я перенаправил весь трафик на IronRack в своем файле Web.config.
<httpHandlers>
<clear />
<add path="*" verb="*" type="IronRuby.Rack.HttpHandlerFactory, IronRuby.Rack"/></httpHandlers>
Это остановило IIS от возможности обслуживать статические файлы. Чтобы это исправить, я создал StaticFileHttpHandler.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
namespace StaticFileHttpHandler
{
public class StaticFileHttpHandler : IHttpHandler
{
#region IHttpHandler Members
public bool IsReusable
{
get
{
return true;
}
}
public void ProcessRequest(HttpContext context)
{
string staticFileUrl = context.Request.Url.LocalPath.Replace(@"/", @"\");
string staticFilePath = context.Server.MapPath(@"~\..\..\");
string defaultStaticFilePathForRemapping = @"\Redmine\public";
string defaultRootDirectoryForRemapping = @"\Redmine";
bool remapImage = !string.IsNullOrWhiteSpace(context.Request.QueryString.ToString());
if (staticFilePath.EndsWith(@"\"))
{
staticFilePath = staticFilePath.Substring(0, staticFilePath.Length - 1);
}
if (remapImage)
{
staticFilePath += (defaultStaticFilePathForRemapping + staticFileUrl.Replace(defaultRootDirectoryForRemapping, ""));
}
else
{
staticFilePath += staticFileUrl;
}
if (File.Exists(staticFilePath))
{
context.Response.ContentType = GetMimeType(staticFilePath);
context.Response.TransmitFile(staticFilePath);
}
else
{
context.Response.ContentType = "text/plain";
context.Response.Write("The File Does Not Exist!!! File: " + staticFilePath);
}
context.Response.Flush();
context.ApplicationInstance.CompleteRequest();
}
// Found Here: http://kseesharp.blogspot.com/2008/04/c-get-mimetype-from-file-name.html
private string GetMimeType(string fileName)
{
string mimeType = "application/unknown";
string ext = System.IO.Path.GetExtension(fileName).ToLower();
Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
if (regKey != null && regKey.GetValue("Content Type") != null)
{
mimeType = regKey.GetValue("Content Type").ToString();
}
return mimeType;
}
#endregion
}
}
Это также необходимо добавить в раздел httpHandlers. И для каждого статического типа файла вы хотите, чтобы он был в состоянии обслуживать. Пример обслуживания файла PNG показан ниже.
<httpHandlers>
<clear />
<add path="*.png" verb="*" type="StaticFileHttpHandler.StaticFileHttpHandler, StaticFileHttpHandler"/>
<add path="*" verb="*" type="IronRuby.Rack.HttpHandlerFactory, IronRuby.Rack"/></httpHandlers>
Мне также нужно было сделать файл images_controller.rb для указания статических файлов.
# This is a place holder controller to allow for mapping static images
class ImagesController < ApplicationController
def index
0
end
end
Далее все * .yml файлы должны быть в двойных кавычках вокруг значений со знаком процента.
field_done_ratio: "% ???????"
Кроме того, мне пришлось закомментировать все создание и удаление индекса в установочных файлах базы данных в папке db \ migrate.
В заключение, можно получить Redmine, в основном работающий с IronRuby, IronRack, IIS 6 и SQL Server 2005, но не без некоторых модификаций.