ClickOnce - o treabă făcută pe jumătate ?
ClickOnce versus Msi
În ultima vreme, am urmârit cu interes câteva prezentări despre noua tehnologie de deployment din .Net 2.0 – ClickOnce. Şi pentru prima dată, am senzaţia că am priceput cum stă treaba.
Aveţi ocazia să-mi dovediţi contrariul.
De ce ClickOnce ? Aveam MSI !
Întrebarea asta mă rodea de mai mult timp. Care e relaţia între ClickOnce şi Windows Installer (msi)? Va înlocui ClickOnce Msi-urile pentru aplicaţii .Net ?
MSI e o tehnologie foarte puternică şi matură. MSI poate face aproape orice şi-ar putea dori un developer de kit-uri – şi de cele mai multe ori, aşa cum bine a subliniat Ovidiu Platon, poate face mult mai mult decât se aşteaptă un programator sau un administrator.
Lucrez ca programator în cadrul departamentului de dezvoltare software al unei firme non-IT – clientul meu deci e chiar firma care mă plăteşte. Altfel zis - admin-ul clientului meu lucrează în celălalt birou şi il pot auzi cum trănteşte uşa ori de câte ori se enervează. Apropierea asta de admin m-a obligat să mă pun la curent cu modalităţile de deployment în Enterprise – nu de alta, dar adminul meu e prea urâcios ca să risc să-i spun că ar trebui să instaleze manual o dată la două săptămâni câte un update pe vreo 80 de computere...
Aşa am ajuns să apreciez combinaţia Active Directory/MSI advertising. O chestie super practică, uşor de pus pe picioare, dar din păcate prea puţin cunoscută. Ideea e următoarea : o aplicaţie care cere privilegii speciale la instalare poate fi instalată doar de pe un cont de administrator. Exemple sunt destule – orice aplicaţie care scrie în registry, care înregistrează obiecte COM, pune assembly-uri în GAC, creează o sursă de log in Event Log sau doar vrea să pună un icon pe desktop-ul din All Users.
Există însă o facilitate prea puţin cunoscută – un administrator poate doar să „facă reclamă” unei aplicaţii (advertise). Folosind “msiexec /jm nume.msi” de pe contul de admin, se crează doar iconiţele pe desktop sau în Start -> Programs – restul fişierelor nu sunt instalate. Dacă însă un user fără drepturi speciale va da dublu click pe iconiţa de “reclamă”, va determina pornirea instalării efective a aplicaţiei cu drepturi de admin. (Probabil ăsta e motivul pentru care msiexec este un serviciu – pentru ca procesul de instalare invocat de un user fără privilegii să poată fi executat sub local system account). Nu, nu e o breşă de securitate – pentru ca doar administratorul hotărăşte de la început ce aplicaţii vor fi “advertise” pe un calculator.
Cu toate că e cool, advertise-ul nu pare util în prea multe situaţii la prima vedere. Devine însă foarte interesant în combinaţie cu Group Policy Objects din Active Directory. Pe scurt, se poate crea o politică la nivelul unei întregi reţele care să specifice ce useri pot beneficia de o anumită aplicaţie. Indiferent de computerul pe care se logează, unui user i se vor crea automat, la log-on, prin advertise, iconiţele de care are nevoie pe desktop. Un dublu click pe o astfel de iconiţă determină instalarea imediată a aplicaţiei. Se pot face chiar şi update-uri de aplicaţii în acest mod – e suficient ca adminul să definească o nouă politică prin care să specifice un nou msi care va înlocui aplicaţia anterioară.
Aşadar existau, cel puţin la nivel de Enterprise, soluţii de deployment şi AutoUpdate destul de practice. De ce totuşi ClickOnce ?
Msi-ul e o soluţie super elaborată, creată ca răspuns la DLL hell. Ani de zile, programatorii au fost încurajaţi să dezvolte aplicaţii care îşi pun în comun dll-uri şi resurse; orice kit de instalare putea să aducă o versiune mai nouă sau mai veche al unui astfel de dll – iar Windows Installer-ul avea ca misiune principală gestionarea şi arbitrarea unor potenţiale conflicte între versiuni diferite ale aceluiaşi DLL partajat între aplicaţii.
.Net-ul vine însă cu o abordare revoluţionară: adio dll-uri partajate. Orice aplicaţie va funcţiona doar cu versiunea dll-ului cu care a fost compilată – motiv penstru care se încurajează ca o aplicaţie să conţină toate dll-urile necesare chiar în directorul aplicaţiei. Hard disk-urile sunt suficient de mari – nu putem considera că risipim spaţiu cu dll-uri redundante în fiecare director de aplicaţie. Iar potenţialele beneficii pe care le-ar aduce aplicaţiei X înlocuirea de către aplicaţia Y a unui dll comun cu o versiune mai nouă sunt mult mai mici decăt riscul ca noua versiune să fie incompatibilă cu aplicaţia X. Dacă aplicaţia X ar putea beneficia de o versiune mai nouă a dll-ului în cauză, ar fi de preferat ca aplicaţia X să fie recompilată, retestată şi re-deploy-ată cu noua versiune de dll. Pe calculatorul userului nu vor mai ajunge combinaţii aplicaţie/dll care nu au fost luate în calcul de către developer şi tester.
Altfel zis, nu mai încercăm să gestionăm dll hell-ul – ci pur şi simplu renunţăm la dll-urile comune. Microsoft-ul a tăiat nodul gordian.
Această nouă abordare pe care o aduce .Net-ul, ridică semne de întrebare asupra utilităţii Windows Installer-ului (msi-ului). La drept vorbind, Windows Installer-ul a fost creat pentru a gestiona dll hell-ul – şi tocmai am decis că nu mai vrem să gestionăm nimic – vom copia fiecare dll în directorul fiecărei aplicaţii. .Net-ul ar putea beneficia de pe urma unui sistem simplificat de deployment, care să pună în practică XCopy deployment şi să cuprindă suport pentru AutoUpdate.
Faceţi cunoştinţă cu ClickOnce.
ClickOnce permite copierea unei aplicaţii de pe un server de web spre exemplu în profilul userului care are nevoie de serviciile acelei aplicaţii. ClickOnce nu va face niciodata mai mult decat să aducă fisierele local şi să pună vreun icon pe desktop-ul acelui user. ClickOnce va rula întotdeauna sub credenţialele userului logat – sub nici o formă nu îşi propune să suporte scenarii gen Advertise, menite să dea posibilitatea unui user fără privilegii speciale să instaleze o aplicaţie care a fost aprobată în prealabil de un admin. Aprobarea admin-ului se va face pe viitor nu sub forma definirii unei liste de aplicaţii safe, pe care un user are dreptul să le instaleze (prin publish sau advertise) – ci mai curând prin specificarea unor politici de securitate (~CAS) pe care aplicaţiile instalabile trebuie să le respecte. Spre exemplu, s-ar putea defini ca userul să aibă dreptul să instaleze orice aplicaţie atâta timp căt acea aplicaţie nu necesită accesarea sistemului de fişiere sau nu cere să se conecteze la internet (no more spyware).
Frumoasă idee.
Dar ce lipseşte? Ei bine, m-aş simţi mai liniştit dacă aş avea siguranţa că soluţia e completă.
1. Pentru a motiva introducerea SmartClients-urilor, prezentările Microsoft aduc de fiecare dată în discuţie costurile de deployment pentru soluţiile clasice windows forms în Enterprise (se foloseşte SMS-ul pentru a speria puţin audienţa). Eu interpretez asta ca pe o promisiune din partea Microsoft de a susţine Smart Clients (= ClickOnce) ca alternativă la sistemele clasice de deployment. .Net 2,0 însă e doar jumătate din treabă.
E drept, fiecare user al meu ar avea posibilitatea să-şi instaleze aplicaţia pe profilul personal prin simpla accesare a unui URL. Întrebarea e : care url ? Există vreo modalitate la nivelul Enterprise-ului de a publica URL-urile aplicaţiilor către user ? Mă gândesc la un sistem care să înlocuiască Advertise-ul aplicaţiilor cu Active Directory GPOs, nu la mass mailing sau SharePoint. Userii din enterprise sunt obişnuiţi să-şi găsească pe desktop iconiţele de care au nevoie şi nu au obiceiul ca atunci când iconiţele le lipsesc să-şi verifice mailul în căutarea link-ului salvator. Aş vrea să aud şi vocea celor de la Active Directory cântând la unison cu cei de la .Net Framework.
2. .Net-ul aduce o revoluţie în problema dll hell-ului. Fiecare aplicaţie cu dll-urile sale. Gata cu incompatibilităţie. Însă în acelaşi timp, am renunţam şi la beneficiile dll-urilor partajate. Ei bine, uneori actualizarea unui dll comun putea fi benefic pentru toate aplicaţiile care îl foloseau. Acum însă, va trebui să actualizăm fiecare din aplicaţiile existente independent. Vă aduceţi aminte? Compilare – testare – deployment pentru fiecare aplicaţie, ori de câte ori un dll (fost) partajat a fost modificat. Doar aşa o aplicaţie poate beneficia de bug fix-urile din aceste dll-uri.
Costurile procesului de compilare – testare – deployment vor trebui însă să fie cât mai mici pentru a putea permite redeployment-ul fiecărei aplicaţii la fiecare fixare a unui bug într-o bibliotecă partajată. Pentru developer, asta se traduce în necesitatea unui sistem de automatizare a build-urilor care să cuprindă inclusiv faza de realizare a kitului aplicaţiilor. E absolut necesar ca generarea acelor manifeste (fişiere xml) care descriu kitul aplicaţiei să fie realizabilă nu doar dintr-un wizard (util pentru obţinerea primului kit) – ci şi în mod automatizat (linie de comandă) pentru a suporta build script-urile. Dacă Microsoft lasă in seama programatorului crearea uneltelor necesare regenerării acelor manifeste pe baza dependinţelor aplicaţiei se chemă că nu a făcut treaba decât pe jumătate.
În ultima vreme, am urmârit cu interes câteva prezentări despre noua tehnologie de deployment din .Net 2.0 – ClickOnce. Şi pentru prima dată, am senzaţia că am priceput cum stă treaba.
Aveţi ocazia să-mi dovediţi contrariul.
De ce ClickOnce ? Aveam MSI !
Întrebarea asta mă rodea de mai mult timp. Care e relaţia între ClickOnce şi Windows Installer (msi)? Va înlocui ClickOnce Msi-urile pentru aplicaţii .Net ?
MSI e o tehnologie foarte puternică şi matură. MSI poate face aproape orice şi-ar putea dori un developer de kit-uri – şi de cele mai multe ori, aşa cum bine a subliniat Ovidiu Platon, poate face mult mai mult decât se aşteaptă un programator sau un administrator.
Lucrez ca programator în cadrul departamentului de dezvoltare software al unei firme non-IT – clientul meu deci e chiar firma care mă plăteşte. Altfel zis - admin-ul clientului meu lucrează în celălalt birou şi il pot auzi cum trănteşte uşa ori de câte ori se enervează. Apropierea asta de admin m-a obligat să mă pun la curent cu modalităţile de deployment în Enterprise – nu de alta, dar adminul meu e prea urâcios ca să risc să-i spun că ar trebui să instaleze manual o dată la două săptămâni câte un update pe vreo 80 de computere...
Aşa am ajuns să apreciez combinaţia Active Directory/MSI advertising. O chestie super practică, uşor de pus pe picioare, dar din păcate prea puţin cunoscută. Ideea e următoarea : o aplicaţie care cere privilegii speciale la instalare poate fi instalată doar de pe un cont de administrator. Exemple sunt destule – orice aplicaţie care scrie în registry, care înregistrează obiecte COM, pune assembly-uri în GAC, creează o sursă de log in Event Log sau doar vrea să pună un icon pe desktop-ul din All Users.
Există însă o facilitate prea puţin cunoscută – un administrator poate doar să „facă reclamă” unei aplicaţii (advertise). Folosind “msiexec /jm nume.msi” de pe contul de admin, se crează doar iconiţele pe desktop sau în Start -> Programs – restul fişierelor nu sunt instalate. Dacă însă un user fără drepturi speciale va da dublu click pe iconiţa de “reclamă”, va determina pornirea instalării efective a aplicaţiei cu drepturi de admin. (Probabil ăsta e motivul pentru care msiexec este un serviciu – pentru ca procesul de instalare invocat de un user fără privilegii să poată fi executat sub local system account). Nu, nu e o breşă de securitate – pentru ca doar administratorul hotărăşte de la început ce aplicaţii vor fi “advertise” pe un calculator.
Cu toate că e cool, advertise-ul nu pare util în prea multe situaţii la prima vedere. Devine însă foarte interesant în combinaţie cu Group Policy Objects din Active Directory. Pe scurt, se poate crea o politică la nivelul unei întregi reţele care să specifice ce useri pot beneficia de o anumită aplicaţie. Indiferent de computerul pe care se logează, unui user i se vor crea automat, la log-on, prin advertise, iconiţele de care are nevoie pe desktop. Un dublu click pe o astfel de iconiţă determină instalarea imediată a aplicaţiei. Se pot face chiar şi update-uri de aplicaţii în acest mod – e suficient ca adminul să definească o nouă politică prin care să specifice un nou msi care va înlocui aplicaţia anterioară.
Aşadar existau, cel puţin la nivel de Enterprise, soluţii de deployment şi AutoUpdate destul de practice. De ce totuşi ClickOnce ?
Msi-ul e o soluţie super elaborată, creată ca răspuns la DLL hell. Ani de zile, programatorii au fost încurajaţi să dezvolte aplicaţii care îşi pun în comun dll-uri şi resurse; orice kit de instalare putea să aducă o versiune mai nouă sau mai veche al unui astfel de dll – iar Windows Installer-ul avea ca misiune principală gestionarea şi arbitrarea unor potenţiale conflicte între versiuni diferite ale aceluiaşi DLL partajat între aplicaţii.
.Net-ul vine însă cu o abordare revoluţionară: adio dll-uri partajate. Orice aplicaţie va funcţiona doar cu versiunea dll-ului cu care a fost compilată – motiv penstru care se încurajează ca o aplicaţie să conţină toate dll-urile necesare chiar în directorul aplicaţiei. Hard disk-urile sunt suficient de mari – nu putem considera că risipim spaţiu cu dll-uri redundante în fiecare director de aplicaţie. Iar potenţialele beneficii pe care le-ar aduce aplicaţiei X înlocuirea de către aplicaţia Y a unui dll comun cu o versiune mai nouă sunt mult mai mici decăt riscul ca noua versiune să fie incompatibilă cu aplicaţia X. Dacă aplicaţia X ar putea beneficia de o versiune mai nouă a dll-ului în cauză, ar fi de preferat ca aplicaţia X să fie recompilată, retestată şi re-deploy-ată cu noua versiune de dll. Pe calculatorul userului nu vor mai ajunge combinaţii aplicaţie/dll care nu au fost luate în calcul de către developer şi tester.
Altfel zis, nu mai încercăm să gestionăm dll hell-ul – ci pur şi simplu renunţăm la dll-urile comune. Microsoft-ul a tăiat nodul gordian.
Această nouă abordare pe care o aduce .Net-ul, ridică semne de întrebare asupra utilităţii Windows Installer-ului (msi-ului). La drept vorbind, Windows Installer-ul a fost creat pentru a gestiona dll hell-ul – şi tocmai am decis că nu mai vrem să gestionăm nimic – vom copia fiecare dll în directorul fiecărei aplicaţii. .Net-ul ar putea beneficia de pe urma unui sistem simplificat de deployment, care să pună în practică XCopy deployment şi să cuprindă suport pentru AutoUpdate.
Faceţi cunoştinţă cu ClickOnce.
ClickOnce permite copierea unei aplicaţii de pe un server de web spre exemplu în profilul userului care are nevoie de serviciile acelei aplicaţii. ClickOnce nu va face niciodata mai mult decat să aducă fisierele local şi să pună vreun icon pe desktop-ul acelui user. ClickOnce va rula întotdeauna sub credenţialele userului logat – sub nici o formă nu îşi propune să suporte scenarii gen Advertise, menite să dea posibilitatea unui user fără privilegii speciale să instaleze o aplicaţie care a fost aprobată în prealabil de un admin. Aprobarea admin-ului se va face pe viitor nu sub forma definirii unei liste de aplicaţii safe, pe care un user are dreptul să le instaleze (prin publish sau advertise) – ci mai curând prin specificarea unor politici de securitate (~CAS) pe care aplicaţiile instalabile trebuie să le respecte. Spre exemplu, s-ar putea defini ca userul să aibă dreptul să instaleze orice aplicaţie atâta timp căt acea aplicaţie nu necesită accesarea sistemului de fişiere sau nu cere să se conecteze la internet (no more spyware).
Frumoasă idee.
Dar ce lipseşte? Ei bine, m-aş simţi mai liniştit dacă aş avea siguranţa că soluţia e completă.
1. Pentru a motiva introducerea SmartClients-urilor, prezentările Microsoft aduc de fiecare dată în discuţie costurile de deployment pentru soluţiile clasice windows forms în Enterprise (se foloseşte SMS-ul pentru a speria puţin audienţa). Eu interpretez asta ca pe o promisiune din partea Microsoft de a susţine Smart Clients (= ClickOnce) ca alternativă la sistemele clasice de deployment. .Net 2,0 însă e doar jumătate din treabă.
E drept, fiecare user al meu ar avea posibilitatea să-şi instaleze aplicaţia pe profilul personal prin simpla accesare a unui URL. Întrebarea e : care url ? Există vreo modalitate la nivelul Enterprise-ului de a publica URL-urile aplicaţiilor către user ? Mă gândesc la un sistem care să înlocuiască Advertise-ul aplicaţiilor cu Active Directory GPOs, nu la mass mailing sau SharePoint. Userii din enterprise sunt obişnuiţi să-şi găsească pe desktop iconiţele de care au nevoie şi nu au obiceiul ca atunci când iconiţele le lipsesc să-şi verifice mailul în căutarea link-ului salvator. Aş vrea să aud şi vocea celor de la Active Directory cântând la unison cu cei de la .Net Framework.
2. .Net-ul aduce o revoluţie în problema dll hell-ului. Fiecare aplicaţie cu dll-urile sale. Gata cu incompatibilităţie. Însă în acelaşi timp, am renunţam şi la beneficiile dll-urilor partajate. Ei bine, uneori actualizarea unui dll comun putea fi benefic pentru toate aplicaţiile care îl foloseau. Acum însă, va trebui să actualizăm fiecare din aplicaţiile existente independent. Vă aduceţi aminte? Compilare – testare – deployment pentru fiecare aplicaţie, ori de câte ori un dll (fost) partajat a fost modificat. Doar aşa o aplicaţie poate beneficia de bug fix-urile din aceste dll-uri.
Costurile procesului de compilare – testare – deployment vor trebui însă să fie cât mai mici pentru a putea permite redeployment-ul fiecărei aplicaţii la fiecare fixare a unui bug într-o bibliotecă partajată. Pentru developer, asta se traduce în necesitatea unui sistem de automatizare a build-urilor care să cuprindă inclusiv faza de realizare a kitului aplicaţiilor. E absolut necesar ca generarea acelor manifeste (fişiere xml) care descriu kitul aplicaţiei să fie realizabilă nu doar dintr-un wizard (util pentru obţinerea primului kit) – ci şi în mod automatizat (linie de comandă) pentru a suporta build script-urile. Dacă Microsoft lasă in seama programatorului crearea uneltelor necesare regenerării acelor manifeste pe baza dependinţelor aplicaţiei se chemă că nu a făcut treaba decât pe jumătate.
