使用Cargo进行源代码构建(外部构建目录)?

时间:2016-12-22 02:24:57

标签: build rust rust-cargo

使用过CMake之后,我已经习惯了使用CMake鼓励的源外构建。如何使用Cargo完成源外构建?

再次使用in-source-builds感觉就像倒退了一步:

  • 需要将开发工具配置为忽略路径。有时候有多个插件和开发工具 - 特别是使用VIM或Emacs!
  • 某些工具无法配置为轻松隐藏构建文件。虽然点文件通常是隐藏的,但它们仍会显示Cargo.locktarget/,更糟糕的是,递归地展示其内容。
  • Deleting un-tracked files删除版本控制之外的所有内容,通常是清理编辑器临时文件或某些测试输出,如果您忘记将新文件添加到版本控制并且不手动,则可能适得其反strong>在删除之前正确检查文件列表。
  • 依赖关系被下载到您的源代码路径中,有时在*.rs目录中添加target文件作为构建间接deps的一部分,因此对所有*.rs文件进行操作可能会意外地拾取其他文件它们不在隐藏目录中,因此即使配置了开发工具也不会被忽略。

虽然可以解决所有这些问题,但我宁愿只有一个外部构建路径并保持源目录的原始状态。

2 个答案:

答案 0 :(得分:9)

您可以通过configuration file (key build.target-dir)environment variable (CARGO_TARGET_DIR)指定target/ 文件夹的目录。以下是使用配置文件的示例:

假设您想要一个目录~/work/,您希望在其中保存货物项目(~/work/foo/),并在其旁边显示目标目录(~/work/my-target/)。

$ cd ~/work
$ cargo new --bin foo
$ mkdir .cargo
$ $EDITOR .cargo/config

然后将以下内容插入配置文件中:

[build]
target-dir = "./my-target"

如果您构建了正常的货物项目目录:

$ cd foo
$ cargo build

您会注意到没有target/目录,但所有内容都在~/work/my-target/

但是,Cargo.lock仍保存在Cargo项目目录中,但这有点意义。 For executables, you should check the Cargo.lock file into your git! For libraries, you shouldn't。我想不得不忽略一个文件比忽略整个文件夹更好。

最后,更改target-dir有一些注意事项,列出in the PR which introduced the feature

答案 1 :(得分:0)

虽然有用手动设置它并不是那么方便,但我希望能够在源代码树中构建多个包,所有这些包都是源外的,d = {'date':['1/15/2015','2/15/2015'], 'num':[1,2]} s = {'split':['2/1/2015', '2/1/2016', '2/1/2014']} df = pd.DataFrame(d) sf = pd.DataFrame(s) df['date'] = pd.to_datetime(df['date']) sf['split'] = pd.to_datetime(sf['split']) print (df) date num 0 2015-01-15 1 1 2015-02-15 2 print (sf) split 0 2015-02-01 1 2016-02-01 2 2014-02-01 配置选项不会没有实现。

Helper实用程序,用于方便的源代码构建

使用环境变量I've written a small utility to wrap cargo,因此它会在源代码树的子目录中的顶层自动构建源外支持包。(

感谢Lukas指出mask = (sf.split <= df.date.max()) & (sf.split >= df.date.min()) print (mask) 0 True 1 False 2 False Name: split, dtype: bool sf = sf[mask] print (sf) split 0 2015-02-01 df = pd.concat([df, sf.rename(columns={'split':'date'})]).sort_values('date') print (df) date num 0 2015-01-15 1.0 0 2015-02-01 NaN 1 2015-02-15 2.0 ../target-dir配置选项。