Redukcja liczby instalatorów EXE, MSI

Wątek przeniesiony 2024-09-09 10:04 z Inżynieria oprogramowania przez Riddle.

0

Moja aplikacja zajmuje ponad 300MB. Mam instalator EXE (uniwersalny) zrobiony w InnoSetup, MSI (dla przemysłu wymagany) zrobiony w MsiWrapper oraz spakowane pliki tylko do rozpakowania. Jedna aktualizacja zajmuje więc na serwerze prawie 1GB. Wersji aplikacji trochę już jest a zajmowane miejsce rośnie. Staram się to jakoś zredukować. Aktualizacje są dostępne dla 10 wydań wstecz żeby ograniczyć zajmowane miejsce w pierwszym kroku.
W kolejnym korku chce ograniczyć liczbę instalatorów. MSI to must have, wymagania klientów. MSI jest ustawione na cichą instalacje bez żadnych potwierdzeń. W EXE jest możliwość wyboru opcji instalacji i wiadomo co się dzieje podczas instalacji. MSI jest tworzone na podstawie EXE, czyli najpierw i tak tworzone jest EXE i później z tego idzie MSI. W EXE jest wymuszane uprawnienie administratora na potrzeby instalacji sterowników w systemie. Bez uprawnień nie instalowały się dobrze sterowniki i były problemy. W przemyśle używają głównie MSI. Zanim jednak to MSI zainstalują (wymagane konto admina do uprawnień) to userzy chcą sprawdzić czy wersja jest ok itp. Nie mają uprawnień admina więc nie mogą uruchomić instalatora. Prosili więc o wersję tylko do rozpakowania żeby sprawdzić jak to działa, nawet bez pełnych możliwości. Wychodzi więc potrzeba 3 instalatorów.

Macie pomysł jak można to ograniczyć? Zastanawiałem się nad wariantem EXE gdzie można wybrać czy tylko wypakowanie czy instalacja ale już przy uruchomieniu muszę ustawić wymuszenie konta admina. Jak nie wymuszane admina to MSI też nie będzie tego wymagało.
Ktoś mógłby coś doradzić jak to ugryźć?
Opcja instalacji z netu i ciągnięcie tylko tego co się zmieniło nie wystarczy bo nowi userzy i tak muszą mieć instalator.

1

A co jest problemem? To że instalka zajmuje dużo miejsca czy że musisz tworzyć dużo instalatorów?

0

Główny problem to miejsce zajmowane na serwerze przez instalatory. Zredukować rozmiaru instalatorów już nie mam za bardzo jak więc zostaje opcja redukcji rodzajów 'instalatorów'. Wszystko się tworzy w automacie więc liczba instalatorów jako sama liczba nie jest problemem. Ten 1GB to tylko obrazowo podane bo każda aktualizacja jest konkretnie dla 4 (obecnie a w przyszłości pewnie 6) różnych wariantów. Więc z serwera leci 4GB na każdą aktualizację przy czym każda z tych aktualizacji (exe, msi, zip) zawiera dokładne te same pliki więc to trochę marnowanie miejsca dla mnie.
Druga sprawa taka trochę podrzędna to fajnie zrobić coś nowego i czegoś się jeszcze nauczyć w sensie przerobienia instalatórw na różne opcje albo zmiana koncepcji na którą ja aktualnie nie mam pomysłu.

3

A co stoi na przeszkodzie żebyś napisał własny instalator i w zależności od scenariusza wypakowywał te pliki które potrzebujesz bez zbędnego dublowania całości? Trochę pracy ale rozwiązuje to problem i masz pełną kontrolę nad tym co się dzieje. Ja tak zrobiłem gdyż w pewnej aplikacji miała być przeprowadzona wstępna konfiguracja.
Nie pamiętam dokładnie, ale wydaje mi się że innosetup ma możliwość podzielenia instalacji na moduły, więc tam można by wybrać co się ma zainstalować.

1

A z MSi nie mozna wypakowac plikow ?
Zrobic jaki mamy program ktory wypakowuje i nie trzeba tworzyc trzech tylko dwa instalatory ;)

0

Własny instalator to jest jakaś myśl. Nie wiem tylko czy byłbym w stanie sensownie zastąpić funkcjonalność InnoSetup i rozbudować o to co mi potrzebne. InnoSetup jest jednak rozwijane już lata, ma kontrole autualizacji, wersje językowe przy instalacji itd. Pomysł kuszący tylko muszę sie zastanowić czy nie zajęłoby mi to za dużo czasu w stosunku do osiągniętych efektów.

