在Gentoo上的IntelliJ IDEA中,由于Gentoo不使用rustup,我如何附加rust stdlib源代码?

bqucvtff  于 12个月前  发布在  IntelliJ IDEA
关注(0)|答案(5)|浏览(277)

我正在使用IntelliJ的rust插件(版本0.2.0.2114-182)与IDEA(2018.2.3)。
在我的编辑器窗口的顶部有一个黄色的条,上面写着“cannot attach stdlib sources automatically without rustup”.这并不奇怪,因为gentoo没有使用rustup.它从源代码编译rust。
有一个“手动附加”的选项,但我不知道它想让我选择什么目录;甚至我应该找什么来找出正确的目录是什么;我甚至不确定gentoo ebuild是否创建了一个包含必要的stdlib源代码的目录。
我怎样才能以一种与gentoo的包管理系统兼容的方式向rust插件提供stdlib源代码?似乎How to provide standard library sources for IntelliJ IDEA's Rust project?的答案绕过了gentoo的ebuild,并且可能会随着时间的推移导致cruft的积累。

vfwfrxfs

vfwfrxfs1#

dev-lang/rust Gentoo软件包有一个rls use-flag(代表Rust Language Server),它有一个将Rust源代码安装到/usr/lib/rustlib/src的副作用:

$ equery files dev-lang/rust | grep lib.rs
/usr/lib/rustlib/src/rust/src/libcore/lib.rs
/usr/lib/rustlib/src/rust/src/libstd/lib.rs
(...)

字符串
因此,解决方案是启用rls use-flag,然后将Intellij IDEA指向/usr/lib/rustlib/src/rust/src
x1c 0d1x的数据
我相信这是Gentoo上比绕过portage和/或使用rustup更惯用的解决方案。
请注意,dev-lang/rust-bin包目前没有rls use-flag,我还没有找到一种方法来安装Rust lib源代码。

  • 关于Gentoo中的dev-lang/rust use-flags(及其文档)的贡献可能会受到欢迎。
wrrgggsh

wrrgggsh2#

我有一个实验性的技术,有不同的疣从解决方案斯文发现:
除了gentoo管理的rust ebuild之外,我还安装了rustup。

$ wget -O sh.rustup.rs https://sh.rustup.rs
--2019-09-24 10:28:49--  https://sh.rustup.rs/
Resolving sh.rustup.rs... 13.249.122.62, 13.249.122.9, 13.249.122.96, ...
Connecting to sh.rustup.rs|13.249.122.62|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 10782 (11K) [text/x-sh]
Saving to: 'sh.rustup.rs'

sh.rustup.rs        100%[===================>]  10.53K  --.-KB/s    in 0.001s  

2019-09-24 10:28:49 (10.4 MB/s) - 'sh.rustup.rs' saved [10782/10782]

字符串
然而,rustup很遗憾,我已经在/usr/bin中安装了rust

