NSIS Create components based on folders

自作多情 提交于 2019-12-11 05:38:30

问题


I'm working on creating an installer that has several applications that can be optionally installed. I'd like to write my installer script so that I don't need to update it every time I add a new application to my apps directory. Is this possible with NSIS? I've got code to search through a folder for sub folders and extract their names, but am having trouble using that to make components in the installer.


Folder Structure

-Install_Directory
    -Main_Application    
    -Applications
        -App_A
        -App_B
        -App_C
        -...

Current Code

!macro insert_application_section name
  Section "${name}"
    SetOutPath "{PRJ_BASE}\releases"
    File /nonfatal /r "..\releases\${name}"
  SectionEnd
!macroend

SectionGroup "Applications"
    !insertmacro insert_release_section "App_A"
SectionGroupEnd

The installer compiles but throws an "Error opening file for writing" error when trying to install files from a sub folder of Application created from the macro. Is there a way to achieve what I'm trying to do with NSIS?

My current working plan is to have a python file that generates a section for each sub folder of Applications and puts it in an "autogen_sections.nsh" file which the actual installer includes at the end of the file. That seems to work, but does seem a bit clunky. Any tips for how to do this with just NSIS would be greatly appreciated!


回答1:


"{PRJ_BASE}\releases" is not a valid path. SetOutPath is usually set to $InstDir or a sub-folder inside $InstDir. If PRJ_BASE is a define starting with $InstDir then you must use "${PRJ_BASE}\releases" and not "{PRJ_BASE}\releases".

NSIS has the !system command that lets you call external programs and batch files at compile-time:

; Generate batch file on the fly because this is a self-contained example
!delfile "creatensh.bat"
!appendfile "creatensh.bat" '@echo off$\r$\n'
!appendfile "creatensh.bat" 'cd /D %1$\r$\n'
!appendfile "creatensh.bat" 'FOR /D %%A in (*) DO ($\r$\n'
!appendfile "creatensh.bat" '   >> %2 echo !insertmacro insert_application_section "%%~A"$\r$\n'
!appendfile "creatensh.bat" ')$\r$\n'

; Running the batch file
!define PRJ_BASE "$InstDir\Something"

!macro insert_application_section name
  Section "${name}"
    SetOutPath "${PRJ_BASE}\releases"
    File /nonfatal /r "..\releases\${name}"
  SectionEnd
!macroend

!tempfile tmpnsh
!system '"creatensh.bat" "c:\myfiles\Install_Directory\Applications" "${tmpnsh}"'
!include "${tmpnsh}"
!delfile "${tmpnsh}"

NSIS cannot enumerate a directory tree at compile time, you must use some kind of external application or script.



来源:https://stackoverflow.com/questions/49864960/nsis-create-components-based-on-folders

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!