Od kiedy wyszedł SharePoint 2007 i moje środowisko developerskie zostało podzielone na dwa komputery, zacząłem szukać sposobów ułatwiających sobie pracę. Jednym z głównych problemów, które zwalczałem był deployment assemblies do GAC.
Na samym początku tworzyłem sobie skrypty na post build action w VS, tak by kopiowały mi wszystko na SharePoint a tam miałem ustawiony Windows JOB (w późniejszym okresie Windows service), który mi deployował moje DLLki do GAC jak tylko zostały one wgrane do określonego przeze mnie katalogu. Ogólnie chciałem osiągnąć maksymalnie dużo bez konieczności wchodzenia na serwer i kopiowania ręcznego elementów – każdy kto kiedykolwiek programował na SharePoint wie o czym mówię, średnio traci się jedną do dwóch godzin dziennie na deployment elementów.
Minusem tego rozwiązania była nie tylko usługa sama w sobie, którą trzeba było zainstalować na komputerze docelowym, ale także konieczność zainstalowania gacutil. Tak jak miałem możliwość wpłynięcia na środowisko developerskie by gacutil był tam zainstalowany wraz z dostarczoną mi maszyną, tak moją usługę musiałem instalować już ręcznie.
Wtedy też znalazłem narzędzie PsExec napisane przez SysInternals, które umożliwia wykonywanie poleceń command line zdalnie. Dzięki temu za pomocą komendy:
PSExec \\MyServer "C:\Program Files\Microsoft SDKs\Windows\v6.0\bin\GACUtil.exe" "C:\bin\MyAssembly.dll"
(ścieżki odpowiadają ścieżką lokalnym na serwerze MyServer), byłem wstanie dzięki odpowiednio stworzonemu Post Build Action zainstalować swoją konkretną DLL w GAC a następnie wykonać reset app pool.
Ostatnio zaś natrafiłem na projekt Remote Gacutil (Remote GAC Manager), który nie tylko umożliwia instalowanie DLLek na komputerze zdalnym ale także nie wymaga by komputer posiadał narzędzie GACUtil.
Aplikacja ta, wykorzystuje PsExec do wykonania operacji na serwerze zdalnym, przyczym ona w sama w sobie zawiera narzędzie GACUtil. Standardowo jest to aplikacja okienkowa, gdzie wszystkie operacje jak instalowanie/odinstalowywanie oraz pobieranie DLL z GAC wykonywane jest z okna aplikacji:
Jednakże znów, operacja instalacji wymagała odpalenia aplikacji i dokonania zmian ręcznie. To nie załatwiało tego, co chciałbym osiągnąć. Więc pobrałem sobie jej kod źródłowy i zmodyfikowałem EntryPoint tak by akceptował on parametry z linii poleceń, zarówno do instalacji jak i odinstalowywania DLLek, z modyfikowana funkcja wygląda następująco:
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main(string[] args)
{
if(args.Length == 3)
{
// server na którym ma być zainstalowana DLLka
string server = args[1];
// pełna ścieżka do assembly
// lub assembly full name
// BDATunePIA, Version=6.1.0.0, Culture=neutral,
// PublicKeyToken=31bf3856ad364e35,
// processorArchitecture=x86
string assembly = args[2];
if(args[0] == "i")
{
new GacUtil(server).Install(assembly);
}
else if(args[0] == "u")
{
new GacUtil(server).Uninstall(assembly);
}
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm());
}
I to wszystko! :) Od teraz za pomocą prosty Post Build Actions jestem wstanie z deployować całą swoją aplikację na serwer bez konieczności logowania się na niego.
Plusem tego rozwiązania jest to, iż jest ono ustawiane per project a nie per komputer!
A wy jak sobie radzicie z problemem remote deploymentu?