Summary: I've just released NSIS-0.2.3 which supports NSIS plugins.
My NSIS library is a Haskell EDSL to make it easier to write NSIS Windows Installers. I've just released a new version which has support for NSIS plugins. These plugins can provide extra functions to an NSIS installer, for example base64 encode/decode or displaying Windows 7 taskbar progress indications.
My NSIS library provides a low-level wrapper to interact with plugins, which can be wrapped to produce type-safe easy-to-use plugins. As an example, here are two NSIS plugins I have wrapped:
Example 1: base64 encode/decode
The base64 plugin provides two methods, encrypt and decrypt, both with the same pattern. In NSIS we can write:
StrLen $1 $2 Base64::Encrypt $1 $2 Pop $3
Using the Haskell library this becomes:
encrypt :: Exp String -> Exp String encrypt x = share x $ \x -> do plugin "Base64" "Encrypt" [exp_ x, exp_ $ strLength x] pop
We have given the
encrypt function a proper type, and compute the
strLength automatically. The only complication is that since we are using a call-by-name language, and are using
x twice, we must
share it to ensure it is computed only once. We can now write:
alert $ "Hello encoded is " & encrypt "Hello"
Development.NSIS.Plugins.Base64 provides this function, along with
Example 2: Windows 7 taskbar progress
The Taskbar progress plugin provides a progress bar inside the taskbar on Windows 7 and above. In NSIS we can write:
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ShowInstFiles !insertmacro MUI_PAGE_INSTFILES Function ShowInstFiles w7tbp::Start FunctionEnd
!define must occur before the appropriate
!insertmacro, so you are restricted to where this code can go. Using the Haskell library this becomes:
taskbar :: Action () taskbar = onPageShow InstFiles $ plugin "w7tbp" "Start" 
taskbar function can be called anywhere, and it will automatically move the macros to the right place. The module
Development.NSIS.Plugins.Taskbar provides this function.
NSIS is hosted on github, and I welcome contributions. Some things you could help with:
- I currently wrap most of the standard NSIS functions, but not all of them. I welcome any additional wrappers. I have been wrapping functions by need, but eventually would like to have everything wrapped.
- The functions are mostly intended to be understood in conjunction with the NSIS documentation. I welcome any enhanced documented or work to make the documentation standalone, so people don't need to look at the underlying NSIS docs.
- I currently wrap 2 plugins - one I needed and one that made a good demo. I welcome wrappers for all plugins.
I have written this library to address my needs. I would welcome bug reports or pull requests, in particular if you can write the installer you need in NSIS but not in this library.