<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss/feed.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>RyogiMutsuki 的小窝</title><description>或许 七月初七 淮水竹亭 只是能是一场泡影</description><link>https://www.20260712.xyz</link><item><title>C# 开发笔记：初识源生成器</title><link>https://www.20260712.xyz/post/note/backend/roslyn-source-generation-1</link><guid isPermaLink="false">note/backend/roslyn-source-generation-1</guid><description>元编程是什么
什么是元编程？好吃吗？
元编程（Meta-Programming），是一种强大的技术。与传统编程不同的是，元编程是将代码视作数据，并允许代码进行处理、修改、生成等一系列操作。
为什么需要这些？
元编程最大的好处就是可以将一些重复性高的工作（例如 DTO</description><pubDate>Tue, 30 Jun 2026 04:50:42 GMT</pubDate><content:encoded>&lt;h2&gt;元编程是什么&lt;a href=&quot;#元编程是什么&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;什么是元编程？好吃吗？&lt;/p&gt;
&lt;p&gt;元编程（Meta-Programming），是一种强大的技术。与传统编程不同的是，元编程是将代码视作数据，并允许代码进行处理、修改、生成等一系列操作。&lt;/p&gt;
&lt;h2&gt;为什么需要这些？&lt;a href=&quot;#为什么需要这些&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;元编程最大的好处就是可以将一些重复性高的工作（例如 DTO 声明，属性映射，MVVM）交由机器执行，从而将人解放出来专注于实现机器不能处理的业务逻辑。&lt;/p&gt;
&lt;p&gt;一个经典的例子就是 Spring Boot，其大量利用注解和反射对代码进行修改并创造了面向注解编程&lt;/p&gt;
&lt;h2&gt;.NET Roslyn Source Generator&lt;a href=&quot;#net-roslyn-source-generator&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;虽然 Spring Boot 面向注解编程非常高级好用，但是 Spring Boot 也有自己的缺点，因为其元编程是建立在反射上扫描注解和代码生成的。&lt;/p&gt;
&lt;p&gt;而众所周知反射是有开销的，所以大量类扫描的开销可想而知。 这也就是为什么通常只有公司用这个，因为人家的服务器是一天 24 小时运转的。&lt;/p&gt;
&lt;p&gt;既然反射有开销，那有什么办法解决呢？&lt;/p&gt;
&lt;p&gt;当然有，既然反射有运行时开销，那么我们可以丢到编译期完成。 反正编译本身就比较吃 CPU 和时间，把 Source Generator 丢到编译期跑也不会死。&lt;/p&gt;
&lt;h2&gt;什么是 Source Generator？&lt;a href=&quot;#什么是-source-generator&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;要了解这个，我们需要先知道 C# 的编译器，也就是 Roslyn。&lt;/p&gt;
&lt;p&gt;因为 Roslyn 设计之初采用了编译器即服务的设计理念，这也允许开发者调用 Roslyn 的 API 来对代码进行处理。&lt;/p&gt;
&lt;p&gt;Source Generator 就是运行在 Roslyn 的一组分析程序，它将人类不可读的代码作为输入，以便你可以进行分析并根据预设规则进行处理，并产生输出。&lt;/p&gt;
&lt;p&gt;并且你也确确实实可以用源生成器来分析代码，并根据预设规则创建警告和错误，这些内容也会被投射到 IDE 上。&lt;/p&gt;
&lt;h2&gt;快速上手&lt;a href=&quot;#快速上手&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;首先，我们需要新建一个控制台应用程序，然后在 Program.cs 写下以下内容。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt; ConsoleApp&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; partial&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt; Program&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;&lt;/div&gt;
&lt;p&gt;使用源生成的类/方法必须标记为 partial，否则会因为重复声明而报错
::&lt;/p&gt;
&lt;p&gt;然后，我们需要再建一个类库项目，目标框架设置为 netstandard2.0。&lt;/p&gt;
&lt;p&gt;使用以下命令添加必须的依赖。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;dotnet&lt;/span&gt;&lt;span&gt; add&lt;/span&gt;&lt;span&gt; package&lt;/span&gt;&lt;span&gt; Microsoft.CodeAnalysis.CSharp&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;dotnet&lt;/span&gt;&lt;span&gt; add&lt;/span&gt;&lt;span&gt; package&lt;/span&gt;&lt;span&gt; Microsoft.CodeAnalysis.Analyzers&lt;/span&gt;&lt;span&gt; # 这个是可选的，也就是装不装无所谓。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后在 ProgramMainSourceGenerator.cs 写下以下内容。&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt; System&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;Text&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;using&lt;/span&gt;&lt;span&gt; Microsoft&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;CodeAnalysis&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt; SourceGenerators&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Generator&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt; ProgramMainSourceGenerator&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;IIncrementalGenerator&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    public&lt;/span&gt;&lt;span&gt; void&lt;/span&gt;&lt;span&gt; Initialize&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;IncrementalGeneratorInitializationContext&lt;/span&gt;&lt;span&gt; context&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        var&lt;/span&gt;&lt;span&gt; sb&lt;/span&gt;&lt;span&gt; =&lt;/span&gt;&lt;span&gt; new&lt;/span&gt;&lt;span&gt; StringBuilder&lt;/span&gt;&lt;span&gt;();&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        sb.&lt;/span&gt;&lt;span&gt;AppendLine&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;namespace ConsoleApp;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        sb.&lt;/span&gt;&lt;span&gt;AppendLine&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        sb.&lt;/span&gt;&lt;span&gt;AppendLine&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;public partial class Program{&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        sb.&lt;/span&gt;&lt;span&gt;AppendLine&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;    &quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        sb.&lt;/span&gt;&lt;span&gt;AppendLine&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;    public static void Main(string[] args) =&amp;gt; System.Console.WriteLine(&lt;/span&gt;&lt;span&gt;\&quot;&lt;/span&gt;&lt;span&gt;Hello Tsukishiro Mei!&lt;/span&gt;&lt;span&gt;\&quot;&lt;/span&gt;&lt;span&gt;);&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        sb.&lt;/span&gt;&lt;span&gt;AppendLine&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;}&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        context.&lt;/span&gt;&lt;span&gt;RegisterPostInitializationOutput&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;sourceGeneratorContext&lt;/span&gt;&lt;span&gt; =&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;            sourceGeneratorContext.&lt;/span&gt;&lt;span&gt;AddSource&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Program.g.cs&quot;&lt;/span&gt;&lt;span&gt;, sb.&lt;/span&gt;&lt;span&gt;ToString&lt;/span&gt;&lt;span&gt;());&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;        });&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;最后在需要生成代码的 csproj 写下以下内容&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;ItemGroup&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &amp;lt;&lt;/span&gt;&lt;span&gt;ProjectReference&lt;/span&gt;&lt;span&gt; Include&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;..\SourceGenerators\SourceGenerators.csproj&quot;&lt;/span&gt;&lt;span&gt; OutputItemType&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;Analyzer&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;                    ReferenceOutputAssembly&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;false&quot;&lt;/span&gt;&lt;span&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;ItemGroup&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后，我们在终端 cd 到控制台项目，运行 dotnet run。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;PS&lt;/span&gt;&lt;span&gt; D:&lt;/span&gt;&lt;span&gt;\T&lt;/span&gt;&lt;span&gt;sukishiroMei&lt;/span&gt;&lt;span&gt;\P&lt;/span&gt;&lt;span&gt;rojects&lt;/span&gt;&lt;span&gt;\R&lt;/span&gt;&lt;span&gt;oslynExample&lt;/span&gt;&lt;span&gt;\C&lt;/span&gt;&lt;span&gt;onsoleAp&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; dotnet&lt;/span&gt;&lt;span&gt; run&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;D:\TsukishiroMei\Projects\RoslynExample\SourceGenerators\ProgramMainSourceGenerator.cs(7,14&lt;/span&gt;&lt;span&gt;): warning RS1036: “SourceGenerators.ProgramMainSourceGenerator”: 包含分析器或源生成器的项目应指定属性“&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;EnforceExtendedAnalyzerRules&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;/EnforceExtendedAnalyzerRules&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;”&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;Hello&lt;/span&gt;&lt;span&gt; Tsukishiro&lt;/span&gt;&lt;span&gt; Mei!&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;是的很神奇，你的项目不仅没有编译失败，还多了一行输出。&lt;/p&gt;
&lt;h2&gt;发生了什么？&lt;a href=&quot;#发生了什么&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在此项目中，我们添加了一个源生成器，并让这个源生成器生成了一个静态的 Main 方法，接受 string[]。&lt;/p&gt;
&lt;p&gt;现在，我们在引用 Source Generator 的项目 csproj PropertyGroup 添加 &lt;code&gt;&amp;lt;EmitCompilerGeneratedFiles&amp;gt;true&amp;lt;/EmitCompilerGeneratedFiles&amp;gt;&lt;/code&gt;，然后转到 obj/bin/构建配置/目标框架/generated/SourceGenerators/SourceGenerators.ProgramMainSourceGenerator 下查看生成的 Program.g.cs&lt;/p&gt;
&lt;p&gt;你就会看到 Source Generator 为你生成了一个 partial class Program，里面包含了一个 Main 方法。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;namespace&lt;/span&gt;&lt;span&gt; ConsoleApp&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;public&lt;/span&gt;&lt;span&gt; partial&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span&gt; Program&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    public&lt;/span&gt;&lt;span&gt; static&lt;/span&gt;&lt;span&gt; void&lt;/span&gt;&lt;span&gt; Main&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;[] &lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span&gt;=&amp;gt;&lt;/span&gt;&lt;span&gt; System.Console.&lt;/span&gt;&lt;span&gt;WriteLine&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&quot;Hello Tsukishiro Mei!&quot;&lt;/span&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;回看我们之前写的 Source Generator，你会发现 Source Generator 输出的正是我们在 StringBuilder 写的东西。&lt;/p&gt;
&lt;p&gt;这里我们用的是比较基础的 RegisterPostInitializationOutput，它假定生成的代码和你写的代码没有关系，所以也就不需要碰一些相对复杂的任务。&lt;/p&gt;
&lt;h2&gt;小结&lt;a href=&quot;#小结&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本章我们了解了源生成器的基本概念，现在你可以去写源生成器了&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;如果你用的是 Rider，也可以在依赖项 -&amp;gt; 源生成器上看到 Source Generator 上看生成输出，不过我写这篇文章的时候用的是 VSCode。&lt;/p&gt;
&lt;/div&gt;</content:encoded><category>category:后端笔记</category><category>tag:后端笔记</category><category>tag:源生成器</category><category>tag:元编程</category></item><item><title>Getting Started</title><link>https://www.20260712.xyz/post/translate/pytauri/getting-started</link><guid isPermaLink="false">translate/pytauri/getting-started</guid><description>[PyTauri 文档] 快速开始</description><pubDate>Fri, 13 Feb 2026 17:47:47 GMT</pubDate><content:encoded>&lt;p&gt;原文连接：&lt;/p&gt;
&lt;div&gt;
  &lt;a href=&quot;https://pytauri.github.io/pytauri/latest/usage/tutorial/getting-started/&quot; target=&quot;_blank&quot;&gt;
    &lt;div&gt;
      &lt;div&gt;
        &lt;div&gt;
          &lt;img src=&quot;https://pytauri.github.io/pytauri/latest/assets/favicon.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
          &lt;span&gt;pytauri.github.io&lt;/span&gt;
        &lt;/div&gt;
        &lt;h3&gt;Getting Started - PyTauri&lt;/h3&gt;
        
        &lt;div&gt;
          &lt;span&gt;https://pytauri.github.io/pytauri/latest/usage/tutorial/getting-started/&lt;/span&gt;
           
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div&gt;&lt;img src=&quot;https://avatars.githubusercontent.com/u/126865849?v=4&amp;amp;size=72&quot; alt=&quot;Getting Started - PyTauri&quot; loading=&quot;lazy&quot; /&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;如果你想要和 PyTauri 的维护者及用户交流，请考虑加入 PyTauri 的 &lt;a href=&quot;https://discord.gg/TaXhVp7Shw&quot;&gt;Discord 服务器&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;我们非常希望了解你的入门体验，这样我们就可以尽可能的让每个人都能轻松使用 PyTauri。&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;创建 PyTauri App&lt;a href=&quot;#创建-pytauri-app&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;
&lt;p&gt;自 0.6 版本起，推荐使用 &lt;code&gt;create-pytauri-app&lt;/code&gt; 创建一个新的 PyTauri 项目，即使项目仍在开发中。请参考 &lt;a href=&quot;https://pytauri.github.io/pytauri/latest/usage/tutorial/getting-started/&quot;&gt;uv&lt;/a&gt; 和 &lt;a href=&quot;https://copier.readthedocs.io/en/stable/generating/&quot;&gt;copier&lt;/a&gt; 的文档，运行如下命令。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;uvx&lt;/span&gt;&lt;span&gt; copier&lt;/span&gt;&lt;span&gt; copy&lt;/span&gt;&lt;span&gt; https://github.com/pytauri/create-pytauri-app&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这将以交互式问答的形式初始化项目。&lt;/p&gt;
&lt;p&gt;不过，我们仍然建议你阅读整个教程章节，因为它将有助于你理解 PyTauri 的所有细节。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;在开始教程之前，我们建议安装以下工具，这些工具被认为是初始化 PyTauri 项目的最佳实践。&lt;/p&gt;
&lt;p&gt;在后续教程中，我们将全程使用这些工具。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/tauri-apps/create-tauri-app&quot;&gt;create-tauri-app&lt;/a&gt;: v4.5.9&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/astral-sh/uv&quot;&gt;uv&lt;/a&gt;: v0.5.11&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.npmjs.com/package/@tauri-apps/cli&quot;&gt;tauri-cli&lt;/a&gt; &lt;div&gt;&lt;/div&gt;.1.0&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt;
&lt;p&gt;以上指定的版本是编写本教程时使用的版本。你也可以使用其他版本，但用法可能会和本教程的示例不同。&lt;/p&gt;
&lt;/div&gt;
&lt;h2&gt;完整示例&lt;a href=&quot;#完整示例&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div&gt;
  &lt;a href=&quot;https://github.com/pytauri/pytauri/tree/main/examples/tauri-app&quot; target=&quot;_blank&quot;&gt;
    &lt;div&gt;
      &lt;div&gt;
        &lt;div&gt;
          &lt;img src=&quot;https://github.com/fluidicon.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
          &lt;span&gt;github.com&lt;/span&gt;
        &lt;/div&gt;
        &lt;h3&gt;pytauri/examples/tauri-app at main · pytauri/pytauri&lt;/h3&gt;
        &lt;p&gt;Tauri binding for Python through Pyo3. Contribute to pytauri/pytauri development by creating an account on GitHub.&lt;/p&gt;
        &lt;div&gt;
          &lt;span&gt;https://github.com/pytauri/pytauri/tree/main/examples/tauri-app&lt;/span&gt;
           
        &lt;/div&gt;
      &lt;/div&gt;
      &lt;div&gt;&lt;img src=&quot;https://opengraph.githubassets.com/2154fe392e67a5eff36a8cc85d0921fdb5ee3b4bd60ba724b3e89cf531b813ec/pytauri/pytauri&quot; alt=&quot;pytauri/examples/tauri-app at main · pytauri/pytauri&quot; loading=&quot;lazy&quot; /&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;
