<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="uk">
	<id>https://mediawiki.zina.run/index.php?action=history&amp;feed=atom&amp;title=Sanity_%D0%B8_Hugo</id>
	<title>Sanity и Hugo - Історія редагувань</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zina.run/index.php?action=history&amp;feed=atom&amp;title=Sanity_%D0%B8_Hugo"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zina.run/index.php?title=Sanity_%D0%B8_Hugo&amp;action=history"/>
	<updated>2026-10-12T10:39:42Z</updated>
	<subtitle>Історія редагувань цієї сторінки в вікі</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://mediawiki.zina.run/index.php?title=Sanity_%D0%B8_Hugo&amp;diff=942&amp;oldid=prev</id>
		<title>Romych в 05:36, 9 серпня 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zina.run/index.php?title=Sanity_%D0%B8_Hugo&amp;diff=942&amp;oldid=prev"/>
		<updated>2021-08-09T05:36:31Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Нова сторінка&lt;/b&gt;&lt;/p&gt;&lt;div&gt;←[[Sanity]]&lt;br /&gt;
&lt;br /&gt;
Официальная инструкция: [https://www.sanity.io/guides/sanity-and-hugo-with-netlify-plugins Integrating Sanity and Hugo with Netlify Plugins]&lt;br /&gt;
&lt;br /&gt;
=== Установка окружения ===&lt;br /&gt;
&lt;br /&gt;
Устанавливаем локально Hugo, Git, [https://nodejs.org/ NodeJS], npm, [https://www.sanity.io/docs/getting-started-with-sanity-cli Sanity CLI], [https://docs.netlify.com/cli/get-started/ Netlify CLI]:&lt;br /&gt;
&lt;br /&gt;
 snap install hugo --channel=extended&lt;br /&gt;
 sudo apt install git nodejs npm&lt;br /&gt;
 sudo npm install -g @sanity/cli netlify-cli&lt;br /&gt;
&lt;br /&gt;
Проверяем установленное:&lt;br /&gt;
&lt;br /&gt;
 hugo version&lt;br /&gt;
 nodejs --version&lt;br /&gt;
 npm --version&lt;br /&gt;
 sanity --version&lt;br /&gt;
 netlify --version&lt;br /&gt;
&lt;br /&gt;
=== Hugo ===&lt;br /&gt;
&lt;br /&gt;
Создаем папку проекта. Внутри нее будет две рабочих папки:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; — сайт Hugo и репозиторий для деплоя в Netlify;&lt;br /&gt;
* &amp;lt;code&amp;gt;studio&amp;lt;/code&amp;gt; — Sanity Studio и схемы контента.&lt;br /&gt;
&lt;br /&gt;
Находясь в корне проекта, клонируем репозиторий с подготовленной сборкой Hugo в папку &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/bathrobe/hugo-sanity-starter-tut web&lt;br /&gt;
&lt;br /&gt;
Запускаем сборку сайта средствами Hugo:&lt;br /&gt;
&lt;br /&gt;
 cd web&lt;br /&gt;
 hugo server&lt;br /&gt;
&lt;br /&gt;
Проверяем сайт в браузере: &lt;br /&gt;
&lt;br /&gt;
* http://localhost:1313/&lt;br /&gt;
&lt;br /&gt;
=== Деплой на Netlify ===&lt;br /&gt;
&lt;br /&gt;
Создаем на [https://github.com/ GitHub], [https://gitlab.com/ GitLab] или [https://bitbucket.org/ Bitbucket] новый репозиторий и добавляем в него содержимое папки &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Логинимся на https://netlify.com/ и кликаем кнопку &amp;#039;&amp;#039;&amp;#039;New site from Git&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Netlify запросит доступ к репозиторию. После того, как доступ будет предоставлен, Netlify определит команду для сборки сайта hugo и папку для итогового сайта:&lt;br /&gt;
&lt;br /&gt;
[[Файл:Netlify-hugo.png|обрамить|центр]]&lt;br /&gt;
&lt;br /&gt;
Жмем &amp;quot;Deploy site&amp;quot; и ждем пару минут. Netlify закончит деплой из нашего репозитория к себе в облако и покажет ссылку на рабочий сайт на субдомене &amp;lt;code&amp;gt;.netlify.app&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Sanity Studio ===&lt;br /&gt;
&lt;br /&gt;
Переходим в корень проекта и инициализируем Sanity:&lt;br /&gt;
&lt;br /&gt;
 cd ..&lt;br /&gt;
 sanity init&lt;br /&gt;
&lt;br /&gt;
В процессе выбираем: &amp;lt;code&amp;gt;Create new project&amp;lt;/code&amp;gt; — &amp;lt;code&amp;gt;Use the default dataset configuration&amp;lt;/code&amp;gt; — соглашаемся с предложенным &amp;lt;code&amp;gt;Project output path&amp;lt;/code&amp;gt; —  выбираем &amp;lt;code&amp;gt;&amp;quot;blog (schema)&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После завершения появится новая папка, названная в соответствии с предложенным раньше Project output path — переименовываем ее в &amp;lt;code&amp;gt;studio&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Получим в браузере админку для редактирования контента:&lt;br /&gt;
&lt;br /&gt;
 cd studio&lt;br /&gt;
 sanity start&lt;br /&gt;
&lt;br /&gt;
Откройте админку в браузере:&lt;br /&gt;
&lt;br /&gt;
* http://localhost:3333/&lt;br /&gt;
&lt;br /&gt;
Можно поиграть с контентом, со связями между сущностями Post, Author, Category. Все изменения сохраняются сразу, но, чтобы отредактированную сущность можно было использовать в другой, нужно нажимать кнопку &amp;lt;kbd&amp;gt;Publish&amp;lt;/kbd&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Также можно поиграть со схемами контента, как [https://www.sanity.io/guides/sanity-and-hugo-with-netlify-plugins#d8045bbae7aa написано в инструкции] или в видео: https://youtu.be/32RP-sG1njE?t=259. Изменения сразу появляются в админке.&lt;br /&gt;
&lt;br /&gt;
Также можно опубликовать наш контент в облаке Sanity, сделав его доступным для редактирования другими участниками команды:&lt;br /&gt;
&lt;br /&gt;
 sanity deploy&lt;br /&gt;
&lt;br /&gt;
Нужно будет придумать субдомен для URL типа название-вашего-проекта.sanity.studio — на этом адресе и будет доступна админка в облаке.&lt;br /&gt;
&lt;br /&gt;
=== Импорт контента из Sanity в файлы .md в Hugo ===&lt;br /&gt;
&lt;br /&gt;
Делается посредством создания [https://www.netlify.com/products/build/plugins/ Netlify Build Plugin].&lt;br /&gt;
&lt;br /&gt;
Перейдите в &amp;lt;code&amp;gt;web&amp;lt;/code&amp;gt; и запустите &amp;lt;code&amp;gt;netlify link&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 cd ../web/&lt;br /&gt;
 netlify link&lt;br /&gt;
&lt;br /&gt;
Netlift спросит, с каким проектом связать текущую папку — выбираем &amp;lt;code&amp;gt;Use current git remote origin&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
После этого можно тестировать плагин командой &amp;lt;code&amp;gt;netlify build --dry&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для создания плагина создадим файл package.json командой:&lt;br /&gt;
&lt;br /&gt;
 npm init -y&lt;br /&gt;
&lt;br /&gt;
Установим необходимые зависимости:&lt;br /&gt;
&lt;br /&gt;
 npm install @sanity/block-content-to-markdown @sanity/client fs-extra&lt;br /&gt;
&lt;br /&gt;
Создайте файл &amp;lt;code&amp;gt;netlify.toml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 touch netlify.toml&lt;br /&gt;
&lt;br /&gt;
и добавьте в него две строки:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;[[plugins]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 package = &amp;quot;/plugins/netlify-sanity-md&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Создайте вложенные папки:&lt;br /&gt;
&lt;br /&gt;
 mkdir -p plugins/netlify-sanity-md&lt;br /&gt;
&lt;br /&gt;
и внутри два файла — &amp;lt;code&amp;gt;index.js&amp;lt;/code&amp;gt; и &amp;lt;code&amp;gt;manifest.yml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 touch plugins/netlify-sanity-md/index.js plugins/netlify-sanity-md/manifest.yml&lt;br /&gt;
&lt;br /&gt;
Вставьте в &amp;lt;code&amp;gt;manifest.yml&amp;lt;/code&amp;gt; строку:&lt;br /&gt;
&lt;br /&gt;
 name: netlify-sanity-md&lt;br /&gt;
&lt;br /&gt;
Внутри &amp;lt;code&amp;gt;index.js&amp;lt;/code&amp;gt; напишите скрипт плагина, как это [https://www.sanity.io/guides/sanity-and-hugo-with-netlify-plugins#abd45c377fd8 описано в инструкции]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
module.exports = {&lt;br /&gt;
  onPreBuild: async ({ utils, packageJson }) =&amp;gt; {&lt;br /&gt;
    console.log(&amp;quot;Starting plugin&amp;quot;);&lt;br /&gt;
    //imports&lt;br /&gt;
    const fs = require(&amp;quot;fs-extra&amp;quot;);&lt;br /&gt;
    const toMarkdown = require(&amp;quot;@sanity/block-content-to-markdown&amp;quot;);&lt;br /&gt;
    const client = require(&amp;quot;@sanity/client&amp;quot;)({&lt;br /&gt;
      projectId: &amp;quot;YOUR_PROJECT_ID_HERE&amp;quot;,&lt;br /&gt;
      dataset: &amp;quot;YOUR_DATASET_HERE&amp;quot;,&lt;br /&gt;
      useCdn: false,&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    //add any serializers for your portable text&lt;br /&gt;
    const serializers = {&lt;br /&gt;
      types: {&lt;br /&gt;
        code: (props) =&amp;gt;&lt;br /&gt;
          &amp;quot;```&amp;quot; + props.node.language + &amp;quot;\n&amp;quot; + props.node.code + &amp;quot;\n```&amp;quot;,&lt;br /&gt;
      },&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    fs.readdir(&amp;quot;./content&amp;quot;, (err, files) =&amp;gt; {&lt;br /&gt;
      if (err) console.log(err);&lt;br /&gt;
      else {&lt;br /&gt;
        files.forEach((file) =&amp;gt; {&lt;br /&gt;
          console.log(`Deleting: ${file}`);&lt;br /&gt;
          fs.unlink(`content//${file}`, (err) =&amp;gt; {&lt;br /&gt;
            if (err) throw err;&lt;br /&gt;
&lt;br /&gt;
          });&lt;br /&gt;
        });&lt;br /&gt;
      }&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    try {&lt;br /&gt;
      await client&lt;br /&gt;
        .fetch(`*[_type == &amp;quot;post&amp;quot;]{categories[]-&amp;gt;{title}, date, slug, title, body}`)&lt;br /&gt;
        .then((res) =&amp;gt;&lt;br /&gt;
          res.map(async (post) =&amp;gt; {&lt;br /&gt;
            //output YAML frontmatter here&lt;br /&gt;
            let frontmatter = &amp;quot;---&amp;quot;;&lt;br /&gt;
            Object.keys(post).forEach((field) =&amp;gt; {&lt;br /&gt;
              if (field === &amp;quot;slug&amp;quot;) {&lt;br /&gt;
                return (frontmatter += `\n${field}: &amp;quot;${post.slug.current}&amp;quot;`);&lt;br /&gt;
              } else if (field === &amp;quot;categories&amp;quot;) {&lt;br /&gt;
                return (frontmatter += `\n${field}: [${post.categories.map(&lt;br /&gt;
                  (cat) =&amp;gt; `&amp;quot;${cat.title}&amp;quot;`&lt;br /&gt;
                )}]`);&lt;br /&gt;
              } else if (field === &amp;quot;body&amp;quot;) {&lt;br /&gt;
                return;&lt;br /&gt;
              } else {&lt;br /&gt;
                frontmatter += `\n${field}: &amp;quot;${post[field]}&amp;quot;`;&lt;br /&gt;
              }&lt;br /&gt;
            });&lt;br /&gt;
            frontmatter += &amp;quot;\n---\n\n&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            const wholePost = `${frontmatter}${toMarkdown(post.body, {&lt;br /&gt;
              serializers,&lt;br /&gt;
            })}`;&lt;br /&gt;
&lt;br /&gt;
            const filePath = `./content/${post.slug.current}.md`;&lt;br /&gt;
            fs.outputFile(filePath, wholePost, function (err, data) {&lt;br /&gt;
              if (err) {&lt;br /&gt;
                return console.log(err);&lt;br /&gt;
              }&lt;br /&gt;
            });&lt;br /&gt;
          })&lt;br /&gt;
        );&lt;br /&gt;
    } catch (error) {&lt;br /&gt;
      utils.build.failBuild(&amp;quot;Failure message&amp;quot;, { error });&lt;br /&gt;
    }&lt;br /&gt;
  },&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В начале скрипта вставьте значения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
      projectId: &amp;quot;YOUR_PROJECT_ID_HERE&amp;quot;,&lt;br /&gt;
      dataset: &amp;quot;YOUR_DATASET_HERE&amp;quot;,&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
из файла &amp;lt;code&amp;gt;studio/sanity.json&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Выполните команду:&lt;br /&gt;
&lt;br /&gt;
 netlify build&lt;br /&gt;
&lt;br /&gt;
и проверьте — внутри папки &amp;lt;code&amp;gt;content&amp;lt;/code&amp;gt; появятся файлы, соответствующие контенту в Sanity Studio.&lt;br /&gt;
&lt;br /&gt;
Удалите папку &amp;lt;code&amp;gt;public&amp;lt;/code&amp;gt; и отправьте код в репозиторий:&lt;br /&gt;
&lt;br /&gt;
 git add .&lt;br /&gt;
 git commit -m &amp;quot;Create Netlify plugin&amp;quot;&lt;br /&gt;
 git push&lt;br /&gt;
&lt;br /&gt;
Выполните деплой:&lt;br /&gt;
&lt;br /&gt;
 netlify build&lt;br /&gt;
&lt;br /&gt;
и проверьте URL вашего сайта на .netlify.app - там уже должна быть обновленная версия с контентом из Sanity Studio.&lt;br /&gt;
&lt;br /&gt;
=== Deploy from the Sanity dashboard ===&lt;br /&gt;
&lt;br /&gt;
 cd ../studio&lt;br /&gt;
 sanity install @sanity/dashboard&lt;br /&gt;
 sanity install dashboard-widget-netlify&lt;br /&gt;
&lt;br /&gt;
Добавьте в файл &amp;lt;code&amp;gt;sanity.json&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
    //...&lt;br /&gt;
      &amp;quot;parts&amp;quot;: [&lt;br /&gt;
    //...&lt;br /&gt;
      {&lt;br /&gt;
         &amp;quot;implements&amp;quot;: &amp;quot;part:@sanity/dashboard/config&amp;quot;,&lt;br /&gt;
         &amp;quot;path&amp;quot;: &amp;quot;src/dashboardConfig.js&amp;quot;&lt;br /&gt;
       }&lt;br /&gt;
     ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создайте папку &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; и в ней файл &amp;lt;code&amp;gt;dashboardConfig.js&amp;lt;/code&amp;gt;. Вставьте в этот файл строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;&lt;br /&gt;
export default {&lt;br /&gt;
    widgets: [&lt;br /&gt;
        {&lt;br /&gt;
        name: &amp;#039;netlify&amp;#039;,&lt;br /&gt;
        options: {&lt;br /&gt;
          title: &amp;#039;My Netlify deploys&amp;#039;,&lt;br /&gt;
          sites: [&lt;br /&gt;
            {&lt;br /&gt;
              title: &amp;#039;My Hugo Sanity Website&amp;#039;,&lt;br /&gt;
              apiId: &amp;#039;YOUR_API_ID&amp;#039;,&lt;br /&gt;
              buildHookId: &amp;#039;YOUR_BUILDHOOK_ID&amp;#039;,&lt;br /&gt;
              name: &amp;#039;NETLIFY_SITENAME&amp;#039;&lt;br /&gt;
            }&lt;br /&gt;
          ]&lt;br /&gt;
        }&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вместо &amp;#039;&amp;#039;&amp;#039;apiId&amp;#039;&amp;#039;&amp;#039; вставьте значение из Netlify &amp;quot;Site Settings &amp;gt; General &amp;gt; Site Details &amp;gt; Site Information &amp;gt; API ID&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;buildHookId&amp;#039;&amp;#039;&amp;#039; сгенерируйте на Netlify &amp;quot;Site Settings &amp;gt; Build and Deploy &amp;gt; Build Hooks &amp;gt; Add build hook&amp;quot;. В качестве ID используйте часть после &amp;lt;code&amp;gt;build_hooks/&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Запустите локальную Sanity Studio:&lt;br /&gt;
&lt;br /&gt;
 sanity start&lt;br /&gt;
&lt;br /&gt;
Откройте в браузере http://localhost:3333/ — вверху появится кнопка &amp;lt;kbd&amp;gt;Dashboard&amp;lt;/kbd&amp;gt;, которая открывает страницу http://localhost:3333/dashboard с кнопкой &amp;lt;kbd&amp;gt;Deploy&amp;lt;/kbd&amp;gt; на Netlify.&lt;br /&gt;
&lt;br /&gt;
Теперь вносите изменения в контент, после сохранения нажимайте &amp;lt;kbd&amp;gt;Deploy&amp;lt;/kbd&amp;gt; — сайт будет автоматически обновляться.&lt;/div&gt;</summary>
		<author><name>Romych</name></author>
	</entry>
</feed>