125 lines
41 KiB
HTML
125 lines
41 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><title>User Guide · PkgTemplates.jl</title><link rel="canonical" href="https://invenia.github.io/PkgTemplates.jl/user/index.html"/><link href="https://fonts.googleapis.com/css?family=Lato|Roboto+Mono" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/fontawesome.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/solid.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.11.2/css/brands.min.css" rel="stylesheet" type="text/css"/><link href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.11.1/katex.min.css" rel="stylesheet" type="text/css"/><script>documenterBaseURL=".."</script><script src="https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.6/require.min.js" data-main="../assets/documenter.js"></script><script src="../siteinfo.js"></script><script src="../../versions.js"></script><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-dark.css" data-theme-name="documenter-dark"/><link class="docs-theme-link" rel="stylesheet" type="text/css" href="../assets/themes/documenter-light.css" data-theme-name="documenter-light" data-theme-primary/><script src="../assets/themeswap.js"></script></head><body><div id="documenter"><nav class="docs-sidebar"><div class="docs-package-name"><span class="docs-autofit">PkgTemplates.jl</span></div><form class="docs-search" action="../search/"><input class="docs-search-query" id="documenter-search-query" name="q" type="text" placeholder="Search docs"/></form><ul class="docs-menu"><li><a class="tocitem" href="../">Home</a></li><li class="is-active"><a class="tocitem" href>User Guide</a><ul class="internal"><li><a class="tocitem" href="#Template-1"><span>Template</span></a></li><li><a class="tocitem" href="#Plugins-1"><span>Plugins</span></a></li><li><a class="tocitem" href="#A-More-Complicated-Example-1"><span>A More Complicated Example</span></a></li><li><a class="tocitem" href="#Custom-Template-Files-1"><span>Custom Template Files</span></a></li><li><a class="tocitem" href="#Extending-Existing-Plugins-1"><span>Extending Existing Plugins</span></a></li><li><a class="tocitem" href="#Saving-Templates-1"><span>Saving Templates</span></a></li></ul></li><li><a class="tocitem" href="../developer/">Developer Guide</a></li><li><a class="tocitem" href="../migrating/">Migrating To PkgTemplates 0.7+</a></li></ul><div class="docs-version-selector field has-addons"><div class="control"><span class="docs-label button is-static is-size-7">Version</span></div><div class="docs-selector control is-expanded"><div class="select is-fullwidth is-size-7"><select id="documenter-version-selector"></select></div></div></div></nav><div class="docs-main"><header class="docs-navbar"><nav class="breadcrumb"><ul class="is-hidden-mobile"><li class="is-active"><a href>User Guide</a></li></ul><ul class="is-hidden-tablet"><li class="is-active"><a href>User Guide</a></li></ul></nav><div class="docs-right"><a class="docs-edit-link" href="https://github.com/invenia/PkgTemplates.jl/blob/master/docs/src/user.md#L" title="Edit on GitHub"><span class="docs-icon fab"></span><span class="docs-label is-hidden-touch">Edit on GitHub</span></a><a class="docs-settings-button fas fa-cog" id="documenter-settings-button" href="#" title="Settings"></a><a class="docs-sidebar-button fa fa-bars is-hidden-desktop" id="documenter-sidebar-button" href="#"></a></div></header><article class="content" id="documenter-page"><h1 id="PkgTemplates-User-Guide-1"><a class="docs-heading-anchor" href="#PkgTemplates-User-Guide-1">PkgTemplates User Guide</a><a class="docs-heading-anchor-permalink" href="#PkgTemplates-User-Guide-1" title="Permalink"></a></h1><ul><li><a href="#PkgTemplates-User-Guide-1">PkgTemplates User Guide</a></li><ul><li><a href="#Template-1">Template</a></li><li><a href="#Plugins-1">Plugins</a></li><li><a href="#A-More-Complicated-Example-1">A More Complicated Example</a></li><li><a href="#Custom-Template-Files-1">Custom Template Files</a></li><li><a href="#Extending-Existing-Plugins-1">Extending Existing Plugins</a></li><li><a href="#Saving-Templates-1">Saving Templates</a></li></ul></ul><p>Using PkgTemplates is straightforward. Just create a <a href="#PkgTemplates.Template"><code>Template</code></a>, and call it on a package name to generate that package:</p><pre><code class="language-julia">using PkgTemplates
|
|
t = Template()
|
|
t("MyPkg")</code></pre><h2 id="Template-1"><a class="docs-heading-anchor" href="#Template-1">Template</a><a class="docs-heading-anchor-permalink" href="#Template-1" title="Permalink"></a></h2><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Template" href="#PkgTemplates.Template"><code>PkgTemplates.Template</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Template(; kwargs...)</code></pre><p>A configuration used to generate packages.</p><p><strong>Keyword Arguments</strong></p><p><strong>User Options</strong></p><ul><li><code>user::AbstractString="username"</code>: GitHub (or other code hosting service) username. The default value comes from the global Git config (<code>github.user</code>). If no value is obtained, many plugins that use this value will not work.</li><li><code>authors::Union{AbstractString, Vector{<:AbstractString}}="name <email>"</code>: Package authors. Like <code>user</code>, it takes its default value from the global Git config (<code>user.name</code> and <code>user.email</code>).</li></ul><p><strong>Package Options</strong></p><ul><li><code>dir::AbstractString="~/.julia/dev"</code>: Directory to place packages in.</li><li><code>host::AbstractString="github.com"</code>: URL to the code hosting service where packages will reside.</li><li><code>julia::VersionNumber=v"1.0.0"</code>: Minimum allowed Julia version.</li></ul><p><strong>Template Plugins</strong></p><ul><li><code>plugins::Vector{<:Plugin}=Plugin[]</code>: A list of <a href="../developer/#PkgTemplates.Plugin"><code>Plugin</code></a>s used by the template.</li><li><code>disable_defaults::Vector{DataType}=DataType[]</code>: Default plugins to disable. The default plugins are <a href="#PkgTemplates.ProjectFile"><code>ProjectFile</code></a>, <a href="#PkgTemplates.SrcDir"><code>SrcDir</code></a>, <a href="#PkgTemplates.Tests"><code>Tests</code></a>, <a href="#PkgTemplates.Readme"><code>Readme</code></a>, <a href="#PkgTemplates.License"><code>License</code></a>, and <a href="#PkgTemplates.Git"><code>Git</code></a>. To override a default plugin instead of disabling it altogether, supply it via <code>plugins</code>.</li></ul><hr/><p>To create a package from a <code>Template</code>, use the following syntax:</p><pre><code class="language-julia">julia> t = Template();
|
|
|
|
julia> t("PkgName")</code></pre></div><a class="docs-sourcelink" target="_blank" href="https://github.com/invenia/PkgTemplates.jl/blob/a41187be1ca920d203f146602432a3f31e3ecfcd/src/template.jl#LL12-L48">source</a></section></article><h2 id="Plugins-1"><a class="docs-heading-anchor" href="#Plugins-1">Plugins</a><a class="docs-heading-anchor-permalink" href="#Plugins-1" title="Permalink"></a></h2><p>Plugins add functionality to <code>Template</code>s. There are a number of plugins available to automate common boilerplate tasks.</p><h3 id="Default-Plugins-1"><a class="docs-heading-anchor" href="#Default-Plugins-1">Default Plugins</a><a class="docs-heading-anchor-permalink" href="#Default-Plugins-1" title="Permalink"></a></h3><p>These plugins are included by default. They can be overridden by supplying another value via the <code>plugins</code> keyword, or disabled by supplying the type via the <code>disable_defaults</code> keyword.</p><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.ProjectFile" href="#PkgTemplates.ProjectFile"><code>PkgTemplates.ProjectFile</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">ProjectFile(; version=v"0.1.0")</code></pre><p>Creates a <code>Project.toml</code>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>version::VersionNumber</code>: The initial version of created packages.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/3af96bcefcb0aec559d4652fd75e1bc3fcfe99da/base/#L0-L7">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.SrcDir" href="#PkgTemplates.SrcDir"><code>PkgTemplates.SrcDir</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">SrcDir(; file="~/build/invenia/PkgTemplates.jl/templates/src/module.jl")</code></pre><p>Creates a module entrypoint.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for <code>src/<module>.jl</code>.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/3af96bcefcb0aec559d4652fd75e1bc3fcfe99da/base/#L0-L7">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Tests" href="#PkgTemplates.Tests"><code>PkgTemplates.Tests</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Tests(; file="~/build/invenia/PkgTemplates.jl/templates/test/runtests.jl", project=false)</code></pre><p>Sets up testing for packages.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for <code>runtests.jl</code>.</li><li><code>project::Bool</code>: Whether or not to create a new project for tests (<code>test/Project.toml</code>). See <a href="https://julialang.github.io/Pkg.jl/v1/creating-packages/#Test-specific-dependencies-in-Julia-1.2-and-above-1">here</a> for more details.</li></ul><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>Managing test dependencies with <code>test/Project.toml</code> is only supported in Julia 1.2 and later.</p></div></div></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/3af96bcefcb0aec559d4652fd75e1bc3fcfe99da/base/#L0-L14">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Readme" href="#PkgTemplates.Readme"><code>PkgTemplates.Readme</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Readme(;
|
|
file="~/build/invenia/PkgTemplates.jl/templates/README.md",
|
|
destination="README.md",
|
|
inline_badges=false,
|
|
)</code></pre><p>Creates a <code>README</code> file that contains badges for other included plugins.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for the <code>README</code>.</li><li><code>destination::AbstractString</code>: File destination, relative to the repository root. For example, values of <code>"README"</code> or <code>"README.rst"</code> might be desired.</li><li><code>inline_badges::Bool</code>: Whether or not to put the badges on the same line as the package name.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/3af96bcefcb0aec559d4652fd75e1bc3fcfe99da/base/#L0-L14">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.License" href="#PkgTemplates.License"><code>PkgTemplates.License</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">License(; name="MIT", path=nothing, destination="LICENSE")</code></pre><p>Creates a license file.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>name::AbstractString</code>: Name of a license supported by PkgTemplates. Available licenses can be seen <a href="https://github.com/invenia/PkgTemplates.jl/tree/master/templates/licenses">here</a>.</li><li><code>path::Union{AbstractString, Nothing}</code>: Path to a custom license file. This keyword takes priority over <code>name</code>.</li><li><code>destination::AbstractString</code>: File destination, relative to the repository root. For example, <code>"LICENSE.md"</code> might be desired.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/invenia/PkgTemplates.jl/blob/a41187be1ca920d203f146602432a3f31e3ecfcd/src/plugins/license.jl#LL1-L14">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Git" href="#PkgTemplates.Git"><code>PkgTemplates.Git</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Git(; ignore=String[], ssh=false, manifest=false, gpgsign=false)</code></pre><p>Creates a Git repository and a <code>.gitignore</code> file.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>ignore::Vector{<:AbstractString}</code>: Patterns to add to the <code>.gitignore</code>. See also: <a href="../developer/#PkgTemplates.gitignore"><code>gitignore</code></a>.</li><li><code>ssh::Bool</code>: Whether or not to use SSH for the remote. If left unset, HTTPS is used.</li><li><code>manifest::Bool</code>: Whether or not to commit <code>Manifest.toml</code>.</li><li><code>gpgsign::Bool</code>: Whether or not to sign commits with your GPG key. This option requires that the Git CLI is installed, and for you to have a GPG key associated with your committer identity.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/3af96bcefcb0aec559d4652fd75e1bc3fcfe99da/base/#L0-L14">source</a></section></article><h3 id="Continuous-Integration-(CI)-1"><a class="docs-heading-anchor" href="#Continuous-Integration-(CI)-1">Continuous Integration (CI)</a><a class="docs-heading-anchor-permalink" href="#Continuous-Integration-(CI)-1" title="Permalink"></a></h3><p>These plugins will create the configuration files of common CI services for you.</p><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.AppVeyor" href="#PkgTemplates.AppVeyor"><code>PkgTemplates.AppVeyor</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">AppVeyor(;
|
|
file="~/build/invenia/PkgTemplates.jl/templates/appveyor.yml",
|
|
x86=false,
|
|
coverage=true,
|
|
extra_versions=["1.0", "1.0", "nightly"],
|
|
)</code></pre><p>Integrates your packages with <a href="https://appveyor.com">AppVeyor</a> via <a href="https://github.com/JuliaCI/Appveyor.jl">AppVeyor.jl</a>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for <code>.appveyor.yml</code>.</li><li><code>x86::Bool</code>: Whether or not to run builds on 32-bit systems, in addition to the default 64-bit builds.</li><li><code>coverage::Bool</code>: Whether or not to publish code coverage. <a href="#PkgTemplates.Codecov"><code>Codecov</code></a> must also be included.</li><li><code>extra_versions::Vector</code>: Extra Julia versions to test, as strings or <code>VersionNumber</code>s.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/3af96bcefcb0aec559d4652fd75e1bc3fcfe99da/base/#L0-L18">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.CirrusCI" href="#PkgTemplates.CirrusCI"><code>PkgTemplates.CirrusCI</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">CirrusCI(;
|
|
file="~/build/invenia/PkgTemplates.jl/templates/cirrus.yml",
|
|
image="freebsd-12-0-release-amd64",
|
|
coverage=true,
|
|
extra_versions=["1.0", "1.0", "nightly"],
|
|
)</code></pre><p>Integrates your packages with <a href="https://cirrus-ci.org">Cirrus CI</a> via <a href="https://github.com/ararslan/CirrusCI.jl">CirrusCI.jl</a>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for <code>.cirrus.yml</code>.</li><li><code>image::AbstractString</code>: The FreeBSD image to be used.</li><li><code>coverage::Bool</code>: Whether or not to publish code coverage. <a href="#PkgTemplates.Codecov"><code>Codecov</code></a> must also be included.</li><li><code>extra_versions::Vector</code>: Extra Julia versions to test, as strings or <code>VersionNumber</code>s.</li></ul><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>Code coverage submission from Cirrus CI is not yet supported by <a href="https://github.com/JuliaCI/Coverage.jl">Coverage.jl</a>.</p></div></div></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/3af96bcefcb0aec559d4652fd75e1bc3fcfe99da/base/#L0-L21">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.DroneCI" href="#PkgTemplates.DroneCI"><code>PkgTemplates.DroneCI</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">DroneCI(;
|
|
file="~/build/invenia/PkgTemplates.jl/templates/drone.star",
|
|
amd64=true,
|
|
arm=false,
|
|
arm64=false,
|
|
extra_versions=["1.0", "1.0"],
|
|
)</code></pre><p>Integrates your packages with <a href="https://drone.io">Drone CI</a>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for <code>.drone.star</code>.</li><li><code>destination::AbstractString</code>: File destination, relative to the repository root. For example, you might want to generate a <code>.drone.yml</code> instead of the default Starlark file.</li><li><code>amd64::Bool</code>: Whether or not to run builds on AMD64.</li><li><code>arm::Bool</code>: Whether or not to run builds on ARM (32-bit).</li><li><code>arm64::Bool</code>: Whether or not to run builds on ARM64.</li><li><code>extra_versions::Vector</code>: Extra Julia versions to test, as strings or <code>VersionNumber</code>s.</li></ul><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>Nightly Julia is not supported.</p></div></div></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/3af96bcefcb0aec559d4652fd75e1bc3fcfe99da/base/#L0-L22">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.GitHubActions" href="#PkgTemplates.GitHubActions"><code>PkgTemplates.GitHubActions</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">GitHubActions(;
|
|
file="~/build/invenia/PkgTemplates.jl/templates/github/workflows/ci.yml",
|
|
destination="ci.yml",
|
|
linux=true,
|
|
osx=true,
|
|
windows=true,
|
|
x64=true,
|
|
x86=false,
|
|
coverage=true,
|
|
extra_versions=["1.0", "1.0"],
|
|
)</code></pre><p>Integrates your packages with <a href="https://github.com/features/actions">GitHub Actions</a>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for the workflow file.</li><li><code>destination::AbstractString</code>: Destination of the worflow file, relative to <code>.github/workflows</code>.</li><li><code>linux::Bool</code>: Whether or not to run builds on Linux.</li><li><code>osx::Bool</code>: Whether or not to run builds on OSX (MacOS).</li><li><code>windows::Bool</code>: Whether or not to run builds on Windows.</li><li><code>x64::Bool</code>: Whether or not to run builds on 64-bit architecture.</li><li><code>x86::Bool</code>: Whether or not to run builds on 32-bit architecture.</li><li><code>coverage::Bool</code>: Whether or not to publish code coverage. Another code coverage plugin such as <a href="#PkgTemplates.Codecov"><code>Codecov</code></a> must also be included.</li><li><code>extra_versions::Vector</code>: Extra Julia versions to test, as strings or <code>VersionNumber</code>s.</li></ul><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>If using coverage plugins, don't forget to manually add your API tokens as secrets, as described <a href="https://help.github.com/en/actions/automating-your-workflow-with-github-actions/creating-and-using-encrypted-secrets#creating-encrypted-secrets">here</a>.</p></div></div><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>Nightly Julia is not supported.</p></div></div></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/3af96bcefcb0aec559d4652fd75e1bc3fcfe99da/base/#L0-L34">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.GitLabCI" href="#PkgTemplates.GitLabCI"><code>PkgTemplates.GitLabCI</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">GitLabCI(;
|
|
file="~/build/invenia/PkgTemplates.jl/templates/gitlab-ci.yml",
|
|
coverage=true,
|
|
extra_versions=["1.0", "1.0"],
|
|
)</code></pre><p>Integrates your packages with <a href="https://docs.gitlab.com/ce/ci">GitLab CI</a>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for <code>.gitlab-ci.yml</code>.</li><li><code>coverage::Bool</code>: Whether or not to compute code coverage.</li><li><code>extra_versions::Vector</code>: Extra Julia versions to test, as strings or <code>VersionNumber</code>s.</li></ul><p><strong>GitLab Pages</strong></p><p>Documentation can be generated by including a <code>Documenter{GitLabCI}</code> plugin. See <a href="#PkgTemplates.Documenter"><code>Documenter</code></a> for more information.</p><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>Nightly Julia is not supported.</p></div></div></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/3af96bcefcb0aec559d4652fd75e1bc3fcfe99da/base/#L0-L20">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.TravisCI" href="#PkgTemplates.TravisCI"><code>PkgTemplates.TravisCI</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">TravisCI(;
|
|
file="~/build/invenia/PkgTemplates.jl/templates/travis.yml",
|
|
linux=true,
|
|
osx=true,
|
|
windows=true,
|
|
x64=true,
|
|
x86=false,
|
|
arm64=false,
|
|
coverage=true,
|
|
extra_versions=["1.0", "1.0", "nightly"],
|
|
)</code></pre><p>Integrates your packages with <a href="https://travis-ci.com">Travis CI</a>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for <code>.travis.yml</code>.</li><li><code>linux::Bool</code>: Whether or not to run builds on Linux.</li><li><code>osx::Bool</code>: Whether or not to run builds on OSX (MacOS).</li><li><code>windows::Bool</code>: Whether or not to run builds on Windows.</li><li><code>x64::Bool</code>: Whether or not to run builds on 64-bit architecture.</li><li><code>x86::Bool</code>: Whether or not to run builds on 32-bit architecture.</li><li><code>arm64::Bool</code>: Whether or not to run builds on the ARM64 architecture.</li><li><code>coverage::Bool</code>: Whether or not to publish code coverage. Another code coverage plugin such as <a href="#PkgTemplates.Codecov"><code>Codecov</code></a> must also be included.</li><li><code>extra_versions::Vector</code>: Extra Julia versions to test, as strings or <code>VersionNumber</code>s.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/3af96bcefcb0aec559d4652fd75e1bc3fcfe99da/base/#L0-L26">source</a></section></article><h3 id="Code-Coverage-1"><a class="docs-heading-anchor" href="#Code-Coverage-1">Code Coverage</a><a class="docs-heading-anchor-permalink" href="#Code-Coverage-1" title="Permalink"></a></h3><p>These plugins will enable code coverage reporting from CI.</p><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Codecov" href="#PkgTemplates.Codecov"><code>PkgTemplates.Codecov</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Codecov(; file=nothing)</code></pre><p>Sets up code coverage submission from CI to <a href="https://codecov.io">Codecov</a>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::Union{AbstractString, Nothing}</code>: Template file for <code>.codecov.yml</code>, or <code>nothing</code> to create no file.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/3af96bcefcb0aec559d4652fd75e1bc3fcfe99da/base/#L0-L8">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Coveralls" href="#PkgTemplates.Coveralls"><code>PkgTemplates.Coveralls</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Coveralls(; file=nothing)</code></pre><p>Sets up code coverage submission from CI to <a href="https://coveralls.io">Coveralls</a>.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::Union{AbstractString, Nothing}</code>: Template file for <code>.coveralls.yml</code>, or <code>nothing</code> to create no file.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/3af96bcefcb0aec559d4652fd75e1bc3fcfe99da/base/#L0-L8">source</a></section></article><h3 id="Documentation-1"><a class="docs-heading-anchor" href="#Documentation-1">Documentation</a><a class="docs-heading-anchor-permalink" href="#Documentation-1" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Documenter" href="#PkgTemplates.Documenter"><code>PkgTemplates.Documenter</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Documenter{T<:Union{TravisCI, GitLabCI, Nothing}}(;
|
|
make_jl="~/build/invenia/PkgTemplates.jl/templates/docs/make.jl",
|
|
index_md="~/build/invenia/PkgTemplates.jl/templates/docs/src/index.md",
|
|
assets=String[],
|
|
canonical_url=make_canonical(T),
|
|
makedocs_kwargs=Dict{Symbol, Any}(),
|
|
)</code></pre><p>Sets up documentation generation via <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a>. Documentation deployment depends on <code>T</code>, where <code>T</code> is some supported CI plugin, or <code>Nothing</code> to only support local documentation builds.</p><p><strong>Supported Type Parameters</strong></p><ul><li><code>GitHubActions</code>: Deploys documentation to <a href="https://pages.github.com">GitHub Pages</a> with the help of <a href="#PkgTemplates.GitHubActions"><code>GitHubActions</code></a>.</li><li><code>TravisCI</code>: Deploys documentation to <a href="https://pages.github.com">GitHub Pages</a> with the help of <a href="#PkgTemplates.TravisCI"><code>TravisCI</code></a>.</li><li><code>GitLabCI</code>: Deploys documentation to <a href="https://pages.gitlab.com">GitLab Pages</a> with the help of <a href="#PkgTemplates.GitLabCI"><code>GitLabCI</code></a>.</li><li><code>Nothing</code> (default): Does not set up documentation deployment.</li></ul><p><strong>Keyword Arguments</strong></p><ul><li><code>make_jl::AbstractString</code>: Template file for <code>make.jl</code>.</li><li><code>index_md::AbstractString</code>: Template file for <code>index.md</code>.</li><li><code>assets::Vector{<:AbstractString}</code>: Extra assets for the generated site.</li><li><code>canonical_url::Union{Function, Nothing}</code>: A function to generate the site's canonical URL. The default value will compute GitHub Pages and GitLab Pages URLs for <a href="#PkgTemplates.TravisCI"><code>TravisCI</code></a> and <a href="#PkgTemplates.GitLabCI"><code>GitLabCI</code></a>, respectively. If set to <code>nothing</code>, no canonical URL is set.</li><li><code>makedocs_kwargs::Dict{Symbol}</code>: Extra keyword arguments to be inserted into <code>makedocs</code>.</li></ul><div class="admonition is-info"><header class="admonition-header">Note</header><div class="admonition-body"><p>If deploying documentation with Travis CI, don't forget to complete <a href="https://juliadocs.github.io/Documenter.jl/stable/man/hosting/#SSH-Deploy-Keys-1">the required configuration</a>.</p></div></div></div><a class="docs-sourcelink" target="_blank" href="https://github.com/invenia/PkgTemplates.jl/blob/a41187be1ca920d203f146602432a3f31e3ecfcd/src/plugins/documenter.jl#LL9-L44">source</a></section></article><h3 id="Miscellaneous-1"><a class="docs-heading-anchor" href="#Miscellaneous-1">Miscellaneous</a><a class="docs-heading-anchor-permalink" href="#Miscellaneous-1" title="Permalink"></a></h3><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Develop" href="#PkgTemplates.Develop"><code>PkgTemplates.Develop</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Develop()</code></pre><p>Adds generated packages to the current environment by <code>dev</code>ing them. See the Pkg documentation <a href="https://julialang.github.io/Pkg.jl/v1/managing-packages/#Developing-packages-1">here</a> for more details.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/invenia/PkgTemplates.jl/blob/a41187be1ca920d203f146602432a3f31e3ecfcd/src/plugins/develop.jl#LL1-L8">source</a></section></article><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.Citation" href="#PkgTemplates.Citation"><code>PkgTemplates.Citation</code></a> — <span class="docstring-category">Type</span></header><section><div><pre><code class="language-julia">Citation(; file="~/build/invenia/PkgTemplates.jl/templates/CITATION.bib", readme=false)</code></pre><p>Creates a <code>CITATION.bib</code> file for citing package repositories.</p><p><strong>Keyword Arguments</strong></p><ul><li><code>file::AbstractString</code>: Template file for <code>CITATION.bib</code>.</li><li><code>readme::Bool</code>: Whether or not to include a section about citing in the README.</li></ul></div><a class="docs-sourcelink" target="_blank" href="https://github.com/JuliaLang/julia/blob/3af96bcefcb0aec559d4652fd75e1bc3fcfe99da/base/#L0-L8">source</a></section></article><h2 id="A-More-Complicated-Example-1"><a class="docs-heading-anchor" href="#A-More-Complicated-Example-1">A More Complicated Example</a><a class="docs-heading-anchor-permalink" href="#A-More-Complicated-Example-1" title="Permalink"></a></h2><p>Here are a few example templates that use the options and plugins explained above.</p><p>This one includes plugins suitable for a project hosted on GitHub, and some other customizations:</p><pre><code class="language-julia">Template(;
|
|
user="my-username",
|
|
dir="~/code",
|
|
authors="Acme Corp",
|
|
julia=v"1.1",
|
|
plugins=[
|
|
License(; name="MPL"),
|
|
Git(; manifest=true, ssh=true),
|
|
GitHubActions(; x86=true),
|
|
Codecov(),
|
|
Documenter{GitHubActions}(),
|
|
Develop(),
|
|
],
|
|
)</code></pre><p>Here's one that works well for projects hosted on GitLab:</p><pre><code class="language-julia">Template(;
|
|
user="my-username",
|
|
host="gitlab.com",
|
|
plugins=[
|
|
GitLabCI(),
|
|
Documenter{GitLabCI}(),
|
|
],
|
|
)</code></pre><h2 id="Custom-Template-Files-1"><a class="docs-heading-anchor" href="#Custom-Template-Files-1">Custom Template Files</a><a class="docs-heading-anchor-permalink" href="#Custom-Template-Files-1" title="Permalink"></a></h2><div class="admonition is-info"><header class="admonition-header">Templates vs Templating</header><div class="admonition-body"><p>This documentation refers plenty to <a href="#PkgTemplates.Template"><code>Template</code></a>s, the package's main type, but it also refers to "template files" and "text templating", which are plaintext files with placeholders to be filled with data, and the technique of filling those placeholders with data, respectively.</p><p>These concepts should be familiar if you've used <a href="https://palletsprojects.com/p/jinja">Jinja</a> or <a href="https://mustache.github.io">Mustache</a> (Mustache is the particular flavour used by PkgTemplates, via <a href="https://github.com/jverzani/Mustache.jl">Mustache.jl</a>). Please keep the difference between these two things in mind!</p></div></div><p>Many plugins support a <code>file</code> argument or similar, which sets the path to the template file to be used for generating files. Each plugin has a sensible default that should make sense for most people, but you might have a specialized workflow that requires a totally different template file.</p><p>If that's the case, a basic understanding of <a href="https://mustache.github.io">Mustache</a>'s syntax is required. Here's an example template file:</p><pre><code class="language-none">Hello, {{{name}}}.
|
|
|
|
{{#weather}}
|
|
It's {{{weather}}} outside.
|
|
{{/weather}}
|
|
{{^weather}}
|
|
I don't know what the weather outside is.
|
|
{{/weather}}
|
|
|
|
{{#has_things}}
|
|
I have the following things:
|
|
{{/has_things}}
|
|
{{#things}}
|
|
- Here's a thing: {{{.}}}
|
|
{{/things}}
|
|
|
|
{{#people}}
|
|
- {{{name}}} is {{{mood}}}
|
|
{{/people}}</code></pre><p>In the first section, <code>name</code> is a key, and its value replaces <code>{{{name}}}</code>.</p><p>In the second section, <code>weather</code>'s value may or may not exist. If it does exist, then "It's weather outside" is printed. Otherwise, "I don't know what the weather outside is" is printed. Mustache uses a notion of "truthiness" similar to Python or JavaScript, where values of <code>nothing</code>, <code>false</code>, or empty collections are all considered to not exist.</p><p>In the third section, <code>has_things</code>' value is printed if it's truthy. Then, if the <code>things</code> list is truthy (i.e. not empty), its values are each printed on their own line. The reason that we have two separate keys is that <code>{{#things}}</code> iterates over the whole <code>things</code> list, even when there are no <code>{{{.}}}</code> placeholders, which would duplicate "I have the following things:" <code>n</code> times.</p><p>The fourth section iterates over the <code>people</code> list, but instead of using the <code>{{{.}}}</code> placeholder, we have <code>name</code> and <code>mood</code>, which are keys or fields of the list elements. Most types are supported here, including <code>Dict</code>s and structs. <code>NamedTuple</code>s require you to use <code>{{{:name}}}</code> instead of the normal <code>{{{name}}}</code>, though.</p><p>You might notice that some curlies are in groups of two (<code>{{key}}</code>), and some are in groups of three (<code>{{{key}}}</code>). Whenever we want to subtitute in a value, using the triple curlies disables HTML escaping, which we rarely want for the types of files we're creating. If you do want escaping, just use the double curlies. And if you're using different delimiters, for example <code><<foo>></code>, use <code><<&foo>></code> to disable escaping.</p><p>Assuming the following view:</p><pre><code class="language-julia">struct Person; name::String; mood::String; end
|
|
things = ["a", "b", "c"]
|
|
view = Dict(
|
|
"name" => "Chris",
|
|
"weather" => "sunny",
|
|
"has_things" => !isempty(things),
|
|
"things" => things,
|
|
"people" => [Person("John", "happy"), Person("Jane", "sad")],
|
|
)</code></pre><p>Our example template would produce this:</p><pre><code class="language-none">Hello, Chris.
|
|
|
|
It's sunny outside.
|
|
|
|
I have the following things:
|
|
- Here's a thing: a
|
|
- Here's a thing: b
|
|
- Here's a thing: c
|
|
|
|
- John is happy
|
|
- Jane is sad</code></pre><h2 id="Extending-Existing-Plugins-1"><a class="docs-heading-anchor" href="#Extending-Existing-Plugins-1">Extending Existing Plugins</a><a class="docs-heading-anchor-permalink" href="#Extending-Existing-Plugins-1" title="Permalink"></a></h2><p>Most of the existing plugins generate a file from a template file. If you want to use custom template files, you may run into situations where the data passed into the templating engine is not sufficient. In this case, you can look into implementing <a href="#PkgTemplates.user_view"><code>user_view</code></a> to supply whatever data is necessary for your use case.</p><article class="docstring"><header><a class="docstring-binding" id="PkgTemplates.user_view" href="#PkgTemplates.user_view"><code>PkgTemplates.user_view</code></a> — <span class="docstring-category">Function</span></header><section><div><pre><code class="language-julia">user_view(::Plugin, ::Template, pkg::AbstractString) -> Dict{String, Any}</code></pre><p>The same as <a href="../developer/#PkgTemplates.view"><code>view</code></a>, but for use by package <em>users</em> for extension.</p><p>Values returned by this function will override those from <a href="../developer/#PkgTemplates.view"><code>view</code></a> when the keys are the same.</p></div><a class="docs-sourcelink" target="_blank" href="https://github.com/invenia/PkgTemplates.jl/blob/a41187be1ca920d203f146602432a3f31e3ecfcd/src/plugin.jl#LL32-L39">source</a></section></article><p>For example, suppose you were using the <a href="#PkgTemplates.Readme"><code>Readme</code></a> plugin with a custom template file that looked like this:</p><pre><code class="language-md"># {{PKG}}
|
|
|
|
Created on *{{TODAY}}*.</code></pre><p>The <a href="../developer/#PkgTemplates.view"><code>view</code></a> function supplies a value for <code>PKG</code>, but it does not supply a value for <code>TODAY</code>. Rather than override <a href="../developer/#PkgTemplates.view"><code>view</code></a>, we can implement this function to get both the default values and whatever else we need to add.</p><pre><code class="language-julia">user_view(::Readme, ::Template, ::AbstractString) = Dict("TODAY" => today())</code></pre><h2 id="Saving-Templates-1"><a class="docs-heading-anchor" href="#Saving-Templates-1">Saving Templates</a><a class="docs-heading-anchor-permalink" href="#Saving-Templates-1" title="Permalink"></a></h2><p>One of the main reasons for PkgTemplates' existence is for new packages to be consistent. This means using the same template more than once, so we want a way to save a template to be used later.</p><p>Here's my recommendation for loading a template whenever it's needed:</p><pre><code class="language-julia">function template()
|
|
@eval using PkgTemplates
|
|
Template(; #= ... =#)
|
|
end</code></pre><p>Add this to your <code>startup.jl</code>, and you can create your template from anywhere, without incurring any startup cost.</p><p>Another strategy is to write the string representation of the template to a Julia file:</p><pre><code class="language-julia">const t = Template(; #= ... =#)
|
|
open("template.jl", "w") do io
|
|
println(io, "using PkgTemplates")
|
|
sprint(show, io, t)
|
|
end</code></pre><p>Then the template is just an <code>include</code> away:</p><pre><code class="language-julia">const t = include("template.jl")</code></pre><p>The only disadvantage to this approach is that the saved template is much less human-readable than code you wrote yourself.</p><p>One more method of saving templates is to simply use the Serialization package in the standard library:</p><pre><code class="language-julia">const t = Template(; #= ... =#)
|
|
using Serialization
|
|
open(io -> serialize(io, t), "template.bin", "w")</code></pre><p>Then simply <code>deserialize</code> to load:</p><pre><code class="language-julia">using Serialization
|
|
const t = open(deserialize, "template.bin")</code></pre><p>This approach has the same disadvantage as the previous one, and the serialization format is not guaranteed to be stable across Julia versions.</p></article><nav class="docs-footer"><a class="docs-footer-prevpage" href="../">« Home</a><a class="docs-footer-nextpage" href="../developer/">Developer Guide »</a></nav></div><div class="modal" id="documenter-settings"><div class="modal-background"></div><div class="modal-card"><header class="modal-card-head"><p class="modal-card-title">Settings</p><button class="delete"></button></header><section class="modal-card-body"><p><label class="label">Theme</label><div class="select"><select id="documenter-themepicker"><option value="documenter-light">documenter-light</option><option value="documenter-dark">documenter-dark</option></select></div></p><hr/><p>This document was generated with <a href="https://github.com/JuliaDocs/Documenter.jl">Documenter.jl</a> on <span class="colophon-date" title="Tuesday 17 December 2019 06:44">Tuesday 17 December 2019</span>. Using Julia version 1.0.5.</p></section><footer class="modal-card-foot"></footer></div></div></div></body></html>
|