From 6dcfa9a82bc523d66e1457c94931c751645aae59 Mon Sep 17 00:00:00 2001 From: Joe Mooring Date: Fri, 10 Nov 2023 16:11:07 -0800 Subject: [PATCH] Update troubleshooting section Closes #2316 --- .cspell.json | 6 +- content/en/templates/template-debugging.md | 72 ------------- content/en/troubleshooting/_index.md | 10 +- content/en/troubleshooting/audit/index.md | 73 +++++++++++++ .../troubleshooting/audit/screen-capture.png | Bin 0 -> 45665 bytes .../en/troubleshooting/build-performance.md | 90 ---------------- content/en/troubleshooting/deprecation.md | 51 +++++++++ content/en/troubleshooting/faq.md | 97 +++++++++++------- content/en/troubleshooting/inspection.md | 72 +++++++++++++ content/en/troubleshooting/logging.md | 56 ++++++++++ content/en/troubleshooting/performance.md | 94 +++++++++++++++++ data/page_filters.yaml | 4 + 12 files changed, 419 insertions(+), 206 deletions(-) delete mode 100644 content/en/templates/template-debugging.md create mode 100644 content/en/troubleshooting/audit/index.md create mode 100644 content/en/troubleshooting/audit/screen-capture.png delete mode 100644 content/en/troubleshooting/build-performance.md create mode 100644 content/en/troubleshooting/deprecation.md create mode 100644 content/en/troubleshooting/inspection.md create mode 100644 content/en/troubleshooting/logging.md create mode 100644 content/en/troubleshooting/performance.md diff --git a/.cspell.json b/.cspell.json index e9b15cc91..ae469d646 100644 --- a/.cspell.json +++ b/.cspell.json @@ -116,14 +116,18 @@ "dring", "getenv", "gohugo", + "inor", "jdoe", "milli", "rgba", "rsmith", "stringifier", "struct", + "tdewolff", "tjones", "toclevels", - "vals" + "vals", + "xfeff", + "zgotmplz" ] } diff --git a/content/en/templates/template-debugging.md b/content/en/templates/template-debugging.md deleted file mode 100644 index fd400018b..000000000 --- a/content/en/templates/template-debugging.md +++ /dev/null @@ -1,72 +0,0 @@ ---- -title: Template debugging -description: You can use Go templates' `printf` function to debug your Hugo templates. These snippets provide a quick and easy visualization of the variables available to you in different contexts. -categories: [templates] -keywords: [debugging,troubleshooting] -menu: - docs: - parent: templates - weight: 240 -weight: 240 ---- - -Here are some snippets you can add to your template to answer some common questions. - -These snippets use the `printf` function available in all Go templates. This function is an alias to the Go function, [fmt.Printf](https://pkg.go.dev/fmt). - -## What variables are available in this context? - -You can use the template syntax, `$.`, to get the top-level template context from anywhere in your template. This will print out all the values under, `.Site`. - -```go-html-template -{{ printf "%#v" $.Site }} -``` - -This will print out the value of `.Permalink`: - -```go-html-template -{{ printf "%#v" .Permalink }} -``` - -This will print out a list of all the variables scoped to the current context -(`.`, aka ["the dot"][tempintro]). - -```go-html-template -{{ printf "%#v" . }} -``` - -When developing a [homepage], what does one of the pages you're looping through look like? - -```go-html-template -{{ range .Pages }} - {{/* The context, ".", is now each one of the pages as it goes through the loop */}} - {{ printf "%#v" . }} -{{ end }} -``` - -In some cases it might be more helpful to use the following snippet on the current context to get a pretty printed view of what you're able to work with: - -```go-html-template -
{{ . | jsonify (dict "indent" " ") }}
-``` - -Note that Hugo will throw an error if you attempt to use this construct to display context that includes a page collection (e.g., the context passed to home, section, taxonomy, and term templates). - -## Why am I showing no defined variables? - -Check that you are passing variables in the `partial` function: - -```go-html-template -{{ partial "header.html" }} -``` - -This example will render the header partial, but the header partial will not have access to any contextual variables. You need to pass variables explicitly. For example, note the addition of ["the dot"][tempintro]. - -```go-html-template -{{ partial "header.html" . }} -``` - -The dot (`.`) is considered fundamental to understanding Hugo templating. For more information, see [Introduction to Hugo Templating][tempintro]. - -[homepage]: /templates/homepage/ -[tempintro]: /templates/introduction/ diff --git a/content/en/troubleshooting/_index.md b/content/en/troubleshooting/_index.md index 49c7f7e61..65263ab32 100644 --- a/content/en/troubleshooting/_index.md +++ b/content/en/troubleshooting/_index.md @@ -1,7 +1,7 @@ --- -title: Troubleshoot +title: Troubleshooting linkTitle: Overview -description: Frequently asked questions and known issues pulled from the Hugo Discuss forum. +description: Use these techniques when troubleshooting your site. categories: [] keywords: [] menu: @@ -10,9 +10,7 @@ menu: parent: troubleshooting weight: 10 weight: 10 -aliases: [/troubleshooting/faqs/,/faqs/] +aliases: [/templates/template-debugging/] --- -The Troubleshooting section includes known issues, recent workarounds, and FAQs pulled from the [Hugo Discussion Forum][forum]. - -[forum]: https://discourse.gohugo.io +Use these techniques when troubleshooting your site. diff --git a/content/en/troubleshooting/audit/index.md b/content/en/troubleshooting/audit/index.md new file mode 100644 index 000000000..28db344ea --- /dev/null +++ b/content/en/troubleshooting/audit/index.md @@ -0,0 +1,73 @@ +--- +title: Site audit +linkTitle: Audit +description: Run this audit before deploying your production site. +categories: [troubleshooting] +keywords: [] +menu: + docs: + parent: troubleshooting + weight: 20 +weight: 20 +--- + +There are several conditions that can produce errors in your published site which are not detected during the build. Run this audit before your final build. + +{{< code copy=true >}} +HUGO_MINIFY_TDEWOLFF_HTML_KEEPCOMMENTS=true HUGO_ENABLEMISSINGTRANSLATIONPLACEHOLDERS=true hugo && grep -inorE "<\!-- raw HTML omitted -->|ZgotmplZ|\[i18n\]|\(\)|(<nil>)|hahahugo" public/ +{{< /code >}} + +_Tested with GNU Bash 5.1 and GNU grep 3.7._ + +## Example output + +![site audit terminal output](screen-capture.png) + +## Explanation + +### Environment variables + +`HUGO_MINIFY_TDEWOLFF_HTML_KEEPCOMMENTS=true` +: Retain HTML comments even if minification is enabled. This takes precedence over `minify.tdewolff.html.keepComments` in the site configuration. If you minify without keeping HTML comments when performing this audit, you will not be able to detect when raw HTML has been omitted. + +`HUGO_ENABLEMISSINGTRANSLATIONPLACEHOLDERS=true` +: Show a placeholder instead of the default value or an empty string if a translation is missing. This takes precedence over `enableMissingTranslationPlaceholders` in the site configuration. + +### Grep options + +`-i, --ignore-case` +: Ignore case distinctions in patterns and input data, so that characters that differ only in case match each other. + +`-n, --line-number` +: Prefix each line of output with the 1-based line number within its input file. + +`-o, --only-matching` +: Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line. + +`-r, --recursive` +: Read all files under each directory, recursively, following symbolic links only if they are on the command line. + +`-E, --extended-regexp` +: Interpret PATTERNS as extended regular expressions. + +### Patterns + +`` +: By default, Hugo strips raw HTML from your markdown prior to rendering, and leaves this HTML comment in its place. + +`ZgotmplZ` +: ZgotmplZ is a special value that indicates that unsafe content reached a CSS or URL context at runtime. For more information see. See [details]. + +[details]: https://pkg.go.dev/html/template + +`[i18n]` +: This is the placeholder produced instead of the default value or an empty string if a translation is missing. + +`()` +: This string will appear in the rendered HTML when passing a nil value to the `printf` function. + +`(<nil>)` +: Same as above when the value returned from the `printf` function has not been passed through `safeHTML`. + +`HAHAHUGO` +: Under certain conditions a rendered shortcode may include all or a portion of the string HAHAHUGOSHORTCODE in either uppercase or lowercase. This is difficult to detect in all circumstances because, but a case-insensitive search of the output for `HAHAHUGO` is likely to catch the majority of cases without producing false positives. diff --git a/content/en/troubleshooting/audit/screen-capture.png b/content/en/troubleshooting/audit/screen-capture.png new file mode 100644 index 0000000000000000000000000000000000000000..221abfff0785bbe3b5d04acd2786891de65ca207 GIT binary patch literal 45665 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 v0.2.0 is a minor release. diff --git a/content/en/troubleshooting/faq.md b/content/en/troubleshooting/faq.md index 736ed5e43..772569f51 100644 --- a/content/en/troubleshooting/faq.md +++ b/content/en/troubleshooting/faq.md @@ -1,62 +1,85 @@ --- title: Frequently asked questions -linkTitle: Frequently asked questions -description: Solutions to some common Hugo problems. +linkTitle: FAQs +description: These questions are frequently asked by new users. categories: [troubleshooting] -keywords: [faqs] +keywords: [faq] menu: docs: parent: troubleshooting - weight: 20 -weight: 20 -toc: true -aliases: [/faq/] + weight: 70 +weight: 70 --- -{{% note %}} -The answers/solutions presented below are short, and may not be enough to solve your problem. Visit [Hugo Discourse](https://discourse.gohugo.io/) and use the search. It that does not help, start a new topic and ask your questions. -{{% /note %}} +Hugo’s [forum] is an active community of users and developers who answer questions, share knowledge, and provide examples. A quick search of over 20,000 topics will often answer your question. Please be sure to read about [requesting help] before asking your first question. -## I can't see my content +These are just a few of the questions most frequently asked by new users. -Is your Markdown file [in draft mode](/content-management/front-matter/#front-matter-variables)? When testing, run `hugo server` with the `-D` or `--buildDrafts` [switch](/getting-started/usage/#draft-future-and-expired-content). +Why do I see "Page Not Found" when visiting the home page? +: In the content/_index.md file: -Is your Markdown file part of a [leaf bundle](/content-management/page-bundles/)? If there is an `index.md` file in the same or any parent directory then other Markdown files will not be rendered as individual pages. + - Is `draft` set to `true`? + - Is the `date` in the future? + - Is the `publishDate` in the future? + - Is the `expiryDate` in the past? -## Can I set configuration variables via OS environment? +: If the answer to any of these questions is yes, either change the field values, or use one of these command line flags: `--buildDrafts`, `--buildFuture`, or `--buildExpired`. -Yes you can! See [Configure with Environment Variables](/getting-started/configuration/#configure-with-environment-variables). +Why is a given section not published? +: In the content/section/_index.md file: -## How do I schedule posts? + - Is `draft` set to `true`? + - Is the `date` in the future? + - Is the `publishDate` in the future? + - Is the `expiryDate` in the past? -1. Set `publishDate` in the page [front matter](/content-management/front-matter/) to a datetime in the future. If you want the creation and publication datetime to be the same, it's also sufficient to only set `date`[^date-hierarchy]. -2. Build and publish at intervals. +: If the answer to any of these questions is yes, either change the field values, or use one of these command line flags: `--buildDrafts`, `--buildFuture`, or `--buildExpired`. -How to automate the "publish at intervals" part depends on your situation: +Why is a given page not published? +: In the content/section/page.md file, or in the content/section/page/index.md file: -* If you deploy from your own PC/server, you can automate with [Cron](https://en.wikipedia.org/wiki/Cron) or similar. -* If your site is hosted on a service similar to [Netlify](https://www.netlify.com/) you can: - * Use a service such as [ifttt](https://ifttt.com/date_and_time) to schedule the updates; or - * Set up a deploy hook which you can run with a cron service to deploy your site at intervals, such as [cron-job.org](https://cron-job.org/) (both Netlify and Cloudflare Pages support deploy hooks) + - Is `draft` set to `true`? + - Is the `date` in the future? + - Is the `publishDate` in the future? + - Is the `expiryDate` in the past? -Also see this Twitter thread: +: If the answer to any of these questions is yes, either change the field values, or use one of these command line flags: `--buildDrafts`, `--buildFuture`, or `--buildExpired`. -{{< tweet user="ChrisShort" id="962380712027590657" >}} +Why can't I see any of a page's descendants? +: You may have an index.md file (leaf bundle) instead of an _index.md file (branch bundle). See [details](/content-management/page-bundles/). -[^date-hierarchy]: See [Configure Dates](/getting-started/configuration/#configure-dates) for the order in which the different date variables are complemented by each other when not explicitly set. +Why is my partial template not rendering as expected? +: You may have neglected to pass the required [context] when calling the partial. For example: -## Can I use the latest Hugo version on Netlify? +```go-html-template +{{/* incorrect */}} +{{ partial "_internal/pagination.html" }} -[Yes you can](/hosting-and-deployment/hosting-on-netlify/#configure-hugo-version-in-netlify)!. - -## I get "... this feature is not available in your current Hugo version" - -If you process `SCSS` or `Sass` to `CSS` in your Hugo project with `libsass` as the transpiler or if you convert images to the `webp` format, you need the Hugo `extended` version, or else you may see an error message similar to the below: - -```sh -error: failed to transform resource: TOCSS: failed to transform "scss/main.scss" (text/x-scss): this feature is not available in your current Hugo version +{{/* correct */}} +{{ partial "_internal/pagination.html" . }} ``` -We release two set of binaries for technical reasons. The extended version is not what you get by default for some installation methods. On the [release page](https://github.com/gohugoio/hugo/releases), look for archives with `extended` in the name. To build `hugo-extended`, use `go install --tags extended` +In a template, what's the difference between `:=` and `=` when assigning values to variables? +: Use `:=` to initialize a variable, and use `=` to assign a value to a variable that has been previously initialized. See [details](https://pkg.go.dev/text/template#hdr-Variables). -To confirm, run `hugo version` and look for the word `extended`. +When I paginate a list page, why is the page collection not filtered as specified? +: You are probably invoking the [`Paginate`] or [`Paginator`] method more than once on the same page. See [details](/templates/pagination/#list-paginator-pages). + +Can I use environment variables to control configuration? +: Yes. See [details](/getting-started/configuration/#configure-with-environment-variables). + +Why am I seeing inconsistent output from one build to the next? +: The most common causes are page collisions (publishing two pages to the same path) and the effects of concurrency. Use the `--printPathWarnings` command line flag to check for page collisions, and create a topic on the [forum] if you suspect concurrency problems. + +{{% note %}} +For other questions please visit the [forum]. A quick search of over 20,000 topics will often answer your question. Please be sure to read about [requesting help] before asking your first question. + +[forum]: https://discourse.gohugo.io +[requesting help]: https://discourse.gohugo.io/t/requesting-help/9132 +{{% /note %}} + +[`Paginate`]: /methods/page/paginate +[`Paginator`]: /methods/page/paginator +[context]: /getting-started/glossary/#context +[forum]: https://discourse.gohugo.io +[requesting help]: https://discourse.gohugo.io/t/requesting-help/9132 diff --git a/content/en/troubleshooting/inspection.md b/content/en/troubleshooting/inspection.md new file mode 100644 index 000000000..826229153 --- /dev/null +++ b/content/en/troubleshooting/inspection.md @@ -0,0 +1,72 @@ +--- +title: Data inspection +linkTitle: Inspection +description: Use template functions to inspect values and data structures. +categories: [troubleshooting] +keywords: [] +menu: + docs: + parent: troubleshooting + weight: 40 +weight: 40 +--- + +Use the [`jsonify`] function to inspect a data structure: + +```go-html-template +
{{ jsonify (dict "indent" "  ") .Params }}
+``` + +```text +{ + "date": "2023-11-10T15:10:42-08:00", + "draft": false, + "iscjklanguage": false, + "lastmod": "2023-11-10T15:10:42-08:00", + "publishdate": "2023-11-10T15:10:42-08:00", + "tags": [ + "foo", + "bar" + ], + "title": "My first post" +} +``` + +{{% note %}} +Hugo will throw an error if you attempt to use the construct above to display context that includes a page collection. For example, in a home page template, this will fail: + +`{{ jsonify (dict "indent" " ") . }}` +{{% /note %}} + +Use the [`debug.Dump`] function to inspect data types: + +```go-html-template +
{{ debug.Dump .Params }}
+``` + +```text +maps.Params{ + "date": time.Time{}, + "draft": false, + "iscjklanguage": false, + "lastmod": time.Time{}, + "publishdate": time.Time{}, + "tags": []string{ + "foo", + "bar", + }, + "title": "My first post", +} +``` + +Use the [`printf`] function (render) or [`warnf`] function (log to console) to inspect simple data structures. The layout string below displays both value and data type. + +```go-html-template +{{ $value := 42 }} +{{ printf "%[1]v (%[1]T)" $value }} → 42 (int) +``` + +[`jsonify`]: /functions/encoding/jsonify +[`debug.Dump`]: /functions/debug/dump +[`printf`]: /functions/fmt/printf +[`warnf`]: /functions/fmt/warnf diff --git a/content/en/troubleshooting/logging.md b/content/en/troubleshooting/logging.md new file mode 100644 index 000000000..8879c1846 --- /dev/null +++ b/content/en/troubleshooting/logging.md @@ -0,0 +1,56 @@ +--- +title: Logging +description: Enable logging to inspect events while building your site. +categories: [troubleshooting] +keywords: [] +menu: + docs: + parent: troubleshooting + weight: 30 +weight: 30 +toc: true +--- + +## Command line + +Enable console logging with the `--logLevel` command line flag. + +Hugo has four logging levels: + +error +: Display error messages only. + +```sh +hugo --logLevel error +``` + +warn +: Display warning and error messages. + +```sh +hugo --logLevel warn +``` + +info +: Display information, warning, and error messages. + +```sh +hugo --logLevel info +``` + +debug +: Display debug, information, warning, and error messages. + +```sh +hugo --logLevel debug +``` + +{{% note %}} +If you do not specify a logging level with the `--logLevel` flag, warnings and errors are always displayed. +{{% /note %}} + +## Template functions + +You can also use template functions to print warnings or errors to the console. These functions are typically used to report data validation errors, missing files, etc. + +{{< list-pages-in-section path=/functions/fmt filter=functions_fmt_logging filterType=include >}} diff --git a/content/en/troubleshooting/performance.md b/content/en/troubleshooting/performance.md new file mode 100644 index 000000000..589d30df6 --- /dev/null +++ b/content/en/troubleshooting/performance.md @@ -0,0 +1,94 @@ +--- +title: Performance +description: Use template metrics and timers to identify opportunities to improve performance. +categories: [troubleshooting] +keywords: [] +menu: + docs: + parent: troubleshooting + weight: 60 +weight: 60 +toc: true +aliases: [/troubleshooting/build-performance/] +--- + +## Template metrics + +Hugo is fast, but inefficient templates impede performance. Enable template metrics to determine which templates take the most time, and to identify caching opportunties: + +```sh +hugo --templateMetrics --templateMetricsHints +``` + +The result will look something like this: + +```text +Template Metrics: + + cumulative average maximum cache percent cached total + duration duration duration potential cached count count template + ---------- -------- -------- --------- ------- ------ ----- -------- + 36.037476822s 135.990478ms 225.765245ms 11 0 0 265 partials/head.html + 35.920040902s 164.018451ms 233.475072ms 0 0 0 219 articles/single.html + 34.163268129s 128.917992ms 224.816751ms 23 0 0 265 partials/head/meta/opengraph.html + 1.041227437s 3.92916ms 186.303376ms 47 0 0 265 partials/head/meta/schema.html + 805.628827ms 27.780304ms 114.678523ms 0 0 0 29 _default/list.html + 624.08354ms 15.221549ms 108.420729ms 8 0 0 41 partials/utilities/render-page-collection.html + 545.968801ms 775.523µs 105.045775ms 0 0 0 704 _default/summary.html + 334.680981ms 1.262947ms 127.412027ms 100 0 0 265 partials/head/js.html + 272.763205ms 2.050851ms 24.371757ms 0 0 0 133 _default/_markup/render-codeblock.html + 230.490038ms 8.865001ms 177.4615ms 0 0 0 26 shortcodes/template.html + 176.921913ms 176.921913ms 176.921913ms 0 0 0 1 examples.tmpl + 163.951469ms 14.904679ms 70.267953ms 0 0 0 11 articles/list.html + 153.07021ms 577.623µs 73.593597ms 100 0 0 265 partials/head/init.html + 150.910984ms 150.910984ms 150.910984ms 0 0 0 1 _default/single.html + 146.785804ms 146.785804ms 146.785804ms 0 0 0 1 _default/contact.html + 115.364617ms 115.364617ms 115.364617ms 0 0 0 1 authors/term.html + 87.392071ms 329.781µs 10.687132ms 100 0 0 265 partials/head/css.html + 86.803122ms 86.803122ms 86.803122ms 0 0 0 1 _default/home.html +``` + +From left to right, the columns represent: + +cumulative duration +: The cumulative time spent executing the template. + +average duration +: The average time spent executing the template. + +maximum duration +: The maximum time spent executing the template. + +cache potential +: Displayed as a percentage, any partial template with a 100% cache potential should be called with the [`partialCached`] function instead of the [`partial`] function. See the [caching](#caching) section below. + +percent cached +: The number of times the rendered templated was cached divided by the number of times the template was executed. + +cached count +: The number of times the rendered templated was cached. + +total count +: The number of times the template was executed. + +template +: The path to the template, relative to the layouts directory. + +[`partial`]: /functions/partials/include +[`partialCached`]: /functions/partials/includecached + +{{% note %}} +Hugo builds pages in parallel where multiple pages are generated simultaneously. Because of this parallelism, the sum of "cumulative duration" values is usually greater than the actual time it takes to build a site. +{{% /note %}} + +## Caching + +Some partial templates such as sidebars or menus are executed many times during a site build. Depending on the content within the partial template and the desired output, the template may benefit from caching to reduce the number of executions. The [`partialCached`] template function provides caching capabilities for partial templates. + +{{% note %}} +Note that you can create cached variants of each partial by passing additional parameters to `partialCached` beyond the initial context. See the `partialCached` documentation for more details. +{{% /note %}} + +## Timers + +Use the `debug.Timer` function to determine execution time for a block of code, useful for finding performance bottle necks in templates. See [details](/functions/debug/timer/). diff --git a/data/page_filters.yaml b/data/page_filters.yaml index 673b762fa..2a3a8625d 100644 --- a/data/page_filters.yaml +++ b/data/page_filters.yaml @@ -8,6 +8,10 @@ # # {{< list-pages-in-section path=/functions/images filter=functions_images_no_filters filterType=exclude >}} +functions_fmt_logging: + - /functions/fmt/errorf + - /functions/fmt/erroridf + - /functions/fmt/warnf functions_images_no_filters: - /functions/images/filter - /functions/images/config