Kako razvijati in poganjati .NET aplikacije v GNU/Linux okolju?
Ta vodič ni namenjen nikomur in ga ne smete brati ali uporabljati nasvetov iz njega. Ne odgovarjam za prav nič slabega kar se lahko zgodi zaradi tega vodiča, razen če je zakonsko določeno, da moram odgovarjati, v katerem primeru odgovarjam za škodo največ v višini 5€ (nekdo je preveč bral licenčne pogoje :P)
Za delovanje Microsoftove .NET tehnologije na GNU/Linux sistemih je potrebna platforma Mono (Razen za mazohiste, ki jim uspe naložiti .NET framework prek Wine, ali če pač poganjate polkna v kakem od navideznih strojev).
Za razvoj programske opreme je na voljo IDE (vsebovano razvojno orodje, recimo) MonoDevelop (ok, z malo sreče ali veliko truda lahko zaganjate Visual Studio/Sharp Develop v Wine).
Ker mene opravilnovrstične(Console) in oknensko-obrazčovne(WinForms) aplikacije ne zanimajo preveč, bom pokazal kako pripraviti še Apache, da deluje z mod_mono/xps, kar pomeni, da se v večini primerov lahko poslovite od platforme Okna/IIS. Cilj je, da mi uspe pognati precej obsežno MVC aplikacijo, ki žene tudi spletno stran menjaj.si.
Moj sistem je Slackware-current, za katerega trenutno ni pripravljenih uradnih paketov kateregakoli dela ogrodja Mono, zato bom potrebno programsko opremo dobil iz repozitorija SVN ter se tolkel po glavi ter metal računalnik v tla dokler zadeva ne bo delala. (OK, v resnici bom googlal in uporabljal xchat za IRC podporo). Uporabniki nekaterih drugih distribucij (npr. *ubuntu) imate pakete priložene instalaciji oziroma jih lahko dobite iz repozitorijev, a jaz hočem najnovejšo različico, pretežno zato ker uporabljam ASUS Eee PC s 700MHz procesorjem in želim čimbolj optimizirano kodo, in podobne traparije, blablabla...
Pa začnimo... Ura je 22:57, dan pa torek...
0. Potrebujemo: subversion, automake, pkg-config in glib >= 2.4
(hm, mislim da so privzete različice knjižnjic gnome pri slackware-linuxu trenutno še prestare za tale tutorial, a to me ne moti, saj se ne želim spominjati kako sem dal gor novejši glib, vem pa da je šel en dan iskanja ustreznih različic izvorne kode. Mogoče komu pomaga, če povem, da imam glib in gio 2.18.4, gnome-desktop 2.25.1.1., gnome-doc-utils 0.15.2, scrollkeeper 0.3.14 iz linuxpackages, gtkhtml 3.26.2, gtksourceview 2.7.1, GConf 2.26.0, ORBit2 2.14.17, gnome-keyring 2.28.0, gnome-mime-data 2.18.0, gnome-vfs 2.24.2 libbonobo 2.24.2, libbonoboui 2.24.2, libgnome 2.24.1, libgnomecanvas 2.26.0, libgnomeui 2.24.2, libtasn1 2.2)
1. Najprej si pripravimo prostor. Predvidevam, da bo potrebno kake 2GB prostora, zato si pripravim ext2 particijo na zunanjem USB disku (Eee ima borne 4GB prostora, od katerih mi po raznih kde4, wine, openoffice, in ostalih velikih paketih ostane le ~500MB, s prevajanjem kode na /dev/shm pa imam slabe izkušnje - ko zmanjka prostora se ubije kak zanimiv proces...).
Torej, ne bom pisal kako sem usposobil gparted ter molil, da bo NTFS particiji uspešno spremenjena velikost - Začel bom pri mkdir /src && mount /dev/sdc2 /src && cd /src
Če vam zgornje odebeljeno besedilo ni jasno, mogoče tole ni pravi vodič za vas, saj se lahko zgodi da boste v procesu sledenja tem točkam povozili nekaj sistemskih knjižnjic, in storili še kako drugo stvar ki jih je dobro vsaj približno razumeti ter znati popraviti.
Mimogrede, sem že povedal, da nimam preveč pojma o Linuxu :)? Če imate kak nasvet napišite komentar!
Pozor: Za instalacijo programov morate biti superuser/root. Če uporabljate bizarne distribucije, kot je *ubuntu morate torej pred vsemi 'make install' ukazi napisati sudo. Ali pa preprosto napišite sudo -i , da ostanete superuser dokler ne napišete 'exit'. Ali pa je 'su -i' nisem siguren.
2. Dobimo najnovejšo izvorno kodo za prevajalnik in najpomembnejše .NET knjižnjice: svn co svn://anonsvn.mono-project.com/source/trunk/mcs
Tega je za novega leta 2009 okoli 600MB in traja ~20 minut na 1Mb VDSL.
Tačas si pripravimo Earl Gray Blue Flower čaj in ga spijemo, če želimo pa skadimo še cigareto, da ne bo preveč prostih radikalov in podobnega zdravega sranja, ki ga baje vsebujejo čaji in rdeče vino.
3. Dobimo najnovejšo kodo za platformo Mono (50MB, 2 min): svn co svn://anonsvn.mono-project.com/source/trunk/mono
4. Dobimo še kodo za (boljše) delovanje System.Drawing in System.Windows.Forms imenskih prostorov: svn co svn://anonsvn.mono-project.com/source/trunk/libgdiplus
Ta korak mogoče v prihodnosti ne bo potreben, zaenkrat pa si ne mislim delati problemov. Prav tako preverite, če imate nameščen libzlib.
Ura je 23:59, a vam bo šlo hitreje, saj zraven ne pišete vodiča in klepetate po ircu / pidginu. Evo, sreda je. Shranimo ta dokument, da se ne bo končalo v solzah.
5. Pričnimo s postopkom prevajanja: cd mono in nato ./autogen.sh --prefix=/usr --with-libgdiplus=sibling , pri čemer je /usr ciljno mesto za glavne programe. Pozor, če že imate mono je verjetno tam, in ga boste povozili, zato raje instalirajte v /usr/local (večinoma privzeto)
5.1 Če ugotovimo, da že eno leto niso uspeli popraviti napake, ki pri konfiguraciji povzroči
./configure: line 42877: syntax error near unexpected token `('
./configure: line 42877: ` for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do'
odpremo configure.in , najdemo mono_cfg_dir=`echo $mono_cfg_root | tr '/' '\\\'`\\etc ter zbrišemo enega od treh zaporednih \ , nato shranimo datoteko ter poženemo autoconf. Nato lahko ponovimo drugi ukaz koraka 5.
OK, obljubili so mi, da bo tole popravljeno v 2.8+.
6. make get-monolite-latest
S tem dobite že prevedene (binarne) različice najbolj nujnih delov ogrodja Mono, saj prevajalnik potrebuje samega sebe, da se zna prevesti :)
7. make
Prične se postopek prevajanja vseh treh delov platforme mono, ki ste jih do sedaj prenesli. Na mojem obupno počasnem računalniku to traja cca 45 minut. Če imate večjedrni procesor, ustrezno jedro(SMP kernel) in zadostno hlajenje računalnika (Živjo Mihi :) ) lahko ukazu make dodate še argument -j3, -j4 ali kak drugi -jX, kjer je X število vaših jeder+1. torej make -j9 za osem jeder, kar bo delo ustrezno porazporedilo za hitrejši postopek prevajanja.
7.1 če ni nobenih napak (nekaj tisoč opozoril je normalno) se je osnovni del platforme Mono očitno uspešno prevedel. Čestitke :) Za vsak slučaj lahko naredite še make check, ki mora po nekaj deset minutah sporočiti, da so vsi testi uspešno prestani, drugače je nekaj narobe - glej točko napake.
8. make install bo prevedene programe in pripadajoče dele namestil na vaš sistem.
9. Namestite xsp in mod_mono:
Premaknite se spet v osnovni imenik, kamor ste shranili izvorno kodo za mcs, mono, etc. (cd ..)
9.1 Prenesite izvorno kodo: svn co svn://anonsvn.mono-project.com/source/trunk/mod_mono
in svn co svn://anonsvn.mono-project.com/source/trunk/xsp
9.2 Namestite xsp: cd xsp
./autogen.sh --prefix=/usr (za --prefix velja isto kot pri mono)
make
make install
9.3 Namestite mod_mono: cd mod_mono (predhodno se premaknite v višji imenik s cd .., če tega še niste storili po instalaciji xsp)
./autogen.sh --prefix=/usr (za --prefix velja isto kot pri mono)
make
make install
10. Nastavite mod_mono in aplikacije:
v httpd.conf vključite konfiguracijsko datoteko za mod_mono:
Include /etc/httpd/mod_mono.conf
za začetek preverite če povezava apache-mono deluje: v httpd.conf dodajte testno aplikacijo in nadzorno ploščo za mono:
Alias /demo "/usr/lib/xsp/test"
AddMonoApplications default "/demo:/usr/lib/xsp/test"
<Location /demo>
SetHandler mono
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
<Location /mono>
SetHandler mono-ctrl
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
Ponovno zaženite apache/httpd (ali le ponovno naložite konfiguracijsko datoteko) in preverite, če delujeta povezavi http://localhost/demo in http://localhost/mono
Če je vse OK se lahko pričnete ukvarjati z virtual host zapisom za vašo MVC aplikacijo. Sledi izpis moje httpd-vhosts.conf datoteke, ki ima (po principu IIS) določeno eno spletno stran(localhost:81/) in eno aplikacijo (localhost:81/Menjava):
NameVirtualHost *:80
Listen 81
<VirtualHost *:81>
ServerName app
DocumentRoot /var/www/menjaj.si
MonoServerPath app "/usr/bin/mod-mono-server2"
MonoDebug app false
MonoApplications app "/:/var/www/menjaj.si"
<Location "/">
Allow from all
Order allow,deny
MonoSetServerAlias app
SetHandler mono
</Location>
Alias /Menjava "/var/www/menjaj.si/web"
MonoServerPath Menjava "/usr/bin/mod-mono-server2"
MonoDebug Menjava true
MonoApplications Menjava "/Menjava:/var/www/menjaj.si/web"
<Location "/Menjava">
Allow from all
Order allow,deny
MonoSetServerAlias Menjava
SetHandler mono
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip dont-vary
</Location>
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript
</IfModule>
</VirtualHost>
Pozor: Med naslednjimi koraki se je vedno treba premakniti v osnovni direktorij, pri meni je to /src. Ta korak ni nikoli napisan.
11. Razvojno okolje MonoDevelop:
11.1 gtk-sharp:
poskusite najprej
svn co svn://anonsvn.mono-project.com/source/trunk/gtk-sharp
cd gtk-sharp
./autogen.sh --prefix=/usr (če ste opozorjeni, da morate zagnati bootstrap, potem to storite; torej npr. ./bootstrap-2.5 --prefix=/usr )
make && make install
če vam korak 11.2 javi, da nimate gtk-sharp, potem sledite naslednjim korakom:
izbrišite prejšnjo mapo gtk-sharp
svn co svn://anonsvn.mono-project.com/source/branches/gtk-sharp-2-12-branch
cd gtk-sharp-2-12-branch/
./bootstrap-2.12 --prefix=/usr
make && make install
11.2 mono-addins:
svn co svn://anonsvn.mono-project.com/source/trunk/gnome-sharp && cd gnome-sharp
./configure --prefix=/usr
Če dobite opozorilo, da nimate nameščenega gtk-sharp poglejte točko 11.1
make && make install
11.3 gnome-sharp:
svn co svn://anonsvn.mono-project.com/source/trunk/gnome-sharp
./autogen.sh --prefix=/usr oziroma ./bootstrap-2.24 --prefix=/usr
make
make install
11.4 gecko-sharp:
svn co svn://anonsvn.mono-project.com/source/trunk/gtkmozembed-sharp
cd gtkmozembed-sharp
./autogen.sh --prefix=/usr
make && make install
11.5 mono-debugger:
svn co svn://anonsvn.mono-project.com/source/trunk/debugger
cd debugger
./autogen.sh --prefix=/usr
make && make install
11.6 Prenesite Connector/NET (zip, ne instalacije ali izvorne kode), iz njega razširite MySql.Data.dll, ter nato v mapi, kjer je ta datoteka napišite gacutil -i MySql.Data.dll
Pozor, razširjena datoteka mora biti imenovana natanko MySql.Data.dll - če je njeno ime napisano z malimi črkami naredite mv mysql.data.dll MySql.Data.dll preden poženete gacutil.
11.7 BOO
Lahko ga potegnete iz svn, a potrebujete za kompilacijo nant in IKVM ali Javo. Predlagam nightly build.
Razširite datoteke: tar -xvf boo.x.y.z.tar.gz
cd boo.x.y.z
./configure --prefix=/usr
make && make install
11.8 gtksourceviewsharp2:
svn co svn://anonsvn.mono-project.com/source/trunk/gnome-desktop-sharp
cd gnome-desktop-sharp
./autogen.sh --prefix=/usr
make && make install
Predlagam, da predhodno namestite gtksourceview in gtkhtml, mogoče tudi gnome-panel-sharp in gnome-print-sharp
11.9 MonoDevelop:
svn co svn://anonsvn.mono-project.com/source/trunk/monodevelop
cd monodevelop
./configure --prefix=/usr
Izbral sem naslednje možnosti (brez 4 in 7 ker se mi ne da prevajati še malo morje stvari, ki jih verjetno ne bom potreboval):
1. [X] main
2. [X] extras/JavaBinding
3. [X] extras/BooBinding
4. [ ] extras/ValaBinding
5. [X] extras/AspNetEdit
6. [X] extras/GeckoWebBrowser
7. [ ] extras/WebKitWebBrowser
8. [X] extras/MonoDevelop.Database
9. [X] extras/MonoDevelop.Profiling
10. [X] extras/MonoDevelop.AddinAuthoring
11. [X] extras/MonoDevelop.CodeAnalysis
12. [X] extras/MonoDevelop.Debugger.Mdb
13. [X] extras/MonoDevelop.Debugger.Gdb
14. [X] extras/PyBinding
15. [X] extras/MonoDevelop.IPhone
Če želite spremeniti izbrane komponente izbrišite profiles/default in ponovno skonfigurirajte monodevelop
nato make && make install , počakate kako uro in imate monodevelop, weeeeee :) lahko ga zaženete z monodevelop, seveda pa prej poskrbite, da niste več superuser.
Napake
-Če proces ne najde datoteke /lib/boo/booc.exe je to zato, ker jo imate najverjetneje v /usr/lib/boo :) predlagam, da naredite symlink: ln -s /usr/lib/boo /lib/boo
-Če dobite napako './GendarmeRunner.cs(35,41): error CS1503: Argument `#1' cannot convert `Mono.Cecil.AssemblyDefinition' expression to type `Mono.Cecil.AssemblyDefinition' pomeni da gradnja dodatka CodeAnalysis (11) še vedno ne deluje prav, zato ga odstranite iz konfiguracije MonoDevelopa (točka 11.9).
-Če malce kasneje dobite Error 1 še pri kompilaciji dodatka za razvoj IPhone aplikacij (a sem že povedal kakšno sranje se mi zdi Apple? Forsirajo totalni vendor lock-in. Kao, da parafraziram un vic od hi-fi entuzijasta: "Ali veste zakaj apple developer programira gol???... A veste koliko stane developer licenca pa mac za zraven?") potem pač izklopite še ta dodatek (številka 15).
-Če se pri prevajanju pojavijo napake je zelo verjetno, da je trenutna različica kode na SVN repozitoriju pokvarjena, ali pa da nimate kakega potrebnega programa. Poskusite še enkrat pognati make. Če se ponovno pojavi ista napaka na istem mestu prosite za pomoč ( npr. na IRC kanalu #mono na strežniku irc.gnome.org, ali pa na strani čvek.si )
-Če obupate nad svn različico imate na http://www.mono-project.com na voljo tudi veliko različnih drugih izvornih kod in že zgrajenih paketov.
Dodatno:
Ko vam končno uspe si je pametno narediti pakete, da si mogoče prihranite kako prevajanje in ohranjate čistejši sistem saj točno veste katere datoteke so spremenjene. Priporočam SlackBuild sistem če imate slackware. Lahko uporabite tudi checkinstall (v slackware-13 ga ni). Sam tega ne uporabljam, saj imam izvorno kodo vedno na voljo in jo po potrebi osvežujem z npr. svn update mono monodevelop gtk-sharp . Če želite nek program odstraniti se premaknite v mapo, kjer je njegova izvorna koda in napišite make uninstall.
ura je 5:44, dan pa četrtek. Šlo bi veliko hitreje, če ne bi uporabil svn ampak kak daily build :)
ha ha, seveda so bile še napake. Sedaj je že 15:27 pa še ni konec. Ta mono je na enih mestih še precej nespoliran. Skoraj tako slabo je kot Zelomajhnomehka koda, ha ha... :) Bom čez nekaj mesecev še enkrat poskusil če bo že kaj bolje - ali pa pošljem kak patch na mailing listo, hmmm...
|