&lt;h2&gt;创建一个 Tauri 项目&lt;a href=&quot;#创建一个-tauri-项目&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;参考：&lt;a href=&quot;https://tauri.app/start/create-project/#using-create-tauri-app&quot;&gt;https://tauri.app/start/create-project/#using-create-tauri-app&lt;/a&gt;&lt;/p&gt;
&lt;div&gt;
&lt;p&gt;在这个教程中，我们将会使用 pnpm 管理前端。&lt;/p&gt;
&lt;p&gt;但是，PyTauri 并不限制你使用的前端框架，你甚至可以使用 URL 让服务器提供前端资源。&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;pnpm create tauri-app&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;? Project name (tauri-app) ›&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;? Identifier (com.tauri-app.app) ›&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;? Choose which language to use for your frontend ›&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ❯ TypeScript / JavaScript  (pnpm, yarn, npm, deno, bun)&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;? Choose your package manager ›&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ❯ pnpm&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;? Choose your UI template ›&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ❯ Vanilla&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;? Choose your UI flavor ›&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ❯ TypeScript&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;你将会看到如下目录结构。&lt;/p&gt;
&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;└── tauri-app&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ├── README.md&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ├── index.html&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ├── package.json&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ├── src&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    │   ├── assets&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    │   ├── main.ts&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    │   └── styles.css&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ├── src-tauri&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    │   ├── Cargo.toml&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    │   ├── build.rs&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    │   ├── capabilities&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    │   ├── icons&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    │   ├── src&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    │   └── tauri.conf.json&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    ├── tsconfig.json&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;    └── vite.config.ts&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;/tauri-app: 前端。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;/tauri-app/src-tauri: Rust 和 Python 后端。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;启动 Tauri App&lt;a href=&quot;#启动-tauri-app&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; tauri-app&lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; install&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span&gt;&lt;span&gt;pnpm&lt;/span&gt;&lt;span&gt; tauri&lt;/span&gt;&lt;span&gt; dev&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;div&gt;
&lt;p&gt;首次运行将花费一些时间用来编译依赖，后续启动时会比这快得多。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;祝贺你，当你看到一个带有网页内容的窗口出现时，就说明你成功的创建了一个 Tauri 应用程序。&lt;/p&gt;
&lt;h2&gt;下一步&lt;a href=&quot;#下一步&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;下一个章节，我们将演示如何使用 PyTauri 将 Python 集成到 Tauri 应用程序。&lt;/p&gt;</content:encoded><category>category:翻译</category><category>tag:web</category><category>tag:tauri</category><category>tag:pytauri</category><category>tag:docs</category><category>tag:translate</category></item></channel></rss>