<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Flake on Haseeb Majid</title>
    <link>https://haseebmajid.dev/tags/flake/</link>
    <description>Recent content in Flake on Haseeb Majid</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Thu, 26 Oct 2023 00:00:00 +0000</lastBuildDate><atom:link href="https://haseebmajid.dev/tags/flake/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>How to Setup a Go Development Shell With Nix Flakes</title>
      <link>https://haseebmajid.dev/posts/2023-10-26-how-to-setup-a-go-development-shell-with-nix-flakes/</link>
      <pubDate>Thu, 26 Oct 2023 00:00:00 +0000</pubDate>
      
      <guid>https://haseebmajid.dev/posts/2023-10-26-how-to-setup-a-go-development-shell-with-nix-flakes/</guid>
      <description>&lt;p&gt;As you may know, I have been using Nix/NixOS for the last few months. I finally started doing some development, after
spending lots and lots and lots of time tweaking my setup (and neovim).&lt;/p&gt;
&lt;p&gt;As part of starting to do some real development work, I am now trying to leverage devshells with Nix flakes.
I like the concept of Nix devshells, I have tried using Docker dev containers in the past, but the issue I had
with those was adding my tools such as shell (fish) or cli tools was not easy. Whereas Nix shells just add
tools and scripts to our existing shell.&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>As you may know, I have been using Nix/NixOS for the last few months. I finally started doing some development, after
spending lots and lots and lots of time tweaking my setup (and neovim).</p>
<p>As part of starting to do some real development work, I am now trying to leverage devshells with Nix flakes.
I like the concept of Nix devshells, I have tried using Docker dev containers in the past, but the issue I had
with those was adding my tools such as shell (fish) or cli tools was not easy. Whereas Nix shells just add
tools and scripts to our existing shell.</p>
<p>By using Nix flakes we can guarantee (or close to) that developers will be using the same versions of all the tools,
provided in the devshell.</p>
<h2 id="flake-template">Flake Template</h2>
<p>First, we make sure you have support for Nix flakes <sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup>. To get started let&rsquo;s use a flake template to create a new flake
in our go project. First, make sure you are in the root of your project i.e. where <code>go.mod</code> is and then run
<code>nix flake init -t github:nix-community/gomod2nix#app</code> <sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>.</p>
<details
  class="notice warning"
  open="true"
>
    <summary class="notice-title">Fix</summary>
  
  <p>At the moment the created flake is broken, on line 25 we have to fix this.
Remove <code>buildGoApplication</code> so the line looks like <code>inherit (gomod2nix.legacyPackages.${system}) mkGoEnv gomod2nix;</code>.</p>
<p>See this <a href="https://github.com/nix-community/gomod2nix/pull/133/files">PR</a> for more information.</p>

</details>

