<?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>Lua on TripleZ&#39;s Blog</title>
    <link>https://blog.triplez.cn/tags/lua/</link>
    <description>Recent content in Lua on TripleZ&#39;s Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <lastBuildDate>Fri, 18 Dec 2020 15:41:57 +0000</lastBuildDate><atom:link href="https://blog.triplez.cn/tags/lua/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>发布你第一个 Luarocks 包</title>
      <link>https://blog.triplez.cn/posts/publish-your-first-luarocks-package/</link>
      <pubDate>Fri, 18 Dec 2020 15:41:57 +0000</pubDate>
      
      <guid>https://blog.triplez.cn/posts/publish-your-first-luarocks-package/</guid>
      <description>&lt;p&gt;手把手教你如何发布一个 LuaRocks 包。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>手把手教你如何发布一个 LuaRocks 包。</p>
<h2 id="写一个-rockspec">写一个 rockspec</h2>
<p>首先写好你准备发布的包 <del>当然是自己写好了才要发布啦</del> ，然后我们在项目根目录下写一个 rockspec 文件（用来描述 LuaRocks 包的元信息文件）。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-0-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-1">1</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">luarocks write_rockspec &lt;package_name&gt; &lt;package_version&gt; &lt;package_location&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><p>比如，我希望发布的是 <code>busted_resty</code> 的 <code>0.5.0</code> 版本，那么我需要我的项目根目录上输入以下命令来创建我的 rockspec 文件。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-1-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-1">1</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ luarocks write_rockspec busted_resty 0.5.0 .
</span></span></code></pre></td></tr></table>
</div>
</div><p>然后，你会得到一个这样的 rockspec 文件：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-2-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-1"> 1</a>
</span><span class="lnt" id="hl-2-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-2"> 2</a>
</span><span class="lnt" id="hl-2-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-3"> 3</a>
</span><span class="lnt" id="hl-2-4"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-4"> 4</a>
</span><span class="lnt" id="hl-2-5"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-5"> 5</a>
</span><span class="lnt" id="hl-2-6"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-6"> 6</a>
</span><span class="lnt" id="hl-2-7"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-7"> 7</a>
</span><span class="lnt" id="hl-2-8"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-8"> 8</a>
</span><span class="lnt" id="hl-2-9"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-9"> 9</a>
</span><span class="lnt" id="hl-2-10"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-10">10</a>
</span><span class="lnt" id="hl-2-11"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-11">11</a>
</span><span class="lnt" id="hl-2-12"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-12">12</a>
</span><span class="lnt" id="hl-2-13"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-13">13</a>
</span><span class="lnt" id="hl-2-14"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-14">14</a>
</span><span class="lnt" id="hl-2-15"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-15">15</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-lua" data-lang="lua"><span class="line"><span class="cl"><span class="n">package</span> <span class="o">=</span> <span class="s2">&#34;package_name&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">version</span> <span class="o">=</span> <span class="s2">&#34;1.0-1&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">source</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">url</span> <span class="o">=</span> <span class="s2">&#34;*** please add URL for source tarball, zip or repository here ***&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="n">description</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">homepage</span> <span class="o">=</span> <span class="s2">&#34;*** please enter a project homepage ***&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">license</span> <span class="o">=</span> <span class="s2">&#34;*** please specify a license ***&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="n">dependencies</span> <span class="o">=</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">build</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">type</span> <span class="o">=</span> <span class="s2">&#34;builtin&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="n">modules</span> <span class="o">=</span> <span class="p">{}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>这里我们简单解释下其中的含义：</p>
<ul>
<li><code>package</code> ：包名称。</li>
<li><code>version</code> ：包版本，必须为 <code>&lt;数字&gt;.&lt;数字&gt;[.&lt;数字&gt;]-&lt;数字&gt;</code> 。</li>
<li><code>source</code> ：包的源代码位置，如 Git 地址等。</li>
<li><code>description</code> ：包的基本描述，以及版权协议等信息。</li>
<li><code>dependencies</code> ：与其他库的依赖关系。</li>
<li><code>build</code> ：构建具体信息，比如安装的库名。</li>
</ul>
<p>更多 rockspec 的<a href="https://github.com/luarocks/luarocks/wiki/Rockspec-format">具体细节</a>可以在 <a href="https://github.com/luarocks/luarocks/wiki">LuaRocks 的 Wiki</a> 中找到。</p>
<p>对于 <code>busted_resty</code> 的 <code>0.5.0</code> 版本（我已经事先在 Git 上打好了 <code>v0.5.0</code> 的 tag），它的 rockspec 是这样的：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-3-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-1"> 1</a>
</span><span class="lnt" id="hl-3-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-2"> 2</a>
</span><span class="lnt" id="hl-3-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-3"> 3</a>
</span><span class="lnt" id="hl-3-4"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-4"> 4</a>
</span><span class="lnt" id="hl-3-5"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-5"> 5</a>
</span><span class="lnt" id="hl-3-6"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-6"> 6</a>
</span><span class="lnt" id="hl-3-7"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-7"> 7</a>
</span><span class="lnt" id="hl-3-8"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-8"> 8</a>
</span><span class="lnt" id="hl-3-9"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-9"> 9</a>
</span><span class="lnt" id="hl-3-10"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-10">10</a>
</span><span class="lnt" id="hl-3-11"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-11">11</a>
</span><span class="lnt" id="hl-3-12"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-12">12</a>
</span><span class="lnt" id="hl-3-13"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-13">13</a>
</span><span class="lnt" id="hl-3-14"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-14">14</a>
</span><span class="lnt" id="hl-3-15"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-15">15</a>
</span><span class="lnt" id="hl-3-16"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-16">16</a>
</span><span class="lnt" id="hl-3-17"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-17">17</a>
</span><span class="lnt" id="hl-3-18"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-18">18</a>
</span><span class="lnt" id="hl-3-19"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-19">19</a>
</span><span class="lnt" id="hl-3-20"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-20">20</a>
</span><span class="lnt" id="hl-3-21"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-21">21</a>
</span><span class="lnt" id="hl-3-22"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-22">22</a>
</span><span class="lnt" id="hl-3-23"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-23">23</a>
</span><span class="lnt" id="hl-3-24"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-24">24</a>
</span><span class="lnt" id="hl-3-25"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-25">25</a>
</span><span class="lnt" id="hl-3-26"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-26">26</a>
</span><span class="lnt" id="hl-3-27"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-27">27</a>
</span><span class="lnt" id="hl-3-28"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-28">28</a>
</span><span class="lnt" id="hl-3-29"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-29">29</a>
</span><span class="lnt" id="hl-3-30"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-30">30</a>
</span><span class="lnt" id="hl-3-31"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-31">31</a>
</span><span class="lnt" id="hl-3-32"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-32">32</a>
</span><span class="lnt" id="hl-3-33"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-33">33</a>
</span><span class="lnt" id="hl-3-34"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-34">34</a>
</span><span class="lnt" id="hl-3-35"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-35">35</a>
</span><span class="lnt" id="hl-3-36"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-36">36</a>
</span><span class="lnt" id="hl-3-37"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-37">37</a>
</span><span class="lnt" id="hl-3-38"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-38">38</a>
</span><span class="lnt" id="hl-3-39"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-39">39</a>
</span><span class="lnt" id="hl-3-40"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-40">40</a>
</span><span class="lnt" id="hl-3-41"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-41">41</a>
</span><span class="lnt" id="hl-3-42"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-42">42</a>
</span><span class="lnt" id="hl-3-43"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-43">43</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-lua" data-lang="lua"><span class="line"><span class="cl"><span class="n">package</span> <span class="o">=</span> <span class="s2">&#34;busted_resty&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">version</span> <span class="o">=</span> <span class="s2">&#34;0.5.0-1&#34;</span>
</span></span><span class="line"><span class="cl"><span class="n">source</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">   <span class="n">url</span> <span class="o">=</span> <span class="s2">&#34;git://github.com/Triple-Z/busted_resty&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">   <span class="n">tag</span> <span class="o">=</span> <span class="s2">&#34;v0.5.0&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="n">description</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">   <span class="n">summary</span> <span class="o">=</span> <span class="s2">&#34;An extra mocking layer for OpenResty in busted testing environment.&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">   <span class="n">detailed</span> <span class="o">=</span> <span class="s">[[
</span></span></span><span class="line"><span class="cl"><span class="s">      This module mocks the following OpenResty APIs:
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s">      - ngx.status
</span></span></span><span class="line"><span class="cl"><span class="s">      - ngx.exit
</span></span></span><span class="line"><span class="cl"><span class="s">      - ngx.exec
</span></span></span><span class="line"><span class="cl"><span class="s">      - ngx.redirect
</span></span></span><span class="line"><span class="cl"><span class="s">      - ngx.send_headers
</span></span></span><span class="line"><span class="cl"><span class="s">      - ngx.headers_sent
</span></span></span><span class="line"><span class="cl"><span class="s">      - ngx.print
</span></span></span><span class="line"><span class="cl"><span class="s">      - ngx.say
</span></span></span><span class="line"><span class="cl"><span class="s">      - ngx.flush
</span></span></span><span class="line"><span class="cl"><span class="s">      - ngx.eof
</span></span></span><span class="line"><span class="cl"><span class="s">      - ngx.is_subrequest
</span></span></span><span class="line"><span class="cl"><span class="s">      - ngx.on_abort
</span></span></span><span class="line"><span class="cl"><span class="s">      - ngx.arg.*
</span></span></span><span class="line"><span class="cl"><span class="s">      - ngx.var.*
</span></span></span><span class="line"><span class="cl"><span class="s">      - ngx.header.*
</span></span></span><span class="line"><span class="cl"><span class="s">      - ngx.location.*
</span></span></span><span class="line"><span class="cl"><span class="s">      - ngx.req.*
</span></span></span><span class="line"><span class="cl"><span class="s">      - ngx.resp.*
</span></span></span><span class="line"><span class="cl"><span class="s">   ]]</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">   <span class="n">homepage</span> <span class="o">=</span> <span class="s2">&#34;https://github.com/Triple-Z/busted_resty&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">   <span class="n">license</span> <span class="o">=</span> <span class="s2">&#34;MIT&#34;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="n">dependencies</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">   <span class="s1">&#39;lua &gt;= 5.1&#39;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">   <span class="s1">&#39;luassert &gt;= 1.7.8&#39;</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">build</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">   <span class="n">type</span> <span class="o">=</span> <span class="s2">&#34;builtin&#34;</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">   <span class="n">modules</span> <span class="o">=</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">      <span class="n">busted_resty</span> <span class="o">=</span> <span class="s2">&#34;src/busted_resty.lua&#34;</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></td></tr></table>
</div>
</div><p>其中，<code>modules</code> 代表着文件的安装方式及位置。如在 <code>busted_resty</code> 中，安装方式为 <code>builtin</code> ，因此 LuaRocks 只是将这些指定的文件复制粘贴到某个指定的位置。比如，库中的 <code>src/busted_resty.lua</code> 就会被复制到 LuaRocks 中 Lua 库的根目录。</p>
<h2 id="检查-rockspec-语法">检查 rockspec 语法</h2>
<p>写好了 rockspec 后，我们可以来检查下 rockspec 的语法是否正确。当然，使用的是 <code>luarocks lint</code> 命令。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-4-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-1">1</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ luarocks lint busted_resty-0.5.0-1.rockspec
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果按下 <kbd>Enter</kbd> 后什么都没发生，恭喜你，没有消息就是好消息（毕竟是高深莫测的 UNIX 哲学 😄）。</p>
<p>如果有信息输出，那就按照错误提示改吧 🤣。</p>
<h2 id="make">MAKE!</h2>
<p>当我们编写好了 rockspec 后，就可以尝试构建属于我们自己的第一个 LuaRocks 包了！怎么构建呢，当然是用 LuaRocks 中的 <code>make</code> 命令啦！</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-5-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-5-1">1</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ luarocks make
</span></span></code></pre></td></tr></table>
</div>
</div><p>不出意外的话，你第一个 LuaRocks 包应该被 LuaRocks 安装到了指定的位置，快打开你最喜欢的 Lua 解释器，试一下吧！</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-6-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-1">1</a>
</span><span class="lnt" id="hl-6-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-2">2</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ luajit
</span></span><span class="line"><span class="cl">&gt; require <span class="s2">&#34;busted_resty&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>如果什么也没有发生，那可就太好了！说明我们的 LuaRocks 包已经被安装到了本地环境上了！</p>
<h2 id="打包并上传">打包并上传</h2>
<p>最后，那当然就是最激动人心的环节：将我们的包发布到 LuaRocks 上。</p>
<p>你可以先打包，验证包是否正确：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-7-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-7-1">1</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ luarocks pack &lt;rockspec_file&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><p>在我们的例子中，即为：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-8-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-8-1">1</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ luarocks pack busted_resty-0.5.0-1.rockspec
</span></span></code></pre></td></tr></table>
</div>
</div><p>执行完打包命令后，你会在目录下看到一个后缀为 <code>.src.rock</code> 的文件。没错，那就是我们的 LuaRocks 包。</p>
<p>接下来你有两种方式来将我们刚打出来的 LuaRocks 包上传至 LuaRocks 中心仓库，让我们分别介绍它们吧。</p>
<h3 id="直接在网站上上传-rock">直接在网站上上传 rock</h3>
<p>你可以直接在 <a href="https://luarocks.org/upload">LuaRocks 网站</a>上上传你的 rockspec 描述文件以及 src.rock 包。点击“提交”即可在 LuaRocks 上发布你的 rock 包～</p>
<h3 id="用命令行上传">用命令行上传</h3>
<p>使用 <code>luarocks upload</code> 即可帮你打包并直接上传至 LuaRocks 中心仓库：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-9-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-9-1">1</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ luarocks upload <span class="o">[</span>--api-key<span class="o">=</span>&lt;api-key&gt;<span class="o">]</span> &lt;rockspec_file&gt;
</span></span></code></pre></td></tr></table>
</div>
</div><p>别忘了 API Key 哦，在<a href="https://luarocks.org/settings/api-keys">这里</a>可以获取你自己的 API Key。</p>
<figure class="align-center ">
    <img loading="lazy" src="https://triplez-public-1251926021.cos.ap-shanghai.myqcloud.com/picgoimage-20201218233542394.png#center"
         alt="busted_resty on luarocks.org"/> <figcaption>
            busted_resty on luarocks.org
        </figcaption>