Można mieć moduły w InnoSetup ale jak pisałem to jest opcja po uruchomieniu instalatora a userze nie maja uprawień admina żeby to w ogóle odpalić.
Przed chwilą sprawdzałem jak jest z wypakowaniem MSI ale wyrzuca pliki konfiguracyjne z MSI + exe. W Exe jest instalacja sterowników wymagających uprawnień (sama instalacja tez jest w program files więc wymaga uprawień) więc wypakowanie MSI za dużo nie da. Nikt nie będzie się bawił w wypakowanie MSI żeby dostać się do EXE :) A tworzenie programu do wypakowania programu jak jakieś unpackery ze zcrakowanych gier nie do końca widzę.
Dzięki za różnice sugestie, widzę że zamknąłem się w postrzeganiu tego instalatora. Chyba faktycznie jest kika opcji które jeszcze przećwiczę.

1

W naszych czasach przestrzeń na dysku jest bardzo tania. Jeśli jednak chcesz optymalizować ten koszt, to możesz pójść trzema drogami:

  • zoptymalizować instalator (czyli to, o co pytasz), może okazać się to nieosiągalne;
  • trzymać tylko określoną ilość wersji wstecz;
  • trzymać bieżącą wersję na storage'u typu "hot" (duży koszt, szybki dostęp), a resztę - na "archive" (niski koszt, wolny dostęp).
1

Dlaczego miejsce na serwerze jest problemem? Czy jest kto kwestia kosztu? Skoro macie 4gb per aktualizacja i potrzebujecie mieć ich 10, to raptem 40gb. Dysk o takiej pojemności posiadałem ponad 20 lat temu w moim dosyć budżetowym kompie. Mam wrażenie że ten storage jest u was problematyczny bo trzymacie to na jakimś AWS'ie czy innym chmurowym rozwiązaniu. Mogę się mylić.

1

OK, a powiedz mi - w jaki sposób przebiega u klienta instalacja? W sensie - czy masz pełno klientów, którzy instalują to na nowo, czy raczej masz określoną bazę stałych userów, którzy robią aktualizacje?

Podejrzewam, że raczej jest tak, że wypychasz nową wersję, a obecni klienci się odświeżają/aktualizują. Jest pewnie jakiś odsetek takich, którzy instalują na czysto, ale to raczej niewielka część.

W związku z tym mam taki pomysł:

  • na serwerze trzymasz 1 (najnowszą) wersję PEŁNEGO instalatora dla tych, którzy nie mają niczego i chcą zainstalować apkę od zera (tylko jedna wersja, najnowsza - a nie 10 ostatnich jak masz obecnie)
  • dla pozostałych nie dajesz pełnych instalatorów, ale upgrade/patch. Przecież w tych kilkuset MB z wersji na wersje zmiany są raczej delikatne, zmienia się kilka(naście) plików, a reszta leci taka sama. Także, zamiast dawać pełną instalkę, zrobiłbym takie nakładki, które podnoszą wersję apki jedynie poprzez podmianę tych plików/ustawień, które się zmieniły z wersji na wersję.

Jedyny minus takich aktualizatorów to jest konieczność instalowania ich po kolei. Czyli jeśli masz apkę w wersji 15 i chcesz ją podnieść do wersji 22, to nie możesz (tak, jak w przypadku pełnego instalatora) po prostu odpalić 22, tylko po kolei nakładać 16 na 15, 17 na 16 i tak dalej. Aczkolwiek nie jest to taka wielka tragedia, bo pewnie klienci i tak pilnują aktualizacji i wgrywają bieżące wersje.

0

Aktualiacje są na wykupionym hostingu razem z pocztą i stroną. Jakby to był nasz serwer to faktycznie nie byłoby problemu żeby dołożyć sobie dysk. Może faktycznie trochę przesadzam bo widzę, że miejsca jeszcze trochę jest, pewnie niedługo pozwalniam część miejsca jak powywalam jakieś stare instalatory.
Po wakacjach chciałem po prostu zrobić coś nowego. Odświeżyć to co jest aktualnie ale żeby było to na rozsądnym poziomie technicznym. Wrzucanie 'instalatora' jako spakowany zip nie wydaje mi się profesjonalne.
Jeśli chodzi o aktualizacje 'upgrade/patch' to nie robie apek na androida więc mogę od razu skoczyć z wersji 15 na 22. Nie mam mikroserwisów tylko monoblok więc taka aktualizacja częściowa praktycznie nie istnieje, pcham cały exe i kilka bibiotek.

2

