<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Rushjs on Mirumo's Blog</title><link>https://blog.mirumo.net/tags/rushjs/</link><description>Recent content in Rushjs on Mirumo's Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-tw</language><lastBuildDate>Thu, 08 Oct 2026 21:30:11 +0800</lastBuildDate><atom:link href="https://blog.mirumo.net/tags/rushjs/index.xml" rel="self" type="application/rss+xml"/><item><title>Rush Worktree 共用依賴與快取</title><link>https://blog.mirumo.net/post/rushjs-with-worktree/</link><pubDate>Thu, 08 Oct 2026 21:30:11 +0800</pubDate><guid>https://blog.mirumo.net/post/rushjs-with-worktree/</guid><description>&lt;img src="https://blog.mirumo.net/post/rushjs-with-worktree/cover.webp" alt="Featured image of post Rush Worktree 共用依賴與快取" /&gt;&lt;p&gt;最近到了新的公司，關於心情的部分，有機會再寫個心得文（看我這發文頻率，應該知道要幾百年後了），總結一下入職一個禮拜的一句話「有種被當人的感覺了」。&lt;/p&gt;&#10;&lt;p&gt;在公司的的專案用的是 rushjs 的 monorepo，rushjs 是微軟開發的 monorepo 工具，在這個這麼大的 monorepo 裡面，用到 worktree 的機會又更多了。&lt;/p&gt;&#10;&lt;h2 id="rush-的資料不是共用的"&gt;rush 的資料不是共用的？&#10;&lt;/h2&gt;&lt;p&gt;Rush.js 是一套用來管理 JavaScript / TypeScript Monorepo 的工具鏈，由 Microsoft 維護，屬於 Rush Stack 生態系。其中一個特點就是，Rush 會使用 link 來建立 node_modules，這個操作類似於 pnpm 的依賴安裝方式，如果熟悉 pnpm 的朋友就知道，pnpm 的依賴其實是放在家目錄（~/.pnpm-store），因此在多個專案當中，同個依賴會安裝在家目錄當中，各個專案當中的 &lt;code&gt;node_modules&lt;/code&gt; 會用 link 的方式連過去。&lt;/p&gt;&#10;&lt;p&gt;而在 rush 當中，也做了這件事情，只不過他預設是安裝在 &lt;code&gt;&amp;lt;project&amp;gt;/common/temp/&amp;lt;...&amp;gt;&lt;/code&gt; 當中，也就是說，如果我有多個 rushjs 的專案，這些依賴是不會共用的，想當然的如果我開了多個 worktree，rush 會在每個 worktree 當中都安裝一份依賴。&lt;/p&gt;&#10;&lt;p&gt;除了依賴以外，rush 在建置這些 package 的時候，會保存建置的快取，而這些快取會在下次建置時被使用，這些快取資料預設也是存在 &lt;code&gt;&amp;lt;project&amp;gt;/common/temp/build-cache&lt;/code&gt; 當中，也是在 worktree 之間不會被共用。&lt;/p&gt;&#10;&lt;h2 id="修改-rush-依賴的儲存路徑"&gt;修改 rush 依賴的儲存路徑&#10;&lt;/h2&gt;&lt;p&gt;如果使用 &lt;code&gt;pnpm&lt;/code&gt; 我們可以很輕易的透過設定環境變數(&lt;a class="link" href="https://rushjs.io/pages/configs/environment_vars/#rush_pnpm_store_path" target="_blank" rel="noopener"&#10; &gt;ref&lt;/a&gt;)來改變儲存路徑&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ &lt;span class="nv"&gt;RUSH_PNPM_STORE_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/.rush/.pnpm-store rush install&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;也可以加到 &lt;code&gt;.bashrc&lt;/code&gt; 或是 &lt;code&gt;.zshrc&lt;/code&gt; 裡：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-Bash" data-lang="Bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;RUSH_HOME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;~/.rush&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;RUSH_PNPM_STORE_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$RUSH_HOME&lt;/span&gt;&lt;span class="s2"&gt;/.pnpm-store&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;h2 id="修改-build-cache-的儲存路徑"&gt;修改 build cache 的儲存路徑&#10;&lt;/h2&gt;&lt;p&gt;在文件當中，有這麼一段話(&lt;a class="link" href="https://rushjs.io/pages/maintainer/build_cache/#docusaurus_skipToContent_fallback" target="_blank" rel="noopener"&#10; &gt;ref&lt;/a&gt;)&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;In a cache folder on your local disk.&lt;/strong&gt; This way you can switch between different branches without losing your incremental build state. &lt;mark&gt;You can even configure a centralized folder to be shared between multiple enlistments on your machine.&lt;/mark&gt; The default location is &lt;strong&gt;common/temp/build-cache&lt;/strong&gt;.&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;但翻了一整個早上的文件，我還是找不到哪裡可以修改這個路徑。索性直接暴力翻源碼。&lt;/p&gt;&#10;&lt;details&gt;&#10; &lt;summary&gt;Code Stack&lt;/summary&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://github.com/microsoft/rushstack/blob/e2341a3fcacd6a25263e4c35ccd7c9fdda676e3b/libraries/rush-lib/src/schemas/rush-user-settings.schema.json#L13" target="_blank" rel="noopener"&#10; &gt;https://github.com/microsoft/rushstack/blob/e2341a3fcacd6a25263e4c35ccd7c9fdda676e3b/libraries/rush-lib/src/schemas/rush-user-settings.schema.json#L13&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://github.com/microsoft/rushstack/blob/e2341a3fcacd6a25263e4c35ccd7c9fdda676e3b/libraries/rush-lib/src/api/RushUserConfiguration.ts#L52" target="_blank" rel="noopener"&#10; &gt;https://github.com/microsoft/rushstack/blob/e2341a3fcacd6a25263e4c35ccd7c9fdda676e3b/libraries/rush-lib/src/api/RushUserConfiguration.ts#L52&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://github.com/microsoft/rushstack/blob/e2341a3fcacd6a25263e4c35ccd7c9fdda676e3b/libraries/rush-lib/src/api/RushUserConfiguration.ts#L35" target="_blank" rel="noopener"&#10; &gt;https://github.com/microsoft/rushstack/blob/e2341a3fcacd6a25263e4c35ccd7c9fdda676e3b/libraries/rush-lib/src/api/RushUserConfiguration.ts#L35&lt;/a&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;a class="link" href="https://github.com/microsoft/rushstack/blob/e2341a3fcacd6a25263e4c35ccd7c9fdda676e3b/libraries/rush-lib/src/logic/RushConstants.ts#L9" target="_blank" rel="noopener"&#10; &gt;https://github.com/microsoft/rushstack/blob/e2341a3fcacd6a25263e4c35ccd7c9fdda676e3b/libraries/rush-lib/src/logic/RushConstants.ts#L9&lt;/a&gt;&lt;/p&gt;&#10;&lt;/details&gt;&#10;&lt;p&gt;最後我們可以在家目錄當中建立 &lt;code&gt;.rush-user&lt;/code&gt; 並且在裡面加入 &lt;code&gt;settings.json&lt;/code&gt;:&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-JSON" data-lang="JSON"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;buildCacheFolder&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;~/.rush/build-cache&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;這樣設定完之後，所有的 worktree 就可以共用快取啦！！&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h4&gt;參考資料&lt;/h4&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://github.com/microsoft/rushstack" target="_blank" rel="noopener"&#10; &gt;rushstack github&lt;/a&gt;&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://rushjs.io" target="_blank" rel="noopener"&#10; &gt;rush docs&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item></channel></rss>