$ sh sh.rustup.rs
info: downloading installer
error: it looks like you have an existing installation of Rust at:
error: /usr/bin
error: rustup cannot be installed alongside Rust. Please uninstall first
error: if this is what you want, restart the installation with `-y'
error: cannot install while Rust is installed


蛮力“解决”了这个问题:

$ sh sh.rustup.rs -y
info: downloading installer
info: syncing channel updates for 'stable-x86_64-unknown-linux-gnu'
info: latest update on 2019-08-15, rust version 1.37.0 (eae3437df 2019-08-13)
info: downloading component 'rustc'
 85.3 MiB /  85.3 MiB (100 %)   9.6 MiB/s in  9s ETA:  0s
info: downloading component 'rust-std'
 61.2 MiB /  61.2 MiB (100 %)   8.2 MiB/s in  8s ETA:  0s
info: downloading component 'cargo'
info: downloading component 'rust-docs'
 11.3 MiB /  11.3 MiB (100 %)   8.4 MiB/s in  1s ETA:  0s
info: installing component 'rustc'
 85.3 MiB /  85.3 MiB (100 %)  18.4 MiB/s in  4s ETA:  0s
info: installing component 'rust-std'
 61.2 MiB /  61.2 MiB (100 %)  20.9 MiB/s in  5s ETA:  0s
info: installing component 'cargo'
info: installing component 'rust-docs'
 11.3 MiB /  11.3 MiB (100 %) 606.4 KiB/s in  9s ETA:  0s
info: default toolchain set to 'stable'

  stable installed - rustc 1.37.0 (eae3437df 2019-08-13)

Rust is installed now. Great!

To get started you need Cargo's bin directory ($HOME/.cargo/bin) in your PATH 
environment variable. Next time you log in this will be done automatically.

To configure your current shell run source $HOME/.cargo/env


之后,你可能想让rustup使用ebuild安装的相同版本(或者你想让它跟踪最新的稳定版本,你的选择)

$ equery list rust
 * Searching for rust ...
[IP-] [  ] dev-lang/rust-1.34.2:stable/1.34
$ rustup default 1.34.2
info: using existing install for '1.34.2-x86_64-unknown-linux-gnu'
info: default toolchain set to '1.34.2-x86_64-unknown-linux-gnu'
  1.34.2-x86_64-unknown-linux-gnu unchanged - rustc 1.34.2 (6c2484dc3 2019-05-13)


但是你肯定想要rust-src组件

$ rustup component add rust-src 
info: downloading component 'rust-src'
info: installing component 'rust-src'


之后,rust stdlib源应该在$HOME/.rustup/toolchains/$VERSION-$ARCH/lib/rustlib/src/rust/src中,您应该能够将该路径输入到rust插件的设置中。
x1c 0d1x的数据
你也可以使用设置对话框来选择你的工具链(/usr/bin$HOME/.cargo/bin$HOME/.rustup/toolchains/$VERSION-$ARCH/bin;我只是猜测.cargo/bin指向你目前设置的rustup default)。
这个解决方案的缺点是你现在有2个(或更多)rust安装。系统ebuild,加上你使用rustup安装到$HOME/.cargo$HOME/.rustup的任何版本。考虑到我只使用了一个小时左右,可能会有更多的问题。

zlwx9yxi

zlwx9yxi3#

我也遇到了同样的问题。我的解决方案是使用rustup并从我的系统中删除portage的rust。然后你可以告诉portage假设rust是通过使用/etc/portage/package.provided来提供的,以便像firefox一样使用rustup的版本。
下面是一篇描述该过程的短文:https://laumann.xyz/gentoo/2018/05/01/gentoo-package-provided.html
Iirc你不需要他在bash.profile最后放的所有东西,但是现在我不能告诉你你到底可以省略什么

pu3pd22g

pu3pd22g4#

其他帖子提到的路径是正确的:

  • “/usr/bin”表示“工具链位置”。
  • “/usr/lib/rustlib/src/rust/library”表示“标准库”。

在设置它们之后,插件能够正常工作,但是属于Rust标准库的方法/函数的“自动完成”仍然不起作用(在我所有的3个Gentoo笔记本上都有同样的问题,用CLion 2021.2和2021.3 + Rust插件0.4.164和其他一些旧版本+ Rust 1.58.1和1.56.1重现)。
例如,当输入“String::“时,我没有得到显示其函数/方法的列表(例如“from()",“as_bytes()"等)。
确切地说,我第一次设置正确的路径时,该功能正在工作,但在显式重启CLion后就不再工作了(我花了一段时间才意识到这一点,让我疯狂)。
问题的根本原因似乎是rust插件希望能够写入stdlib目录(我没有分析它写了什么,也不打算推测)。
错误消息示例:

error: failed to write /opt/rust-bin-1.58.1/lib/rustlib/src/rust/library/unwind/Cargo.lock

字符串
在CLion改变这种行为之前,解决办法显然是让运行CLion的用户可以写Rust标准库的位置。
直接这样做当然会引发很多问题(安全+ pkg管理),因此我决定寻找替代方案。
我决定使用OverlayFS,以便仍然能够使用Gentoo最初安装的Rust,同时将CLion编写的更改重新路由到一个单独的目录。在我的情况下,详细信息如下:
1-创建了OverlayFS所需的3个自定义目录:

mkdir /opt/stecustom/clion/clion-rust_stdlib-overlay_upperdir
mkdir /opt/stecustom/clion/clion-rust_stdlib-overlay_workdir
mkdir /mnt/clion-rust_stdlib-overlay-result


2-是否进行了初始手动“安装”:

mount -v -t overlay overlay -o noatime,lowerdir=/usr/lib/rustlib,upperdir=/opt/stecustom/clion/clion-rust_stdlib-overlay_upperdir,workdir=/opt/stecustom/clion/clion-rust_stdlib-overlay_workdir /mnt/clion-rust_stdlib-overlay-result


(the“/usr/lib/rustlib”的内容位于附加层“/opt/stecustom/clion/clion-rust_stdlib-overlay_upperdir”之上,所有更改都将写入该层-我不知道“workdir”应该托管什么,但它是一个必需的参数-合并后的层在“/mnt/clion-rust_stdlib-overlay-result”中可用:)
3-在覆盖中更改了所有文件的所有权:

cd /mnt/clion-rust_stdlib-overlay-result
chown -R MY_NON_ROOT_USER /mnt/clion-rust_stdlib-overlay-result/*


4-使CLion的Rust插件使用新的覆盖目录:

  • “/usr/bin”表示“工具链位置”(与之前相同)。
  • “/mnt/clion-rust_stdlib-overlay-result/src/rust/library”表示“标准库”(新!)。

5-重新启动CLion并检查是否一切正常
6-在“/etc/fstab”中将overlayfs永久化:

overlay /mnt/clion-rust_stdlib-overlay-result overlay noatime,lowerdir=/usr/lib/rustlib,upperdir=/opt/stecustom/clion/clion-rust_stdlib-overlay_upperdir,workdir=/opt/stecustom/clion/clion-rust_stdlib-overlay_workdir 0 2


7-重新启动并在CLion中再次检查。

bvjveswy

bvjveswy5#

现在是2023年,Gentoo的Rust构建了(dev-lang/rust和dev-lang/rust-bin)都有rust-src USE标志,这会导致安装Rust标准库的源代码。例如,我用USE=rust-src安装了dev-lang/rust-1.71.1,我使用路径/usr/lib/rust/1.71.1/lib/rustlib/src/rust/library作为RustRover的“Standard Library”配置字段,现在它不再抱怨无效的标准库了。(尽管它确实抱怨它不能到那个位置。)
(Note:这个问题是关于Intellij IDEA的Rust插件。最近这个插件被弃用了; JetBrains现在生产独立的RustRover IDE,目前处于EAP阶段。我的答案是RustRover,但我相当肯定它也适用于旧的插件。)

相关问题