{"id":20851147,"url":"https://github.com/elementbound/godpak","last_synced_at":"2025-07-31T01:37:08.052Z","repository":{"id":197012157,"uuid":"697510990","full_name":"elementbound/godpak","owner":"elementbound","description":null,"archived":false,"fork":false,"pushed_at":"2023-10-26T11:16:38.000Z","size":90,"stargazers_count":2,"open_issues_count":6,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-12T12:42:04.040Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/elementbound.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2023-09-27T22:07:08.000Z","updated_at":"2023-11-11T13:40:40.000Z","dependencies_parsed_at":null,"dependency_job_id":"babe138b-9807-491f-861b-bf6c439b4973","html_url":"https://github.com/elementbound/godpak","commit_stats":null,"previous_names":["elementbound/godpak"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/elementbound/godpak","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elementbound%2Fgodpak","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elementbound%2Fgodpak/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elementbound%2Fgodpak/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elementbound%2Fgodpak/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/elementbound","download_url":"https://codeload.github.com/elementbound/godpak/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elementbound%2Fgodpak/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267972901,"owners_count":24174395,"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-07-30T02:00:09.044Z","response_time":70,"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-11-18T03:12:37.307Z","updated_at":"2025-07-31T01:37:08.030Z","avatar_url":"https://github.com/elementbound.png","language":"JavaScript","readme":"# godpak\n\nA dependency manager for Godot.\n\n## Problem statement\n\nGodot has a very useful and simple addon mechanism. Basically each project has\nan *addons* directory where addons can be added. Installing an addon is as\nsimple as unpacking a zip or copying a directory to the right place. This has\nspawned a really nice ecosystem around itself, with the likes of the [Godot\nAsset Library] or the [Godot Asset Store].\n\nWhile this works well for individual assets / plugins / scripts, this can have\nits issues when *an addon wants to extend the functionality of another*. For\nexample, let's have an addon that wants to write logs, and instead of\nimplementing its own, it would like to use a [logger addon]. It would either\nhave to include the addon in its own assets, or instruct the user to install\nthat addon as well.\n\nBoth approaches can work for a single dependency, but for more complex\nprojects, neither approach is expected to scale.\n\nThe other issue is version management. Which version do we depend on? When and\nhow do we upgrade? How do we know if there's anything to upgrade? Managing all\nthese questions manually can be tedious.\n\nThese two cases are where a dependency manager can be useful.\n\n[Godot Asset Library]: https://godotengine.org/asset-library/\n[Godot Asset Store]: https://godotassetstore.org/\n[logger addon]: https://godotengine.org/asset-library/asset?filter=logger\u0026category=\u0026godot_version=\u0026cost=\u0026sort=updated\n\n## Considerations\n\n* Adaptive system\n  * Doesn't require self-hosting\n  * Can gather packages from multiple places\n* Fit into the Godot ecosystem\n  * Parse existing plugin INI's\n  * If possible, use a similar INI for dependency management\n* Support existing addon distribution places\n  * git ( and GitHub )\n  * Godot Asset Library?\n* Simple CLI interface\n\n## The project file\n\nAt the center of a godpak-enabled project is a descriptor file, similar to\nnpm's `package.json`. Keeping similarity with Godot's addons, it's a cfg:\n\n```\n[dependencies]\ngodotenv=https://github.com/godotessentials/godotenv@master\nlogger=https://github.com/DawnGroveStudios/GodotLogger@master\n\n[exports]\nnetfox\n```\n\n### Dependencies\n\nDependencies are parsed from the project file. Each dependency has an address\nand a version specifier, e.g.:\n\n```\nhttps://github.com/godotessentials/godotenv@master\n\n```\n\nThe two are separated by an `@` sign. The version may or may not be a semver,\nwith an optional `v` prefix. The address and version are handled by the\nspecific *adapter*.\n\n### Git Adapter\n\nClones the repository and extracts the right addon from the addons folder. The\nversion can be any branch or tag that exists within the git repo.\n\nPicks up any valid URL address as a fallback option.\n\n### GitHub Adapter\n\nSpecific to dependencies downloaded from GitHub. The base behavior is the same\nas the Git adapter, with potential for future specialization ( e.g. creating\ninstead of cloning the repo, downloading the release ).\n\nPicks up any GitHub URL, with precedence over the Git adapter.\n\n## Commands\n\n### setup\n\nSets the project up as a godpak project by creating an empty project file.\n\n```sh\ngdpk setup\n\n# Short form\ngdpk s\n```\n\n### install\n\nEnsures all dependencies are present in the project's `addons/` directory.\n\n```sh\ngdpk install\n\n# Short form\ngdpk i\n```\n\n### add\n\nAdds a dependency to the project. Requires at least an address, optionally with\na version specifier and addon name:\n\n```sh\n# Add default addon as dependency with latest version\ngdpk add https://github.com/DawnGroveStudios/GodotLogger\n\n# Add default addon with speficif version\ngdpk add https://github.com/DawnGroveStudios/GodotLogger@v1.0.8\n\n# Add specific addon\ngdpk add https://github.com/DawnGroveStudios/GodotLogger logger\n\n# Add specific addon with specific version\ngdpk add https://github.com/DawnGroveStudios/GodotLogger@v1.0.8 logger\n```\n\n#### Addon specification\n\nA dependency may contain one or more addons. For a single addon, godpak can\nassume that the dependency is that single addon. \n\nHowver, for multiple addon, godpak has no way to determine which one the\nproject depends on. In these cases, the addon itself must be specified. This\naddon name will be used to pick the right entry from the dependency's `addons/`\ndirectory.\n\n### remove\n\nRemoves a dependency from the project, by updating the project file and removing its associated files. Takes the addon name as input.\n\n```sh\ngdpk remove logger\n\ngdpk rm logger\n```\n\n\u003e May also take the same params as `add` in the future, for easier use\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felementbound%2Fgodpak","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felementbound%2Fgodpak","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felementbound%2Fgodpak/lists"}