如何管理给定 Windows 255 个文件路径限制的 R 包,例如检查点和 Rcpp?

How to Manage R Packages given Windows 255 file path limit, e.g. checkpoint and Rcpp?

所以我尝试使用检查点包(日期为 2020 年 3 月 1 日)安装 Rcpp。

我的大部分包都很好,但 Rcpp 专门制作了 很多 的临时目录,然后将其删除,例如:

00LOCK-Rcpp/00new/Rcpp/include/Rcpp/generated/InternalFunctionWithStdFunction_call.h

这是 84 个字符,我相信有些更长。

Checkpoint 也创建了许多目录,例如在此处使用自定义库:

"custom_library/.checkpoint/2020-03-01/lib/x86_64-w64-mingw32/3.6.0/"

这是 67 个字符,其中 52 个字符仅在管理多个检查点日期或版本时才需要。

这意味着对于文件路径,例如:

"C:/Users/USER/OneDrive - COMPANY/Documents/LargeDirectory/SubDirectory1/SubDirectory2/custom_library/.checkpoint/2020-03-01/lib/x86_64-w64-mingw32/3.6.0/Rcpp"

假设即使是临时文件也不能超过 255 个字符,那么我肯定有 < 60 个字符可用于所有 Rcpp 临时对象。

我用下面的代码测试:

setwd("C:/Users/USERNAME/OneDrive - COMPANY/Documents/LargeDirectory/SubDirectory1/SubDirectory2/") 
dir.create("custom_library)
checkpoint(as.Date("2020-03-01"),
           checkpointLocation = paste0(
          "SubDirectory2","/custom_library")
          )
y
install.packages("Rcpp") 

它失败了,因为很多 "no file or directory found" 我认为实际上失败是因为无法创建 00LOCK-Rcpp/00new/Rcpp/include/Rcpp/ 然后将所有 .h 文件解压缩到它。我很好奇,所以我 运行 以下内容:

setwd("~") # up to Documents 
dir.create("Rcpptest")
.libPaths("Rcpptest")
install.packages("Rcpp") 

并且安装正常。

关于如何使检查点不创建那么多嵌套目录或在安装整个包之前忽略 file_path 255 限制的任何想法?

现在,我可能会将目录向上移动几层,但如果能深入了解我的猜测是否真的正确或是否遗漏了什么,我们将不胜感激!

我相信你是对的——据我所知,这是 R 使用的内部 unzip 实现的限制,最终是 Windows API 的限制由 R 使用。有关更多讨论,请参阅 https://docs.microsoft.com/en-us/windows/win32/fileio/naming-a-file

有几个选项可以缓解可能值得尝试的问题。

  1. utils::shortPathName()构造一个所谓的Windows'short path'。这将有助于 trim 更长的路径组件并减小完整路径的大小。

  2. 使用 Sys.junction() 到长度较短的本地路径创建项目的连接点,然后移动到该目录。有关详细信息,请参阅 ?Sys.junction——联结基本上类似于 Windows 快捷方式,或指向目录的符号链接。

在每种情况下,您都应该能够构建一个 "identical" 到您当前项目目录的路径,但要足够短以使事情能够按预期运行。