如何管理给定 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。
有几个选项可以缓解可能值得尝试的问题。
用utils::shortPathName()
构造一个所谓的Windows'short path'。这将有助于 trim 更长的路径组件并减小完整路径的大小。
使用 Sys.junction()
到长度较短的本地路径创建项目的连接点,然后移动到该目录。有关详细信息,请参阅 ?Sys.junction
——联结基本上类似于 Windows 快捷方式,或指向目录的符号链接。
在每种情况下,您都应该能够构建一个 "identical" 到您当前项目目录的路径,但要足够短以使事情能够按预期运行。
所以我尝试使用检查点包(日期为 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。
有几个选项可以缓解可能值得尝试的问题。
用
utils::shortPathName()
构造一个所谓的Windows'short path'。这将有助于 trim 更长的路径组件并减小完整路径的大小。使用
Sys.junction()
到长度较短的本地路径创建项目的连接点,然后移动到该目录。有关详细信息,请参阅?Sys.junction
——联结基本上类似于 Windows 快捷方式,或指向目录的符号链接。
在每种情况下,您都应该能够构建一个 "identical" 到您当前项目目录的路径,但要足够短以使事情能够按预期运行。