Musisz zadać pytanie co jest droższe - roczny koszt utrzymania większej przestrzeni na hostingu, czy wasza/Twoja praca :).

Jeśli zarabiasz więcej niż 100zł na godzinę, a ogarnięcie tych instalatorów potrwa z 10~20 godzin, to chyba prościej byłoby płacić te X PLN rocznie więcej za hosting. Podejrzewam, że koszt 100gb na hostingu jest mniejszy niż Twoja stawka godzinowa.

Z tego co wiedzę to możecie robić coś dla Janusza, a on skąpi na hostingu i chce z was wycisnąć wszystkie soki, a potem jeszcze będzie marudził że ogarniecie tego kosztowało go więcej niż 1000zł.

0

Ja bym zainwestowal w wiekszy dysk , bo ostatnio jestem coraz bardziej leniwy i choc wiem ze kazdy problem mozna "wywalczyc" to jednak ostatnio swterdzam ze nie warto i lepiej zaplacic za czas/dysk/zasoby itp.

0

Szef w sprawy techniczne nie ingeruje a inicjatywa tych instalatorów ode mnie wyszła. Janusz jest ale z imienia 😉 Chyba faktycznie na razie zostawię tak jak było (chociaż mi się to nie podoba) a w razie czego dokupi się większą przestrzeń. Jak pisałem wcześniej jest okazja (po wakacjach świeży umysł, nowa większa aktualizacja) więc chciałem machnąć też instalator do odświeżenia. Pewnie w wolnym czasie zastanowię się nad tym napisaniem swojego.
Dzięki za dotychczasowe rady.
Jakby ktoś wiedział czy albo jak w InnoSetup zrobić instalator i wypakowanie bez instalacji w jednym exe-ku to chętnie bym skorzyctał. Pytałem AI ale tak nie do końca to działa a próby poprawienia, otrzymania innego rozwiązania na razie marnują czas bo nic z tego nie wychodzi.

0

pcham cały exe i kilka bibiotek.

I taki plik EXE oraz parę DLL zajmuje kilkaset MB? Dobrze rozumiem?

0

I taki plik EXE oraz parę DLL zajmuje kilkaset MB? Dobrze rozumiem?

Tak. W exe jest wkompilowanych kilka bibiotek i to też bardzo podnosi rozmiar. Pisałem pośrednio z tym problemem wcześniej Zagwozdka z FireDAC Connectors Sam rozmiar exe nie jest problemem bo działa to dobrze i łatwo się utrzymuje.

2

A może zrób tak, że pobieraj z serwera pliki potrzebne do instalacji? Zmodyfikujesz tylko sam instalator. Zapewne wyjdzie kilka MB sam instalator. Wtedy będziesz miał 3x kilka MB + 300MB na wersję? A skoro aplikacja zajmuje 300MB to kompresuj to zip'em i wyjdzie jeszcze mniej.

InnoSetup ma jakieś dodatki do tego celu, w ostateczności pewnie da się to oskryptować. A samo rozpakowanie plików bez instalacji da się zrobić wywalając tworzenie wpisów w rejestrze, umieszczanie w Panelu Sterowania w Dodaj/Usuń programy czy tak to się nazywa w najnowszym Win11, tworzenie skrótów tak samo. Robisz tylko zwykłe kopiowanie plików do wybranego przez usera katalogu i działa.

A co do uprawnień admina, to wcale nie są wymagane https://jrsoftware.org/ishelp/index.php?topic=admininstallmode oczywiście z pewnymi ograniczeniami.

Ogólnie trochę za mało konkretnych danych aby coś więcej doradzić. Gdzie te pliki mają być wypakowywane przed sprawdzeniem działania aplikacji, Program Files, czy gdzieś z boku? Sama aplikacja czego wymaga do działania, co jest opcjonalne. W jakim katalogu ma być instalowana.

Czy naprawdę potrzebujesz MSI? Osobiście moim zdaniem domyślne działanie instalatora w trybie silent jest słabym pomysłem. Można przez pomyłkę zrobić sobie kuku. I tak trzeba podnieść uprawnienia, więc jaka różnica wydanie polecenia w skrypcie czy tam akcji podczas logowania do domeny AD z przełącznikiem \silent albo podobnym? Poza tym podczas takiej akcji mają być chyba tylko aktualizowane pliki głównej aplikacji, a nie dodatkowe składniki?

0

Większość apek ma tylko .msi, to taki trochę standard dla instalek, po co ci ten .exe? Żeby userzy mogli sobie sprawdzić to czemu instalka by nie mogła się instalować w userprofile gdy nie ma uprawnień admina? Tak też robi sporo aplikacji