<h3 id="direnv">direnv</h3>
<p>I would recommend enabling <code>direnv</code> which is a tool that allows us to run commands automatically when entering a
directory there is a version available for <a href="https://github.com/nix-community/nix-direnv">nix</a>. This will cache our Nix
development shell and make it much faster to run after the first run. Also prevents the garbage collector from removing
build dependencies we need for our nix shells.</p>
<p>We can enable nix-direnv in home-manager like so:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nix" data-lang="nix"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">programs</span><span class="o">.</span><span class="n">direnv</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">enable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">nix-direnv</span><span class="o">.</span><span class="n">enable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h3 id="gomod2nix">gomod2nix</h3>
<p>Then after entering the development shell either via <code>direnv</code> or running <code>nix develop</code>, run the following command:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">gomod2nix generate
</span></span></code></pre></div><p>This will populate the <code>gomod2nix.toml</code> file with information about our dependencies:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-toml" data-lang="toml"><span class="line"><span class="cl"><span class="nx">schema</span> <span class="p">=</span> <span class="mi">3</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="p">[</span><span class="nx">mod</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">  <span class="p">[</span><span class="nx">mod</span><span class="p">.</span><span class="s2">&#34;github.com/PuerkitoBio/goquery&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="nx">version</span> <span class="p">=</span> <span class="s2">&#34;v1.8.1&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">hash</span> <span class="p">=</span> <span class="s2">&#34;sha256-z2RaB8PVPEzSJdMUfkfNjT616yXWTjW2gkhNOh989ZU=&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">[</span><span class="nx">mod</span><span class="p">.</span><span class="s2">&#34;github.com/andybalholm/cascadia&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="nx">version</span> <span class="p">=</span> <span class="s2">&#34;v1.3.1&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">hash</span> <span class="p">=</span> <span class="s2">&#34;sha256-M0u22DXSeXUaYtl1KoW1qWL46niFpycFkraCEQ/luYA=&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">[</span><span class="nx">mod</span><span class="p">.</span><span class="s2">&#34;github.com/davecgh/go-spew&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="nx">version</span> <span class="p">=</span> <span class="s2">&#34;v1.1.1&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">hash</span> <span class="p">=</span> <span class="s2">&#34;sha256-nhzSUrE1fCkN0+RL04N4h8jWmRFPPPWbCuDc7Ss0akI=&#34;</span>
</span></span><span class="line"><span class="cl">  <span class="p">[</span><span class="nx">mod</span><span class="p">.</span><span class="s2">&#34;github.com/pmezard/go-difflib&#34;</span><span class="p">]</span>
</span></span><span class="line"><span class="cl">    <span class="nx">version</span> <span class="p">=</span> <span class="s2">&#34;v1.0.0&#34;</span>
</span></span><span class="line"><span class="cl">    <span class="nx">hash</span> <span class="p">=</span> <span class="s2">&#34;sha256-/FtmHnaGjdvEIKAJtrUfEhV7EVo5A/eYrtdnUkuxLDA=&#34;</span>
</span></span></code></pre></div><h2 id="adding-extra-packages">Adding extra packages</h2>
<p>Now how we can add extra packages to our Nix shell? Simply go to our <code>shell.nix</code> file and find the bit where
we specify the <code>pkgs.mkShell</code>. Then here we can add the packages we want available, such as say <code>golangci-lint</code> or
<code>gotools</code> to have goimports tool available.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nix" data-lang="nix"><span class="line"><span class="cl"><span class="n">pkgs</span><span class="o">.</span><span class="n">mkShell</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">hardeningDisable</span> <span class="o">=</span> <span class="p">[</span> <span class="s2">&#34;all&#34;</span> <span class="p">];</span>
</span></span><span class="line"><span class="cl">  <span class="n">packages</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl">    <span class="n">goEnv</span>
</span></span><span class="line"><span class="cl">    <span class="n">gomod2nix</span>
</span></span><span class="line"><span class="cl">    <span class="n">pkgs</span><span class="o">.</span><span class="n">golangci-lint</span>
</span></span><span class="line"><span class="cl">    <span class="n">pkgs</span><span class="o">.</span><span class="n">go_1_21</span>
</span></span><span class="line"><span class="cl">    <span class="n">pkgs</span><span class="o">.</span><span class="n">gotools</span>
</span></span><span class="line"><span class="cl">    <span class="n">pkgs</span><span class="o">.</span><span class="n">go-junit-report</span>
</span></span><span class="line"><span class="cl">    <span class="n">pkgs</span><span class="o">.</span><span class="n">go-task</span>
</span></span><span class="line"><span class="cl">    <span class="n">pkgs</span><span class="o">.</span><span class="n">delve</span>
</span></span><span class="line"><span class="cl">  <span class="p">];</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Now our nix shell will have these tools available including go version 1.21. It&rsquo;d be nice to find a way to specify
the go version in the go.mod file and just use that version.</p>
<h3 id="flakelock">flake.lock</h3>
<p>We can check the flake.lock which makes sure that
when we share this repository other developers will get the same version of the tools we did. As the flake.lock
specifies a specific git revision until we do a flake update, this will include nixpkgs which are a set of nix
expressions git repo.</p>
<p>So updating the flake will update the revision of nixpkgs, which may then include the expression
to build a newer version of say <code>golangci-lint</code>. However again this will be the same for all developers once they have
pulled in our changes and rebuilt their dev shell. Which makes our development environment far more reproducible.</p>
<h2 id="pre-commit">pre-commit</h2>
<p>Now that we have packages available, we can also add pre-commit hooks to our development shell. Using the popular
pre-commit tool. First, we need to add a new input to our flake.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nix" data-lang="nix"><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl"><span class="n">inputs</span><span class="o">.</span><span class="n">nixpkgs</span><span class="o">.</span><span class="n">url</span> <span class="o">=</span> <span class="s2">&#34;github:NixOS/nixpkgs/nixos-unstable&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">inputs</span><span class="o">.</span><span class="n">flake-utils</span><span class="o">.</span><span class="n">url</span> <span class="o">=</span> <span class="s2">&#34;github:numtide/flake-utils&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">inputs</span><span class="o">.</span><span class="n">gomod2nix</span><span class="o">.</span><span class="n">url</span> <span class="o">=</span> <span class="s2">&#34;github:nix-community/gomod2nix&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">inputs</span><span class="o">.</span><span class="n">gomod2nix</span><span class="o">.</span><span class="n">inputs</span><span class="o">.</span><span class="n">nixpkgs</span><span class="o">.</span><span class="n">follows</span> <span class="o">=</span> <span class="s2">&#34;nixpkgs&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">inputs</span><span class="o">.</span><span class="n">gomod2nix</span><span class="o">.</span><span class="n">inputs</span><span class="o">.</span><span class="n">flake-utils</span><span class="o">.</span><span class="n">follows</span> <span class="o">=</span> <span class="s2">&#34;flake-utils&#34;</span><span class="p">;</span>
</span></span><span class="line hl"><span class="cl"><span class="n">inputs</span><span class="o">.</span><span class="n">pre-commit-hooks</span><span class="o">.</span><span class="n">url</span> <span class="o">=</span> <span class="s2">&#34;github:cachix/pre-commit-hooks.nix&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Then add the pre-commits as an argument to our outputs and make sure its accessible to our <code>devShell</code>, this is where
we will set up our pre-commit hooks.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nix" data-lang="nix"><span class="line"><span class="cl"><span class="n">outputs</span> <span class="err">=</span> <span class="p">{</span> <span class="n">self</span><span class="o">,</span> <span class="n">nixpkgs</span><span class="o">,</span> <span class="n">flake-utils</span><span class="o">,</span> <span class="n">gomod2nix</span><span class="o">,</span> <span class="n">pre-commit-hooks</span><span class="o">,</span> <span class="o">...</span> <span class="p">}:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">devShells</span><span class="o">.</span><span class="n">default</span> <span class="o">=</span> <span class="n">callPackage</span> <span class="sr">./shell.nix</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">inherit</span> <span class="p">(</span><span class="n">gomod2nix</span><span class="o">.</span><span class="n">legacyPackages</span><span class="o">.</span><span class="si">${</span><span class="n">system</span><span class="si">}</span><span class="p">)</span> <span class="n">mkGoEnv</span> <span class="n">gomod2nix</span><span class="p">;</span>
</span></span><span class="line hl"><span class="cl">    <span class="k">inherit</span> <span class="n">pre-commit-hooks</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>Then in our <code>shell.nix</code> file we want it to look something like this:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nix" data-lang="nix"><span class="line"><span class="cl"><span class="p">{</span> <span class="n">pkgs</span> 
</span></span><span class="line"><span class="cl"><span class="o">,</span> <span class="n">mkGoEnv</span> <span class="o">?</span> <span class="n">pkgs</span><span class="o">.</span><span class="n">mkGoEnv</span>
</span></span><span class="line"><span class="cl"><span class="o">,</span> <span class="n">gomod2nix</span> <span class="o">?</span> <span class="n">pkgs</span><span class="o">.</span><span class="n">gomod2nix</span>
</span></span><span class="line"><span class="cl"><span class="o">,</span> <span class="n">pre-commit-hooks</span>
</span></span><span class="line"><span class="cl"><span class="o">,</span> <span class="o">...</span>
</span></span><span class="line"><span class="cl"><span class="p">}:</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">let</span>
</span></span><span class="line"><span class="cl">  <span class="n">pre-commit-check</span> <span class="o">=</span> <span class="n">pre-commit-hooks</span><span class="o">.</span><span class="n">lib</span><span class="o">.</span><span class="si">${</span><span class="n">pkgs</span><span class="o">.</span><span class="n">system</span><span class="si">}</span><span class="o">.</span><span class="n">run</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">src</span> <span class="o">=</span> <span class="sr">./.</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="n">hooks</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">gofmt</span><span class="o">.</span><span class="n">enable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="n">golangci-lint</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">enable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">name</span> <span class="o">=</span> <span class="s2">&#34;golangci-lint&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">description</span> <span class="o">=</span> <span class="s2">&#34;Lint my golang code&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">files</span> <span class="o">=</span> <span class="s2">&#34;</span><span class="se">\.</span><span class="s2">go$&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">entry</span> <span class="o">=</span> <span class="s2">&#34;</span><span class="si">${</span><span class="n">pkgs</span><span class="o">.</span><span class="n">golangci-lint</span><span class="si">}</span><span class="s2">/bin/golangci-lint run --new-from-rev HEAD --fix&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">require_serial</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">pass_filenames</span> <span class="o">=</span> <span class="no">false</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="p">};</span>
</span></span><span class="line"><span class="cl">      <span class="n">goimports</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">enable</span> <span class="o">=</span> <span class="no">true</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">name</span> <span class="o">=</span> <span class="s2">&#34;goimports&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">description</span> <span class="o">=</span> <span class="s2">&#34;Format my golang code&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">files</span> <span class="o">=</span> <span class="s2">&#34;</span><span class="se">\.</span><span class="s2">go$&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">entry</span> <span class="o">=</span>
</span></span><span class="line"><span class="cl">          <span class="k">let</span>
</span></span><span class="line"><span class="cl">            <span class="n">script</span> <span class="o">=</span> <span class="n">pkgs</span><span class="o">.</span><span class="n">writeShellScript</span> <span class="s2">&#34;precommit-goimports&#34;</span> <span class="s1">&#39;&#39;
</span></span></span><span class="line"><span class="cl"><span class="s1">              set -e
</span></span></span><span class="line"><span class="cl"><span class="s1">              failed=false
</span></span></span><span class="line"><span class="cl"><span class="s1">              for file in &#34;$@&#34;; do
</span></span></span><span class="line"><span class="cl"><span class="s1">                  # redirect stderr so that violations and summaries are properly interleaved.
</span></span></span><span class="line"><span class="cl"><span class="s1">                  if ! </span><span class="si">${</span><span class="n">pkgs</span><span class="o">.</span><span class="n">gotools</span><span class="si">}</span><span class="s1">/bin/goimports -l -d &#34;$file&#34; 2&gt;&amp;1
</span></span></span><span class="line"><span class="cl"><span class="s1">                  then
</span></span></span><span class="line"><span class="cl"><span class="s1">                      failed=true
</span></span></span><span class="line"><span class="cl"><span class="s1">                  fi
</span></span></span><span class="line"><span class="cl"><span class="s1">              done
</span></span></span><span class="line"><span class="cl"><span class="s1">              if [[ $failed == &#34;true&#34; ]]; then
</span></span></span><span class="line"><span class="cl"><span class="s1">                  exit 1
</span></span></span><span class="line"><span class="cl"><span class="s1">              fi
</span></span></span><span class="line"><span class="cl"><span class="s1">            &#39;&#39;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">          <span class="k">in</span>
</span></span><span class="line"><span class="cl">          <span class="nb">builtins</span><span class="o">.</span><span class="nb">toString</span> <span class="n">script</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">      <span class="p">};</span>
</span></span><span class="line"><span class="cl">    <span class="p">};</span>
</span></span><span class="line"><span class="cl">  <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="k">in</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pkgs</span><span class="o">.</span><span class="n">mkShell</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="k">inherit</span> <span class="p">(</span><span class="n">pre-commit-check</span><span class="p">)</span> <span class="n">shellHook</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>When we enter our nix shell it will automatically install pre-commit hooks and the yaml file <code>.pre-commit-config.yaml</code>
(We should add this file to a gitignore). That&rsquo;s all we need to get our pre-commit.</p>
<h2 id="build-go-binary">Build go binary</h2>
<p>To build our binary using Nix we can simply run <code>nix run</code>, where we can see how this works in our <code>default.nix</code>
file. Particularly the part with <code>buildGoApplication</code> <sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-nix" data-lang="nix"><span class="line"><span class="cl"><span class="n">buildGoApplication</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">  <span class="n">pname</span> <span class="o">=</span> <span class="s2">&#34;myapp&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">version</span> <span class="o">=</span> <span class="s2">&#34;0.1&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">pwd</span> <span class="o">=</span> <span class="sr">./.</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">src</span> <span class="o">=</span> <span class="sr">./.</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">  <span class="n">modules</span> <span class="o">=</span> <span class="sr">./gomod2nix.toml</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>That&rsquo;s it! We set up a development shell using Nix flakes for our go project. Including adding pre-commits and how
we can build our Go binary using nix. Leveraging the <code>gomod2nix</code> tool.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://nixos.wiki/wiki/Flakes">https://nixos.wiki/wiki/Flakes</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p><a href="https://www.tweag.io/blog/2021-03-04-gomod2nix/">https://www.tweag.io/blog/2021-03-04-gomod2nix/</a>&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p><a href="https://github.com/nix-community/gomod2nix/blob/master/docs/nix-reference.md">https://github.com/nix-community/gomod2nix/blob/master/docs/nix-reference.md</a>&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
