{"id":16499359,"url":"https://github.com/tpapp/pkgskeleton.jl","last_synced_at":"2025-08-12T16:08:25.652Z","repository":{"id":35947259,"uuid":"192191886","full_name":"tpapp/PkgSkeleton.jl","owner":"tpapp","description":"Generate Julia package skeletons using a simple template system","archived":false,"fork":false,"pushed_at":"2025-06-20T08:55:34.000Z","size":132,"stargazers_count":57,"open_issues_count":3,"forks_count":7,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-04T04:35:05.998Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Julia","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tpapp.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","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,"zenodo":null}},"created_at":"2019-06-16T13:05:50.000Z","updated_at":"2025-06-20T08:55:38.000Z","dependencies_parsed_at":"2025-06-20T09:43:11.766Z","dependency_job_id":null,"html_url":"https://github.com/tpapp/PkgSkeleton.jl","commit_stats":{"total_commits":74,"total_committers":6,"mean_commits":"12.333333333333334","dds":0.08108108108108103,"last_synced_commit":"b6c54f7a1d7cf892620f29c1e0306df9d3b7915d"},"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/tpapp/PkgSkeleton.jl","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tpapp%2FPkgSkeleton.jl","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tpapp%2FPkgSkeleton.jl/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tpapp%2FPkgSkeleton.jl/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tpapp%2FPkgSkeleton.jl/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tpapp","download_url":"https://codeload.github.com/tpapp/PkgSkeleton.jl/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tpapp%2FPkgSkeleton.jl/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":270092080,"owners_count":24525316,"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-12T02:00:09.011Z","response_time":80,"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-11T14:52:17.819Z","updated_at":"2025-08-12T16:08:25.614Z","avatar_url":"https://github.com/tpapp.png","language":"Julia","funding_links":[],"categories":[],"sub_categories":[],"readme":"# PkgSkeleton.jl\n\n![lifecycle](https://img.shields.io/badge/lifecycle-maturing-blue.svg) \u003c!--\n![lifecycle](https://img.shields.io/badge/lifecycle-stable-green.svg)\n![lifecycle](https://img.shields.io/badge/lifecycle-retired-orange.svg)\n![lifecycle](https://img.shields.io/badge/lifecycle-archived-red.svg)\n![lifecycle](https://img.shields.io/badge/lifecycle-dormant-blue.svg) --\u003e\n[![build](https://github.com/tpapp/PkgSkeleton.jl/workflows/CI/badge.svg)](https://github.com/tpapp/PkgSkeleton.jl/actions?query=workflow%3ACI)\n[![codecov.io](http://codecov.io/github/tpapp/PkgSkeleton.jl/coverage.svg?branch=master)](http://codecov.io/github/tpapp/PkgSkeleton.jl?branch=master)\n\nJulia package for creating new packages and updating existing ones, following common practices and workflow recommendations.\n\n**This package may overwrite existing files.** While care has been taken to ensure no data loss, it may nevertheless happen. Keep backups, commit to a non-local git repository, and **use at your own risk**.\n\n## Installation\n\nThe package is registered. Add with\n\n```julia\npkg\u003e add PkgSkeleton\n```\n\n## Usage\n\n```julia\nimport PkgSkeleton\nPkgSkeleton.generate(\"target_directory\") # uses default template\n```\n\nThen\n\n1. Various defaults [(described below)](#substitutions) are collected from your environment, eg your name, e-mail address, and Github account name (from `git` global settings). You can override these using a keyword argument.\n\n2. If `target_directory` does not exist, it is created with an empty git repository. Conversely, if the directory exits but is not a git repository, generation is aborted.\n\n3. Files in template are copied recursively, with various [substitutions (as described below)](#substitutions). Unless you are explicitly allowing overwrites, uncommitted files in the repository are not modified.\n\nAfter this, you probably want to `pkg\u003e dev destination/directory` in Julia, and add your Github repository as a remote.\n\nSee `?PkgSkeleton.generate` for details.\n\n### Updating existing packages\n\nBest practices and recommended setups change with time. The recommended workflow for updating *existing* packages using templates from this package is the following.\n\n1. Make sure that this package is of the latest version, eg with `pkg\u003e up`.\n\n2. Make sure that *everything* that is part of a template is committed in version control. This is very important: when files are overwritten, work may be lost, so `PkgSkeleton.generate` prefers not to overwrite existing files.\n\n3. Run\n    ```julia\n    PkgSkeleton.generate(\"/path/to/pkg\")\n    ```\n    and see the output for what was modified. If you just want to update eg your Github workflows, restrict with\n    ```julia\n    PkgSkeleton.generate(\"/path/to/pkg\"; templates = [:github])\n    ```\n\n4. Use your favorite git interface for reviewing the change. Pick and commit what you like, discard the rest of the changes.\n\n### Custom templates\n\nJust create directories with text (code, Markdown, TOML) files, [substitutions](#substitutions) between `{}`s will be replaced in *filenames* and their *contents*.\n\n## [Substitutions](#substitutions)\n\nFor the default template, you need to set the `git` configuration variables `user.name`, `user.email`, and `github.user`.\n\nTemplates replace the following in files *and filenames*:\n\n| string        | replacement                                                                              |\n|---------------|------------------------------------------------------------------------------------------|\n| `{PKGNAME}`   | name of the package                                                                      |\n| `{UUID}`      | look in existing `Project.toml`, in the local registry copies, fallback to a random UUID |\n| `{GHUSER}`    | `git config --get github.user`                                                           |\n| `{USERNAME}`  | `git config --get user.name`                                                             |\n| `{USEREMAIL}` | `git config --get user.email`                                                            |\n| `{YEAR}`      | the current year                                                                         |\n\n## Design principles\n\n1. [Keep it simple](https://en.wikipedia.org/wiki/KISS_principle): do nothing more than substitute strings into templates, with a few safeguards. This keeps the code simple: currently [less than 300 LOC](src/PkgSkeleton.jl) without docstrings. For me, this covers 99% of the use cases; the rest I edit manually.\n\n2. Tread ligthly: don't modify uncommitted files (unless asked to, but really don't do that), or files with the same content (to preserve timestamps).\n\n3. Assume that tooling for packages will keep changing, make it easy to update.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftpapp%2Fpkgskeleton.jl","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftpapp%2Fpkgskeleton.jl","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftpapp%2Fpkgskeleton.jl/lists"}