近期将我的游戏存档管理器迁移到Tauri2出现点问题,想起来以前V1的时候也遇到过这个问题,故记录下来。
具体问题就是在前端一个可拖拽组件没有办法被拖动,处理方式很简单,直接修改src-tauri/tauri.conf.json
文件,将dragDropEnabled
设为false
,作为参考,请看:
1 | { |
近期将我的游戏存档管理器迁移到Tauri2出现点问题,想起来以前V1的时候也遇到过这个问题,故记录下来。
具体问题就是在前端一个可拖拽组件没有办法被拖动,处理方式很简单,直接修改src-tauri/tauri.conf.json
文件,将dragDropEnabled
设为false
,作为参考,请看:
1 | { |
近日在制作Avalonia程序过程中,发现调试时很正常,发布后却无法运行,感觉很奇怪,我的发布配置有以下两条:
1 | <PublishTrimmed>True</PublishTrimmed> |
第一条启用了裁剪,第二条启用了AOT编译(但是在开发时没开启,因为预览窗口不支持AOT)
经过一番排查,发现这两个都有问题:
ViewLocator.cs
使用了反射来创建对象原代码使用反射创建对象:
1 | public Control? Build(object? param) |
修改后使用工厂方法:
1 | public Control? Build(object? param) |
这样就可以消除反射了
发布时我注意到很多这样的剪裁警告
1 | 2>Assembly 'Serilog' produced trim warnings. For more information see https://aka.ms/dotnet-illink/libraries |
因此我修改项目的sln文件,增加以下片段,通过外部的xml文件来限制剪裁
1 | <ItemGroup> |
下面是TrimmerRoots.xml
的内容
1 |
|
我将所有报警告的项目都加入了进去,虽然后面的编译依旧有新的警告,但是程序可以正常运行了。至此,所有问题解决。
近期我在使用Avalonia编写桌面程序时,用到了ItemRepeater组件,写出来大概是这样
1 | <UserControl xmlns="https://github.com/avaloniaui" |
其中<TextBlock Text="{Binding Name}"/>
和Text="{Binding Id}"/>
产生了报错AVLN2000 Unable to resolve property or method of name 'Id' on type 'XamlX.TypeSystem.XamlPseudoType'.
,查看类型ExploreViewModel
,定义大概如下
1 | public class ExploreViewModel : ViewModelBase |
造成该问题的原因是我需要使用的属性B是一个原始的数组,这里应该使用ObservableCollection
因此解决方案是做出如下修改
1 | public class ExploreViewModel : ViewModelBase |
至此能够成功编译运行
这几天发现电脑上的Scoop莫名其妙消失了,我觉得可能是UniGetUI的问题,总之我的Scoop被卸载了,使用Scoop安装的软件的环境变量也失效了,这导致我写代码的相关环境无法使用。
在重新安装Scoop后,环境变量没有恢复,而我发现路径C:\Users\用户名\scoop
没有丢失,那么说明软件文件和持久化数据应该没有丢失,寻找一些资料后,我在一篇Github Issue中找到了解决办法,如果你遇到了相同的问题,可以尝试按照以下步骤解决:
1 | cd C:\Users\用户名\scoop\apps |
我在重新安装Scoop并且进行了该操作后,成功恢复了大多数软件对应的环境,除了一些我已经打开的一些软件没有恢复,不过后面也可以手动scoop reset 软件名
来单独进行恢复
最近使用 Nuxt.js 的 Content 模块时,发现其支持项目中写好的 Vue 组件,相关文档可以参考 这里
我在页面中尝试添加如下组件,该组件位于~/components/XXX/VideoArea.vue
1 | <script setup lang="ts"> |
对应 Content
1 | --- |
发现启动后报错 If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.
,后来发现可能是没有设定全局组件,文档中有提到:
Components that are used in Markdown has to be marked as global in your Nuxt app if you don’t use the components/content/ directory, visit Nuxt 3 docs to learn more about it.
如果在Nuxt应用中使用的组件未放置在components/content/目录下,则需将其标记为全局组件。
对比一下,我的组件在~/components/XXX/
下,而不是在~/components/content/
下,因此无法访问到该组件。
~/components/content/
目录下假设你的组件仅用于内容页面,可以将其移动到~/components/content/
目录下,这样 Nuxt Content 模块会自动识别并加载这些组件。
VideoArea.global.vue
参考官方文档,我们修改文件后缀名也可以达到全局化的效果
在nuxt.config.ts
中,我们需要增加组件选项,设为全局即可
1 | export default defineNuxtConfig({ |
最近在尝试在 Windows11 下编译 Linux 可用的程序时遇到了不少问题,我这里总结一个简单的编译方法供大家参考(不过现在都有WSL了,是不是直接在上面编译更好?)
rustup target add x86_64-unknown-linux-musl
使用 musl 进行静态连接工具链
你可以使用rustup target list
指令来检查自己是否装好了工具链
在 ~/.cargo/config.toml (如果没有请自己创建) 内加上
1 | [target.x86_64-unknown-linux-musl] |
使用cargo build --target=x86_64-unknown-linux-musl
就可以进行编译你的项目了,或者也可以用cargo build --target x86_64-unknown-linux-musl --release
来构建 release 模式的
可见,很快就编译好了,下面我使用 WSL2 运行该程序测试正确性,代码如下(虽然这个不重要)
运行结果如下
可见,一切顺利,结束!
我推荐使用 Vscode 再安装 Rust-Analyzer 插件进行刷题,记得在开刷之前先执行 rustlings lsp
来启用语法提示,下面给大家看看各个布局窗口的作用
1号区域是终端,我在里面启动了 rustlings watch
来检查进度,2号区域是各个题目(所有的题目都在 exercises 文件夹内),3号区域就是代码编辑框了,这样简简单单就可以开始了
Intro 部分其实没什么好看的,主要是教你如何使用 Rustlings ,在终端中提示通过编译后,你把注释中的 // I AM NOT DONE
删掉就可以了
Variables 里面的东西也比较简单,主要就是考变量的初始化语法、未初始化不能使用、如何创建可变变量、重新申明变量、常量必须指明类型这些,基本上没有什么问题,就不赘述了。
Functions 内的内容也比较基础,主要考察了函数的创建、参数的定义和传入、返回值的定义方式、通过去掉分号来返回一个值
很轻松就能解决这一块,我也认为这一块不会出现什么问题,也不多讲了。
If 的第一题体现了我很喜欢的一点,就是 Rust 中的 if 语句是有返回值的,同样可以用去掉分号来表示返回,整体也可以作为函数的返回值,因此这题我的答案是这样的
1 | pub fn bigger(a: i32, b: i32) -> i32 { |
第二题也类似,答案如下
1 | pub fn foo_if_fizz(fizzish: &str) -> &str { |
不过这里其实有一个比较有意思的地方,返回值是一个&str
,新手可能会忘记为什么这里不需要标注生命周期,请让我来解释一下,这是因为这个函数满足了生命周期省略规则,我认为这里满足的是“如果只有一个输入生命周期参数,那么它被赋予所有输出生命周期参数”,所以我觉得函数签名应该等价于 pub fn foo_if_fizz<'a>(fizzish: &'a str) -> &'a str
,不过考虑到字符串字面量的生命周期是 'static
,我认为这里也可以是 pub fn foo_if_fizz(fizzish: &str) -> &'static str
,具体是什么样希望能有大神指出。
终于到了第一个小测验了,这也会是第一篇的最后一题,这是关于上面的 Variables、Functions 和 If 的测验。
对于写完前面的你应该算是简简单单
1 | fn calculate_price_of_apples(num:i32)->i32{ |
本章到此就结束了
我学习 Rust 已经有一小段时间了,Rustling 这个项目我认为是新手学完Rust基本语法,或者在看完 The Book (中文版) 后,一个很适合的练习题组,这个项目提供了75道 Rust 语言的小题目,提供了方方面面的考验,对于绝大多数题目也都有足够的提示,但是鉴于我没有找到使用中文介绍这些题目的文章,便打算自己开一篇介绍和讲解,本人有的实现可能不够好,或者讲解有谬误,希望各位斧正。
既然你已经开始想要写 Rust 练习题,那么你应该已经安装过Rust了,就不做多的介绍了,如果你还没有安装,请参考官方的这个页面,可以先安装Visual Studio最新版后,勾选适用于桌面的C++开发,然后安装 Rustup 等工具。
接下来,打开 Rustlings 官方仓库 ,里面介绍了安装的方式,在 Mac OS 或者 Linux 操作系统上,安装 Rustlings 是很简单的
1 | curl -L https://raw.githubusercontent.com/rust-lang/rustlings/main/install.sh | bash |
使用这个命令就可以把它安装到你的电脑上,之后就可以使用 Rustlings 指令了。至于 Windows 下稍微复杂一点,你需要先激活 Powershell 的脚本运行权限,然后就可以运行安装指令了
1 | Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser |
如果你不喜欢上面的安装方式,也可以手动安装,也没多麻烦,先下载这个 git 仓库,然后在里面运行 cargo install –path . 就行了,我使用 git clone 进行下载,指令可以参考如下(可以把5.2.1替换成最新版本)
1 | git clone -b 5.2.1 --depth 1 https://github.com/rust-lang/rustlings |
这样,你就完成了 rustlings 的安装,尝试在命令行运行 rustlings ,它会给你反应
其实需要做的操作很少,你如果只是做题的话在 rustlings 目录下使用 rustlings watch 就够了,以下内容主要是我对官方操作解释的翻译(注意,你的指令一定要在 rustlings 目录下运行,不要到上级或者子目录)
你要做的所有题目都在 rustlings/exercises/ 文件夹里,当你想以官方推荐的顺序来做的话,运行
1 | rustlings watch |
它会持续按顺序检查题目,并且给出错误(每当你编辑过之后),你需要修好错误或者使代码通过编译,它就会进入下一个题目,直到所有题目完成,或者你关闭了它,如果你只想运行一次而非持续运行,你可以允许下一条指令
1 | rustlings verify |
如果你想手动指定它检查的题目,你可以用 run 指令
1 | rustlings run 测试名 |
或者使用 run next 来检查下一个的
1 | rustlings run next |
当你遇到了不会的题目,需要一定帮助时,可以使用 hint 指令,它的用法和 run 差不多,可以指定名字或者使用 next 来查找下一个
1 | rustlings hint myExercise1 |
list 指令可以用于检查你的进度
1 | rustlings list |
例如我的输出就是都做完了
另外有一个非常重要的,就是你会发现你在编辑时无法使用 Rust-Analyzer ,这怎么行?启用的方法官方仓库也有给出,就是运行
1 | rustlings lsp |
另外,卸载的方法如下:
cargo uninstall rustlings
欢迎来到 Sworld 的博客主页!
本站正在建设,请往下翻以查看更多文章!