Seed Project
Overview
Available since io.Connect Desktop 10.0.4
io.Connect Desktop supports executing custom install and uninstall tasks via command-line triggers, allowing automated execution of scripts and commands during installation and uninstallation processes on both Windows and macOS.
Tasks can copy configuration, register protocols, download resources, clean up data, or back up preferences as part of installation and uninstallation.
Execution Triggers
On Windows, Squirrel passes installation and uninstallation arguments to the platform automatically. For other deployment methods, including a macOS DMG, invoke the manual triggers from your installation or removal process.
The following command-line arguments trigger task execution:
| Argument | Platform | Description |
|---|---|---|
--post-install |
Cross-platform | Execute install tasks (manual trigger). |
--pre-uninstall |
Cross-platform | Execute uninstall tasks (manual trigger). |
--squirrel-install |
Windows | Initial installation (triggered by Squirrel installer). |
--squirrel-uninstall |
Windows | App uninstall (triggered by Squirrel installer). |
--squirrel-updated |
Windows | App update (triggered by Squirrel installer). |
The --post-install and --pre-uninstall flags can be used if you aren't using a Squirrel-based installer or if you want to manually test the install tasks.
⚠️ Note that on Windows, Squirrel executes the install tasks after the initial installation and again after every update. Write install tasks that can run repeatedly without side effects (e.g., check whether a resource exists before creating it).
To trigger the install tasks manually on Windows, execute:
io-connect-desktop.exe --post-installTo trigger the install tasks manually on macOS, execute:
open -a "io.Connect Desktop" --args --post-installTask Files
Install and uninstall tasks are defined in platform-specific JSON configuration files within the /install folder:
tasks.win32.jsondefines Windows tasks.tasks.darwin.jsondefines macOS tasks.
The files are read from <installation_location>/install on both operating systems. The <installation_location> placeholder represents the executable folder on Windows and the app bundle Contents folder on macOS.
To add install tasks to your seed project, create the task files in the /modifications/build/iocd/install directory:
modifications/
└── build/
└── iocd/
└── install/
├── tasks.win32.json (Windows)
└── tasks.darwin.json (macOS)This ensures that the task files are included in your production build.
Defining Tasks
The task files follow this structure:
{
"installTasks": [
{
"type": "run",
"args": {
"filename": "path/to/executable",
"args": "command line arguments",
"dir": "working/directory",
"hide": true,
"unattended": false,
"exitCode0": "success",
"exitCode1": "Custom error message",
"exitCodeN": "success"
}
}
],
"uninstallTasks": [
{
"type": "run",
"args": { /* same structure */ }
}
]
}Each task has "type": "run" and an "args" object. The "installTasks" and "uninstallTasks" arrays contain the tasks for the corresponding operation.
The "args" object has the following properties:
| Property | Type | Description |
|---|---|---|
"args" |
string |
Command-line arguments to pass to the executable. The full command is passed to the system shell for parsing. |
"dir" |
string |
Working directory for the process. Defaults to the install folder if not specified. Supports environment variables. |
"exitCode0" to "exitCodeN" |
string |
Custom exit code handling. Use "success" to mark a non-zero exit code as success, or provide a custom error message. By default, exit code 0 is success and other exit codes are errors. |
"filename" |
string |
Required. Path to the executable or script to run. Supports environment variable expansion (e.g., %TEMP%, %APPDATA%). |
"hide" |
boolean |
Hide the process window (Windows only). Defaults to false. |
"unattended" |
boolean |
Suppress error dialogs. If true, errors are logged only. Defaults to false. |
⚠️ Note that tasks execute sequentially in the order defined. If a task fails with an exit code that isn't mapped to success, execution will stop and subsequent tasks won't run.
Examples
Windows Batch Script
The following example demonstrates how to run installation and cleanup scripts on Windows. Place the scripts beside tasks.win32.json in the packaged /install folder:
{
"installTasks": [
{
"type": "run",
"args": {
"filename": "cmd.exe",
"args": "/c copy-resources.bat",
"hide": true,
"exitCode0": "success",
"exitCode1": "Error copying resources."
}
}
],
"uninstallTasks": [
{
"type": "run",
"args": {
"filename": "cmd.exe",
"args": "/c cleanup.bat",
"hide": true
}
}
]
}macOS Shell Script
The following example demonstrates how to run shell scripts on macOS. Place setup.sh in the packaged /install folder. In this example, cleanup.sh must be available in the explicitly selected /tmp working directory:
{
"installTasks": [
{
"type": "run",
"args": {
"filename": "/bin/bash",
"args": "setup.sh --silent",
"hide": false
}
}
],
"uninstallTasks": [
{
"type": "run",
"args": {
"filename": "/bin/bash",
"args": "cleanup.sh",
"dir": "/tmp"
}
}
]
}Custom Exit Code Mapping
You can map specific exit codes to success or custom error messages:
{
"installTasks": [
{
"type": "run",
"args": {
"filename": "installer.exe",
"args": "--verify",
"exitCode0": "success",
"exitCode1": "Error validating the installation.",
"exitCode2": "Error contacting server.",
"exitCode3": "success",
"exitCode4": "Network timeout - please retry."
}
}
]
}In this example:
- Exit codes 0 and 3 are considered successful.
- Exit codes 1, 2, and 4 will show custom error messages.
- Any other exit code will show a default error message.
Environment Variable Expansion
The "filename", "args", and "dir" properties support environment variable expansion using the %VAR% syntax. The following Windows example demonstrates paths in a task "args" object:
{
"args": {
"filename": "%APPDATA%\\MyCompany\\install-script.bat",
"dir": "%LOCALAPPDATA%\\MyCompany"
}
}Platform Variables
The following environment variables are automatically set by io.Connect Desktop and available for use in all install tasks:
| Variable | Description | Example Value |
|---|---|---|
IO_CD_EXE_NAME |
Executable file name. | io-connect-desktop.exe (Windows)io-connect-desktop (macOS) |
IO_CD_EXE_PATH |
Full path to the executable. Available since io.Connect Desktop 10.4. | C:\Users\...\io-connect-desktop\app-10.0.4\io-connect-desktop.exe (Windows)/Applications/io.Connect Desktop.app/Contents/MacOS/io-connect-desktop (macOS) |
IO_CD_ROOT_DIR |
Root installation directory. | C:\Users\...\io-connect-desktop\app-10.0.4 (Windows)/Applications/io.Connect Desktop.app/Contents (macOS) |
IO_CD_INSTALL_DIR |
Directory containing install tasks. | C:\Users\...\io-connect-desktop\app-10.0.4\install (Windows)/Applications/io.Connect Desktop.app/Contents/install (macOS) |
Troubleshooting
Tasks Not Executing
- Verify that the
install/tasks.win32.json(Windows) orinstall/tasks.darwin.json(macOS) file exists in the correct location. - Check that the file contains valid JSON.
- Ensure the executable paths are correct and accessible.
Failed Tasks
- Review the install log or the console output for error messages.
- Test the script manually to verify it works.
- Check file permissions (especially on macOS - scripts need execute permission).
- Verify environment variables are correctly expanded.
Silent Installation Failures
- Ensure all tasks have
"unattended": trueto prevent error dialogs. - Test each task individually to identify which one is failing.
- Consider adding custom exit code mappings for expected error conditions.
Install Log
Available since io.Connect Desktop 10.4
io.Connect Desktop records the execution of install and uninstall tasks, including the task environment and the output and exit code of each task, in an install.log file:
- On Windows, in
%LocalAppData%/interop.io/io.Connect Desktop/UserData/install/install.log. - On macOS, in
~/Library/Application Support/interop.io/io.Connect Desktop/UserData/install/install.log.
The location doesn't depend on the product name or the configured user data folder.