]> git.maquefel.me Git - brevno-suite/hugo/commitdiff
Add HUGO_PUBLISHDIR to the Node environment
authorBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 22 Dec 2022 08:43:53 +0000 (09:43 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Thu, 22 Dec 2022 11:43:50 +0000 (12:43 +0100)
So you can do  `process.env.HUGO_PUBLISHDIR` in your `postcss.config.js` to figure out where Hugo publishes
its files.

Note that the value will always be an absolute file path and will point to a directory on disk even when running `hugo server` in memory mode.

If you write to this folder from PostCSS when running the server, you could run the server with one of these flags:

```
hugo server --renderToDisk
hugo server --renderStaticToDisk
```

Fixes #10554

commands/commandeer.go
common/hugo/hugo.go
docs/content/en/hugo-pipes/postprocess.md
hugolib/config.go
resources/resource_transformers/postcss/integration_test.go

index 6aca3e3fa75410189ebb8405bda314e24ab64340..80d4c55d0b32e1910b6ff86f058fc59bcb03aa81 100644 (file)
@@ -408,6 +408,9 @@ func (c *commandeer) loadConfig() error {
 
        createMemFs := config.GetBool("renderToMemory")
        c.renderStaticToDisk = config.GetBool("renderStaticToDisk")
+       // TODO(bep) we/I really need to look at the config set up, but to prevent changing too much
+       // we store away the original.
+       config.Set("publishDirOrig", config.GetString("publishDir"))
 
        if createMemFs {
                // Rendering to memoryFS, publish to Root regardless of publishDir.
index 86a81a5d8e47e15395e81282d74be2fcc9b4e7e9..efcb470a3c41da0f501754ab88f2c4f187941482 100644 (file)
@@ -126,6 +126,8 @@ func GetExecEnviron(workDir string, cfg config.Provider, fs afero.Fs) []string {
        config.SetEnvVars(&env, "HUGO_ENVIRONMENT", cfg.GetString("environment"))
        config.SetEnvVars(&env, "HUGO_ENV", cfg.GetString("environment"))
 
+       config.SetEnvVars(&env, "HUGO_PUBLISHDIR", filepath.Join(workDir, cfg.GetString("publishDirOrig")))
+
        if fs != nil {
                fis, err := afero.ReadDir(fs, files.FolderJSConfig)
                if err == nil {
index 1aa3983568e54d9d4ecde882fd8c006f765cc5d8..55552d105575cebd86b3cc4fb347e99fa70874cc 100755 (executable)
@@ -68,3 +68,30 @@ Note that in the example above, the "CSS purge step" will only be applied to the
 {{ end }}
 <link href="{{ $css.RelPermalink }}" rel="stylesheet" />
 ```
+
+
+## Hugo Environment variables available in PostCSS
+
+These are the environment variables Hugo passes down to PostCSS (and Babel), which allows you do do `process.env.HUGO_ENVIRONMENT === 'production' ? [autoprefixer] : []` and similar:
+
+PWD
+: The absolute path to the project working directory.
+HUGO_ENVIRONMENT (and the alias HUGO_ENV)
+: The value e.g. set with `hugo -e production` (defaults to `production` for `hugo` and `development` for `hugo server`).
+
+HUGO_PUBLISHDIR
+: {{ new-in "0.109.0" }} The absolute path to the publish directory (the `public` directory). Note that the value will always point to a directory on disk even when running `hugo server` in memory mode. If you write to this folder from PostCSS when running the server, you could run the server with one of these flags:
+
+```
+hugo server --renderToDisk
+hugo server --renderStaticToDisk
+```
+
+Also, Hugo will add environment variables for all files mounted below `assets/_jsconfig`. A default mount will be set up with files in the project root matching this regexp: `(babel|postcss|tailwind)\.config\.js`.
+
+These will get environment variables named on the form `HUGO_FILE_:filename:` where `:filename:` is all upper case with periods replaced with underscore. This allows you do do this and similar:
+
+```js
+let tailwindConfig = process.env.HUGO_FILE_TAILWIND_CONFIG_JS || './tailwind.config.js';
+```
+
index 9ccb870148010509ef19dd2e79b143d4bd0e0f23..8e73a35ec12069f1d60b88e91f1cbd0d27b3fa9e 100644 (file)
@@ -242,6 +242,7 @@ func (l configLoader) applyConfigDefaults() error {
                "watch":                                false,
                "resourceDir":                          "resources",
                "publishDir":                           "public",
+               "publishDirOrig":                       "public",
                "themesDir":                            "themes",
                "buildDrafts":                          false,
                "buildFuture":                          false,
index ab48297e4da3aa2bb08b32ec3215432142107a11..cfe5f8a2ca65b7516918736d5fd0a72cf4aae30a 100644 (file)
@@ -85,6 +85,7 @@ Styles Content: Len: {{ len $styles.Content }}|
 }
 -- postcss.config.js --
 console.error("Hugo Environment:", process.env.HUGO_ENVIRONMENT );
+console.error("Hugo PublishDir:", process.env.HUGO_PUBLISHDIR );
 // https://github.com/gohugoio/hugo/issues/7656
 console.error("package.json:", process.env.HUGO_FILE_PACKAGE_JSON );
 console.error("PostCSS Config File:", process.env.HUGO_FILE_POSTCSS_CONFIG_JS );
@@ -118,8 +119,6 @@ func TestTransformPostCSS(t *testing.T) {
 
                files := repl.Replace(postCSSIntegrationTestFiles)
 
-               fmt.Println("===>", s, files)
-
                b := hugolib.NewIntegrationTestBuilder(
                        hugolib.IntegrationTestConfig{
                                T:               c,
@@ -135,6 +134,10 @@ Styles RelPermalink: /foo/css/styles.css
 Styles Content: Len: 770917|
 `)
 
+               if s == "never" {
+                       b.AssertLogContains("Hugo Environment: production")
+                       b.AssertLogContains("Hugo PublishDir: " + filepath.Join(tempDir, "public"))
+               }
        }
 
 }