Według mnie potrzebny jest tylko jeden instalator

0

MSI jest właśnie podstawą bo to idzie do przemysłu. Tylko że na razie u mnie MSI jest tworzone z EXE - taki wymóg kreatora MSI. A istnieje grupka klientów którzy dostosowują sobie co i gdzie instalują więc zostaje jeszcze ten exe.
Pomysł z pobieraniem większości rzeczy z serwera jest całkiem niezły. I tak musiałbym jednak utworzyć pełne MSI (jak mają do zainstalowana kilkadziesiąt czy kilkaset instalacji to nie będą ciągnąć za każdym razem po 300MB :] ). Dla reszty faktycznie mogę zrobić exe który pobiera tylko to co potrzebne i to instaluje. Rozwiązałoby to też problem tej wersji tylko do rozpakowania gdzie można będzie pociągnąć i zapisać tylko to co wymagane.
Dzięki za wszystkie pomysły i sugestie. Na razie jak pisałem żeby nie tracić czasu zostawiłem te 3 instalatory 😕 ale przy kolejnej aktualizacji będę kombinował z tymi plikami na serwerze i pobieraniem z serwera.

0

Probwałeś serwować już skompresowane pliki? Binarki zazwyczaj są uber kompresowalne, bo najwięcej miejsca zajmują symbole do debugowania i same symbole. Na dysku możesz trzymać skompresowane pliki natomiast serwer dodaje sam z siebie "Content-Encoding", "gzip" niezależnie od tego czy klient wspiera ten format czy nie

2

Pomysł z pobieraniem większości rzeczy z serwera jest całkiem niezły
[...]
MSI jest właśnie podstawą bo to idzie do przemysłu.

no to tutaj widzę pewien problem - często jak masz jakieś kompy przemysłowe, sterujące produkcją, jakaś automatyka itp, to są one ze względów bezpieczeństwa zabezpieczone - np. odcięte od netu. I jest szansa, że taki komputer używany w przemyśle nie da rady niczego zassać, przez co cały pomysł z instalatorem online można sobie wsadzić w D :P

0
slsy napisał(a):

Probwałeś serwować już skompresowane pliki? Binarki zazwyczaj są uber kompresowalne, bo najwięcej miejsca zajmują symbole do debugowania i same symbole. Na dysku możesz trzymać skompresowane pliki natomiast serwer dodaje sam z siebie "Content-Encoding", "gzip" niezależnie od tego czy klient wspiera ten format czy nie

Ale InnoSetup chyba z urzędu kompresuje wszystkie pliki. Nie mam teraz jak za bardzo sprawdzić, ale u mnie z około 230MB robi 80MB exe'ca więc nie jest źle.

cerrato napisał(a):

no to tutaj widzę pewien problem - często jak masz jakieś kompy przemysłowe, sterujące produkcją, jakaś automatyka itp, to są one ze względów bezpieczeństwa zabezpieczone - np. odcięte od netu. I jest szansa, że taki komputer używany w przemyśle nie da rady niczego zassać, przez co cały pomysł z instalatorem online można sobie wsadzić w D :P

A miało być tak pięknie :D I cały misterny plan poszedł :D O tym nie pomyślałem. Jeśli to jest taki przemysł jak piszesz to może być tak, że kompy są odcięte od sieci i tak pytający będzie musiał tworzyć cały offline'owy instalator w MSI.

Swoją drogą dlaczego @Clarc tworzysz MSI z exe za pomocą jakiegoś narzędzia? Nie lepiej jak @obscurity napisał domyślnie tworzyć MSI, a dodatkowo ten wypakowujący gdzieś z boku jako drugi?

1
Clarc napisał(a):

MSI jest właśnie podstawą bo to idzie do przemysłu. Tylko że na razie u mnie MSI jest tworzone z EXE - taki wymóg kreatora MSI. A istnieje grupka klientów którzy dostosowują sobie co i gdzie instalują więc zostaje jeszcze ten exe.

Z tego co wiem MSI może robić wszystko to co instalka w EXE, więc może po prostu wyświetlać interfejs i dawać możliwości dostosowania. Dopiero po dodaniu flagi /quiet do .msi instaluje się automatycznie i bez UI. Moim zdaniem macie skopaną instalkę i powinniście połączyć to co jest w .exe do .msi, wywalić całkiem .exe, dać możliwość cichej instalacji i instalacji w folderze usera i rozwiązuje to wszystkie problemy jedną instalką.

Zamiast jakiegoś innosetup i msiwrappera użyj wixa

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.