{"id":16889465,"url":"https://github.com/jpakkane/msicreator","last_synced_at":"2025-08-17T08:05:14.120Z","repository":{"id":62149158,"uuid":"136984922","full_name":"jpakkane/msicreator","owner":"jpakkane","description":"Python script to generate MSI installers","archived":false,"fork":false,"pushed_at":"2024-03-12T19:16:48.000Z","size":186,"stargazers_count":109,"open_issues_count":4,"forks_count":21,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-08-04T17:16:04.973Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jpakkane.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"COPYING","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-06-11T21:52:40.000Z","updated_at":"2025-07-07T15:39:48.000Z","dependencies_parsed_at":"2024-02-27T20:29:53.053Z","dependency_job_id":"98c60b2d-8f10-44c6-98a0-1db4bbc04779","html_url":"https://github.com/jpakkane/msicreator","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jpakkane/msicreator","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpakkane%2Fmsicreator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpakkane%2Fmsicreator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpakkane%2Fmsicreator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpakkane%2Fmsicreator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jpakkane","download_url":"https://codeload.github.com/jpakkane/msicreator/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpakkane%2Fmsicreator/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270820793,"owners_count":24651534,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-17T02:00:09.016Z","response_time":129,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-13T16:57:21.298Z","updated_at":"2025-08-17T08:05:14.093Z","avatar_url":"https://github.com/jpakkane.png","language":"Python","funding_links":[],"categories":["Miscellaneous"],"sub_categories":[],"readme":"# MSI creator\n\nThis script generates MSI packages from a JSON description file and\none or more staging directories.\n\n## Quick usage\n\nThis script creates MSI installer packages. It supports both\n[WiX](http://wixtoolset.org/) and\n[msitools](https://wiki.gnome.org/msitools). The installers may have\none or more parts. Understanding the installer is perhaps best learned\nthrough an example.\n\nSuppose that once installed your application looks like this:\n\n```\nc:\\Program Files\\MyProg\\program.exe\nc:\\Program Files\\MyProg\\resources\\image.png\n```\n\nIn order to achieve this you'd need to create two things. The first is\na _staging directory_ that consists of the files below `MyProg` in the\nlayout they will exist in the final result. People familiar with the\nway Unix works can consider this as roughly the result of doing an\ninstall with `DESTDIR` pointing to the staging directory. In addition\nyou need a JSON file describing all metadata required to create the\ninstall, let's call this `myprog.json` and a license file\n`License.rtf`.\n\nTo get the installer started you'd need to create a file and directory\nlayout like this in a directory of your choice:\n\n```\nmyprog.json\nLicense.rtf\nstaging\\program.exe\nstaging\\resources\\image.png\n```\n\nAs you can tell, eventually the contents of `staging` subdir will be\ninstalled in `c:\\Program Files\\MyProg`. The contents of `myprog.json`\nwould look like this:\n\n```json\n{\n    \"upgrade_guid\": \"YOUR-GUID-HERE\",\n    \"version\": \"1.0.0\",\n    \"product_name\": \"Product name here\",\n    \"manufacturer\": \"Your organization's name here\",\n    \"name\": \"Name of product here\",\n    \"name_base\": \"myprog\",\n    \"comments\": \"A comment describing the program\",\n    \"installdir\": \"MyProg\",\n    \"license_file\": \"License.rtf\",\n    \"parts\": [\n        {\n         \"id\": \"MainProgram\",\n         \"title\": \"Program name\",\n         \"description\": \"The MyProg program\",\n         \"absent\": \"disallow\",\n         \"staged_dir\": \"staging\"\n        }\n    ]\n}\n```\n\nThis is all you need. The installer is built by executing this command\nin the top level directory:\n\n```\npython createmsi.py myprog.json\n```\n\nOnce the script finishes the installer will be written into\n`myprog-1.0.0-64.msi` (when run on a 64 bit machine).\n\n## Adding multiple parts to the installer\n\nEach entry in the `parts` array defines a subpart in the installer\nthat the user can choose whether to install. Each of these entries\npoints to a separate staging directory with the contents of that\npart. Thus if you have a project that ships a DLL for using as well as\nan optional development package with an import library and a header,\nyou'd need to split your files in two directories like this:\n\n```\nstaging_main\\foo.dll\nstaging_deve\\foo.lib\nstaging_deve\\foo.h\n```\n\nThen you'd have two entries in the `parts` array, one pointing to\n`staging_main` and the other pointing to `staging_deve`. Set the value\nof `absent` to `disallow` for components that are mandatory, the user\nwon't be able to deselect them so they will always be installed.. If\nthe user intalls both components, the final result would look like\nthis:\n\n```\nc:\\program files\\foo\\foo.dll\nc:\\program files\\foo\\foo.lib\nc:\\program files\\foo\\foo.h\n```\n\nNote how the files end up in the same directory.\n\n## Screenshot\n\n![Screen shot of installer](https://raw.githubusercontent.com/jpakkane/msicreator/master/installer_sshot.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjpakkane%2Fmsicreator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjpakkane%2Fmsicreator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjpakkane%2Fmsicreator/lists"}