For managing releases. You can actually add your own NSI script. I'll post mine which is just the default pynsist one with changed default setting to "install for all users" and a command (RMDir /r "$INSTDIR") to delete the whole install directory prior to an install to make no old packages get in the way:
!define PRODUCT_NAME "[[ib.appname]]" !define PRODUCT_VERSION "[[ib.version]]" !define PY_VERSION "[[ib.py_version]]" !define PY_MAJOR_VERSION "[[ib.py_major_version]]" !define BITNESS "[[ib.py_bitness]]" !define ARCH_TAG "[[arch_tag]]" !define INSTALLER_NAME "[[ib.installer_name]]" !define PRODUCT_ICON "[[icon]]" ; Marker file to tell the uninstaller that it's a user installation !define USER_INSTALL_MARKER _user_install_marker SetCompressor lzma !define MULTIUSER_EXECUTIONLEVEL Highest ; !define MULTIUSER_INSTALLMODE_DEFAULT_CURRENTUSER !define MULTIUSER_MUI !define MULTIUSER_INSTALLMODE_COMMANDLINE !define MULTIUSER_INSTALLMODE_INSTDIR "[[ib.appname]]" [% if ib.py_bitness == 64 %] !define MULTIUSER_INSTALLMODE_FUNCTION correct_prog_files [% endif %] !include MultiUser.nsh [% block modernui %] ; Modern UI installer stuff !include "MUI2.nsh" !define MUI_ABORTWARNING !define MUI_ICON "[[icon]]" !define MUI_UNICON "[[icon]]" ; UI pages [% block ui_pages %] !insertmacro MUI_PAGE_WELCOME [% if license_file %] !insertmacro MUI_PAGE_LICENSE [[license_file]] [% endif %] !insertmacro MULTIUSER_PAGE_INSTALLMODE !insertmacro MUI_PAGE_DIRECTORY !insertmacro MUI_PAGE_INSTFILES !insertmacro MUI_PAGE_FINISH [% endblock ui_pages %] !insertmacro MUI_LANGUAGE "English" [% endblock modernui %] Name "${PRODUCT_NAME} ${PRODUCT_VERSION}" OutFile "${INSTALLER_NAME}" ShowInstDetails show Section -SETTINGS SetOutPath "$INSTDIR" SetOverwrite ifnewer SectionEnd [% block sections %] Section "!${PRODUCT_NAME}" sec_app RMDir /r "$INSTDIR" SetRegView [[ib.py_bitness]] SectionIn RO File ${PRODUCT_ICON} SetOutPath "$INSTDIR\pkgs" File /r "pkgs\*.*" SetOutPath "$INSTDIR" ; Marker file for per-user install StrCmp $MultiUser.InstallMode CurrentUser 0 +3 FileOpen $0 "$INSTDIR\${USER_INSTALL_MARKER}" w FileClose $0 SetFileAttributes "$INSTDIR\${USER_INSTALL_MARKER}" HIDDEN [% block install_files %] ; Install files [% for destination, group in grouped_files %] SetOutPath "[[destination]]" [% for file in group %] File "[[ file ]]" [% endfor %] [% endfor %] ; Install directories [% for dir, destination in ib.install_dirs %] SetOutPath "[[ pjoin(destination, dir) ]]" File /r "[[dir]]\*.*" [% endfor %] [% endblock install_files %] [% block install_shortcuts %] ; Install shortcuts ; The output path becomes the working directory for shortcuts SetOutPath "%HOMEDRIVE%\%HOMEPATH%" [% if single_shortcut %] [% for scname, sc in ib.shortcuts.items() %] CreateShortCut "$SMPROGRAMS\[[scname]].lnk" "[[sc['target'] ]]" \ '[[ sc['parameters'] ]]' "$INSTDIR\[[ sc['icon'] ]]" [% endfor %] [% else %] [# Multiple shortcuts: create a directory for them #] CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}" [% for scname, sc in ib.shortcuts.items() %] CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\[[scname]].lnk" "[[sc['target'] ]]" \ '[[ sc['parameters'] ]]' "$INSTDIR\[[ sc['icon'] ]]" [% endfor %] [% endif %] SetOutPath "$INSTDIR" [% endblock install_shortcuts %] [% block install_commands %] [% if has_commands %] nsExec::ExecToLog '[[ python ]] -Es "$INSTDIR\_rewrite_shebangs.py" "$INSTDIR\bin"' nsExec::ExecToLog '[[ python ]] -Es "$INSTDIR\_system_path.py" add "$INSTDIR\bin"' [% endif %] [% endblock install_commands %] ; Byte-compile Python files. DetailPrint "Byte-compiling Python modules..." nsExec::ExecToLog '[[ python ]] -m compileall -q "$INSTDIR\pkgs"' WriteUninstaller $INSTDIR\uninstall.exe ; Add ourselves to Add/remove programs WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \ "DisplayName" "${PRODUCT_NAME}" WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \ "UninstallString" '"$INSTDIR\uninstall.exe"' WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \ "InstallLocation" "$INSTDIR" WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \ "DisplayIcon" "$INSTDIR\${PRODUCT_ICON}" [% if ib.publisher is not none %] WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \ "Publisher" "[[ib.publisher]]" [% endif %] WriteRegStr SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \ "DisplayVersion" "${PRODUCT_VERSION}" WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \ "NoModify" 1 WriteRegDWORD SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \ "NoRepair" 1 ; Check if we need to reboot IfRebootFlag 0 noreboot MessageBox MB_YESNO "A reboot is required to finish the installation. Do you wish to reboot now?" \ /SD IDNO IDNO noreboot Reboot noreboot: SectionEnd Section "Uninstall" SetRegView [[ib.py_bitness]] SetShellVarContext all IfFileExists "$INSTDIR\${USER_INSTALL_MARKER}" 0 +3 SetShellVarContext current Delete "$INSTDIR\${USER_INSTALL_MARKER}" Delete $INSTDIR\uninstall.exe Delete "$INSTDIR\${PRODUCT_ICON}" RMDir /r "$INSTDIR\pkgs" ; Remove ourselves from %PATH% [% block uninstall_commands %] [% if has_commands %] nsExec::ExecToLog '[[ python ]] -Es "$INSTDIR\_system_path.py" remove "$INSTDIR\bin"' [% endif %] [% endblock uninstall_commands %] [% block uninstall_files %] ; Uninstall files [% for file, destination in ib.install_files %] Delete "[[pjoin(destination, file)]]" [% endfor %] ; Uninstall directories [% for dir, destination in ib.install_dirs %] RMDir /r "[[pjoin(destination, dir)]]" [% endfor %] [% endblock uninstall_files %] [% block uninstall_shortcuts %] ; Uninstall shortcuts [% if single_shortcut %] [% for scname in ib.shortcuts %] Delete "$SMPROGRAMS\[[scname]].lnk" [% endfor %] [% else %] RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}" [% endif %] [% endblock uninstall_shortcuts %] RMDir $INSTDIR DeleteRegKey SHCTX "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" SectionEnd [% endblock sections %] ; Functions Function .onMouseOverSection ; Find which section the mouse is over, and set the corresponding description. FindWindow $R0 "#32770" "" $HWNDPARENT GetDlgItem $R0 $R0 1043 ; description item (must be added to the UI) [% block mouseover_messages %] StrCmp $0 ${sec_app} "" +2 SendMessage $R0 ${WM_SETTEXT} 0 "STR:${PRODUCT_NAME}" [% endblock mouseover_messages %] FunctionEnd Function .onInit !insertmacro MULTIUSER_INIT FunctionEnd Function un.onInit !insertmacro MULTIUSER_UNINIT FunctionEnd [% if ib.py_bitness == 64 %] Function correct_prog_files ; The multiuser machinery doesn't know about the different Program files ; folder for 64-bit applications. Override the install dir it set. StrCmp $MultiUser.InstallMode AllUsers 0 +2 StrCpy $INSTDIR "$PROGRAMFILES64\${MULTIUSER_INSTALLMODE_INSTDIR}" FunctionEnd [% endif %] Am Mittwoch, 8. Juli 2020 15:12:22 UTC+2 schrieb kohy...@gmail.com: > > Thank you Stefan, > > I've managed to fix the issue by using pynsist, mayapy.exe work's great > but files sizes are huge :0... PyQt5... > And I can already see the future me having a hard time managing releases... > > Still looking for better solutions :) > > > 2020년 6월 21일 일요일 오후 9시 57분 40초 UTC+9, Stefan Tapper 님의 말: >> >> One other way to work around this would be to use pynsist instead of fbs. >> It creates a Nullsoft installer that contains your python interpreter of >> choice and your application as plain py files. The end user will have an >> Link *.lnk in his Start menu and desktop. So it will appear like an >> executable to the end user. This will work well with mayapy in a subprocess. >> >> https://pynsist.readthedocs.io/en/latest/ >> >> One downside I found is that the Nullsoft installer will not clear the >> install directory prior to installation which might cause headaches with >> updates. But I guess one could easily customize the installer script to do >> that. >> Another downside -could- be that you need compiled wheels of the external >> packages you use which are not always provided on PYPI. >> >> -- You received this message because you are subscribed to the Google Groups "Python Programming for Autodesk Maya" group. To unsubscribe from this group and stop receiving emails from it, send an email to python_inside_maya+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/python_inside_maya/a81cc0fe-5581-401e-a6e1-0778107a6de3o%40googlegroups.com.