</figure>

<p>🎉恭喜你，成功上传了自己的第一个 LuaRocks 包！</p>]]></content:encoded>
    </item>
    
    <item>
      <title>macOS 上安装 Lua 及 Luarocks</title>
      <link>https://blog.triplez.cn/posts/install-lua-and-luarocks-in-macos/</link>
      <pubDate>Sun, 13 Dec 2020 15:38:20 +0000</pubDate>
      
      <guid>https://blog.triplez.cn/posts/install-lua-and-luarocks-in-macos/</guid>
      <description>&lt;p&gt;在 macOS 上安装多版本 Lua 及 Luarocks。&lt;/p&gt;</description>
      <content:encoded><![CDATA[<p>在 macOS 上安装多版本 Lua 及 Luarocks。</p>
<h2 id="homebrew">Homebrew</h2>
<p>Lua、LuaJIT 和 Luarocks 都可以直接通过 <code>brew</code> 包管理直接安装，而且可以处理不同版本的 Luarocks，使用的仓库为 <a href="https://github.com/mesca/homebrew-luarocks">mesca/homebrew-luarocks</a> 。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-0-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-0-1">1</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">$ brew tap mesca/luarocks
</span></span></code></pre></td></tr></table>
</div>
</div><blockquote>
<p>Lua 5.1, 5.3 都需要在 Homebrew 中添加 <code>mesca/luarocks</code> 仓库。</p>
</blockquote>
<h3 id="lua-51">Lua 5.1</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-1-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-1">1</a>
</span><span class="lnt" id="hl-1-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-2">2</a>
</span><span class="lnt" id="hl-1-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-1-3">3</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Lua 5.1</span>
</span></span><span class="line"><span class="cl">$ brew install lua51
</span></span><span class="line"><span class="cl">$ brew install luarocks51
</span></span></code></pre></td></tr></table>
</div>
</div><p>使用方式：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-2-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-1">1</a>
</span><span class="lnt" id="hl-2-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-2">2</a>
</span><span class="lnt" id="hl-2-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-3">3</a>
</span><span class="lnt" id="hl-2-4"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-2-4">4</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 进入 Lua 5.1 REPL</span>
</span></span><span class="line"><span class="cl">$ lua5.1
</span></span><span class="line"><span class="cl"><span class="c1"># 使用 Lua 5.1 的 Luarocks</span>
</span></span><span class="line"><span class="cl">$ luarocks-5.1 --version
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="luajit">LuaJIT</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-3-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-1">1</a>
</span><span class="lnt" id="hl-3-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-2">2</a>
</span><span class="lnt" id="hl-3-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-3-3">3</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># LuaJIT</span>
</span></span><span class="line"><span class="cl">$ brew install luajit
</span></span><span class="line"><span class="cl">$ brew install luarocks51 --with-luajit
</span></span></code></pre></td></tr></table>
</div>
</div><p>使用方式：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-4-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-1">1</a>
</span><span class="lnt" id="hl-4-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-2">2</a>
</span><span class="lnt" id="hl-4-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-3">3</a>
</span><span class="lnt" id="hl-4-4"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-4-4">4</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 进入 LuaJIT REPL</span>
</span></span><span class="line"><span class="cl">$ luajit
</span></span><span class="line"><span class="cl"><span class="c1"># LuaJIT 与 Lua 5.1 共用 Luarocks</span>
</span></span><span class="line"><span class="cl">$ luarocks-5.1 --version
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="lua-53">Lua 5.3</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-5-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-5-1">1</a>
</span><span class="lnt" id="hl-5-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-5-2">2</a>
</span><span class="lnt" id="hl-5-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-5-3">3</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Lua 5.3</span>
</span></span><span class="line"><span class="cl">$ brew install lua53
</span></span><span class="line"><span class="cl">$ brew install luarocks53
</span></span></code></pre></td></tr></table>
</div>
</div><p>使用方式：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-6-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-1">1</a>
</span><span class="lnt" id="hl-6-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-2">2</a>
</span><span class="lnt" id="hl-6-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-3">3</a>
</span><span class="lnt" id="hl-6-4"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-6-4">4</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 进入 Lua 5.3 REPL</span>
</span></span><span class="line"><span class="cl">$ lua5.3
</span></span><span class="line"><span class="cl"><span class="c1"># 使用 Lua 5.3 的 Luarocks</span>
</span></span><span class="line"><span class="cl">$ luarocks-5.3 --version
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="lua-54-current">Lua 5.4 (Current)</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-7-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-7-1">1</a>
</span><span class="lnt" id="hl-7-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-7-2">2</a>
</span><span class="lnt" id="hl-7-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-7-3">3</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Current: 5.4</span>
</span></span><span class="line"><span class="cl">$ brew install lua
</span></span><span class="line"><span class="cl">$ brew install luarocks
</span></span></code></pre></td></tr></table>
</div>
</div><p>使用方式：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt" id="hl-8-1"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-8-1">1</a>
</span><span class="lnt" id="hl-8-2"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-8-2">2</a>
</span><span class="lnt" id="hl-8-3"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-8-3">3</a>
</span><span class="lnt" id="hl-8-4"><a style="outline: none; text-decoration:none; color:inherit" href="#hl-8-4">4</a>
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># 进入 Lua 5.4 REPL</span>
</span></span><span class="line"><span class="cl">$ lua
</span></span><span class="line"><span class="cl"><span class="c1"># 使用 Lua 5.4 的 Luarocks</span>
</span></span><span class="line"><span class="cl">$ luarocks --version
</span></span></code></pre></td></tr></table>
</div>
</div><h2 id="build-from-source">Build from Source</h2>
<p>请参照 <a href="https://github.com/luarocks/luarocks/wiki/Installation-instructions-for-Unix">Luarocks 官方安装指南</a> 。或者 <a href="https://openresty.org/en/using-luarocks.html">OpenResty 文档中关于 Luarocks 的内容</a> 。</p>]]></content:encoded>
    </item>
    
  </channel>
</rss>
