构建我未更改的包突然失败:对于 Vignettes 和 'arch = x64'

Gre*_*reg 5 64-bit r build devtools package-development

语境

\n

我一直在my_pkg使用最新版本(4.1.1)的 R Studio 在 RStudio 中开发一个带有小插图的专有软件包(称之为“”)。我正在使用以下软件的 Lenovo ThinkPad 进行工作

\n
       sysname        release        version       machine\n     "Windows"       "10 x64"  "build 19043"      "x86-64"\n
Run Code Online (Sandbox Code Playgroud)\n

由 提供Sys.info()

\n

直到最近,我的工作流程还相当顺利(偶尔有例外)。然而,我开始遇到一个非常令人费解的错误,当工作流程顺利进行时,该错误是在与之前几乎相同的条件下发生的。devtools

\n

尽管我的小插图以前总是成功构建的,而且我没有同时编辑它们,但现在由于架构上的特定原因,构建失败了......

\n
Error : package \'my_pkg\' is not installed for \'arch = x64\'\n
Run Code Online (Sandbox Code Playgroud)\n

...当且仅当我在构建中包含小插图时。

\n

我已经从头开始重新安装了 R (以及 Rtools 和 RStudio),重新安装了devtools(及其依赖项),并将我的项目“倒回”到最后一次成功的Git 提交devtools::check()我还与@SteffenMoritz@Alexis等响应者进行了广泛的故障排除,我已在Info by Request部分中为他们附加了更多信息。

\n

不幸的是,没有任何效果。

\n

失败与devtools::check()

\n

当我跑步时devtools::check(),一切都充满希望......

\n
i Updating my_pkg documentation\ni Loading my_pkg\nWriting NAMESPACE\nWriting NAMESPACE\n-- Building --------------------------------------------------------------------------------- my_pkg --\nSetting env vars:\n* CFLAGS    : -Wall -pedantic\n* CXXFLAGS  : -Wall -pedantic\n* CXX11FLAGS: -Wall -pedantic\n-------------------------------------------------------------------------------------------------------\n\xe2\x88\x9a  checking for file \'C:\\Users\\greg\\Workspace\\R\\Packages\\my_pkg/DESCRIPTION\' ...\n-  preparing \'my_pkg\': (733ms)\n\xe2\x88\x9a  checking DESCRIPTION meta-information ... \n-  installing the package to build vignettes\n         -----------------------------------\n-  installing *source* package \'my_pkg\' ...\n   ** using staged installation\n   ** R\n   ** inst\n   ** byte-compile and prepare package for lazy loading\n   ** help\n   *** installing help indices\n     converting help for package \'my_pkg\'\n       finding HTML links ... done \n       foo                                     html\n       my_pkg-package                          html\n   *** copying figures\n   ** building package indices\n   ** installing vignettes\n   ** testing if installed package can be loaded from temporary location\n
Run Code Online (Sandbox Code Playgroud)\n
\n

...直到这一步testing if installed package can be loaded from temporary location。这里出现错误:

\n
   Error : package \'my_pkg\' is not installed for \'arch = x64\'\n   Error: loading failed\n   Execution halted\n   ERROR: loading failed\n-  removing \'C:/Users/greg/AppData/Local/Temp/RtmpSaabgx/Rinst332419517258/my_pkg\'\n         -----------------------------------\n   ERROR: package installation failed\nError in (function (command = NULL, args = character(), error_on_status = TRUE,  : \n  System command \'Rcmd.exe\' failed, exit status: 1, stdout + stderr (last 10 lines):\nE> ** building package indices\nE> ** installing vignettes\nE> ** testing if installed package can be loaded from temporary location\nE> Error : package \'my_pkg\' is not installed for \'arch = x64\'\nE> Error: loading failed\nE> Execution halted\nE> ERROR: loading failed\nE> * removing \'C:/Users/greg/AppData/Local/Temp/RtmpSaabgx/Rinst332419517258/my_pkg\'\nE>       -----------------------------------\nE> ERROR: package installation failed\nType .Last.error.trace to see where the error occurred\n
Run Code Online (Sandbox Code Playgroud)\n

.Last.error.trace表明有一个问题pkgbuild

\n
> .Last.error.trace\n\n Stack trace:\n\n 1. devtools::check()\n 2. withr::with_envvar(pkgbuild::compiler_flags(FALSE), action = "prefix",  ...\n 3. base:::force(code)\n 4. pkgbuild::build(pkg$path, tempdir(), args = build_args, quiet = quiet,  ...\n 5. withr::with_temp_libpaths(rcmd_build_tools(options$cmd, c(options$path,  ...\n 6. base:::force(code)\n 7. pkgbuild:::rcmd_build_tools(options$cmd, c(options$path, options$args),  ...\n 8. pkgbuild:::with_build_tools(callr::rcmd_safe(..., env = env,  ...\n 9. withr::with_path(rtools_path(), code)\n 10. base:::force(code)\n 11. callr::rcmd_safe(..., env = env, spinner = FALSE, show = FALSE,  ...\n 12. callr:::run_r(options)\n 13. base:::with(options, with_envvar(env, do.call(processx::run,  ...\n 14. base:::with.default(options, with_envvar(env, do.call(processx::run,  ...\n 15. base:::eval(substitute(expr), data, enclos = parent.frame())\n 16. base:::eval(substitute(expr), data, enclos = parent.frame())\n 17. callr:::with_envvar(env, do.call(processx::run, c(list(bin, args = real_cmdargs,  ...\n 18. base:::force(code)\n 19. base:::do.call(processx::run, c(list(bin, args = real_cmdargs,  ...\n 20. (function (command = NULL, args = character(), error_on_status = TRUE,  ...\n 21. throw(new_process_error(res, call = sys.call(), echo = echo,  ...\n
Run Code Online (Sandbox Code Playgroud)\n
\n

我不知道为什么这个架构

\n
Error : package \'my_pkg\' is not installed for \'arch = x64\'\n
Run Code Online (Sandbox Code Playgroud)\n

现在应该只是一个问题。我的电脑没有发生任何实质性的变化。

\n

尽管有消息package installation failed,尽管事实上我已经运行devtools::check()而不是devtools::install(),但该包的行为就好像它是“半途”安装的!我可以my_p在控制台中输入,RStudio 会自动完成my_pkg;然后我可以输入my_pkg::,RStudio 将提供 中函数的标准自动完成列表my_pkg,这些函数都可用。

\n

然而,输入my_pkg::不仅会召唤@exported 函数,还会暴露我的内部函数和数据,就像我输入了my_pkg:::!

\n

成功与devtools::install()devtools::build(vignettes = FALSE)

\n

奇怪的是,当我实际运行时devtools::install(),或者相对而言devtools::build_vignettes(vignettes = FALSE),该过程顺利完成!

\n
\xe2\x88\x9a  checking for file \'C:\\Users\\greg\\Workspace\\R\\Packages\\my_pkg/DESCRIPTION\' ...\n-  preparing \'my_pkg\': (640ms)\n\xe2\x88\x9a  checking DESCRIPTION meta-information ... \n-  checking for LF line-endings in source and make files and shell scripts (384ms)\n-  checking for empty or unneeded directories\n   Removed empty directory \'my_pkg/inst/libs\'\n   Omitted \'LazyData\' from DESCRIPTION\n-  building \'my_pkg_0.0.0.9000.tar.gz\'\n   \nRunning "C:/Users/greg/R/bin/x64/Rcmd.exe" INSTALL \\\n  "C:\\Users\\greg\\AppData\\Local\\Temp\\Rtmpozvh26/my_pkg_0.0.0.9000.tar.gz" --install-tests \n* installing to library \'C:/Users/greg/R/library\'\n* installing *source* package \'my_pkg\' ...\n** using staged installation\n** R\n** inst\n** tests\n** byte-compile and prepare package for lazy loading\n** help\n*** installing help indices\n  converting help for package \'my_pkg\'\n    finding HTML links ... done\n       foo                                     html\n       my_pkg-package                          html\n*** copying figures\n** building package indices\n** installing vignettes\n** testing if installed package can be loaded from temporary location\n*** arch - i386\n*** arch - x64\n** testing if installed package can be loaded from final location\n*** arch - i386\n*** arch - x64\n** testing if installed package keeps a record of temporary installation path\n* DONE (my_pkg)\nMaking \'packages.html\' ... done\n
Run Code Online (Sandbox Code Playgroud)\n

my_pkg::现在,自动补全功能完全按预期工作,并且仅分别由和公开适当的功能my_pkg:::

\n

失败devtools::install(build_vignettes = TRUE)devtools::build()

\n

然而,情节还有进一步的转折。当我使用或比较时,我收到与以下类似的错误:devtools::install(build_vignettes = TRUE)devtools::build()devtools::check()

\n
\xe2\x88\x9a  checking for file \'C:\\Users\\greg\\Workspace\\R\\Packages\\my_pkg/DESCRIPTION\' ...\n-  preparing \'my_pkg\': (672ms)\n\xe2\x88\x9a  checking DESCRIPTION meta-information ... \n-  installing the package to build vignettes\n         -----------------------------------\n-  installing *source* package \'my_pkg\' ...\n   ** using staged installation\n   ** R\n   ** inst\n   ** byte-compile and prepare package for lazy loading\n   ** help\n   *** installing help indices\n     converting help for package \'my_pkg\'\n       finding HTML links ... done\n       foo                                     html\n       my_pkg-package                          html\n   *** copying figures\n   ** building package indices\n   ** installing vignettes\n   ** testing if installed package can be loaded from temporary location\n
Run Code Online (Sandbox Code Playgroud)\n
\n
   Error : package \'my_pkg\' is not installed for \'arch = x64\'\n   Error: loading failed\n   Execution halted\n   ERROR: loading failed\n-  removing \'C:/Users/greg/AppData/Local/Temp/RtmpM7RbHr/Rinst504119422cd/my_pkg\'\n         -----------------------------------\n   ERROR: package installation failed\nError in (function (command = NULL, args = character(), error_on_status = TRUE,  : \n  System command \'Rcmd.exe\' failed, exit status: 1, stdout + stderr (last 10 lines):\nE> ** building package indices\nE> ** installing vignettes\nE> ** testing if installed package can be loaded from temporary location\nE> Error : package \'my_pkg\' is not installed for \'arch = x64\'\nE> Error: loading failed\nE> Execution halted\nE> ERROR: loading failed\nE> * removing \'C:/Users/greg/AppData/Local/Temp/RtmpM7RbHr/Rinst504119422cd/my_pkg\'\nE>       -----------------------------------\nE> ERROR: package installation failed\nType .Last.error.trace to see where the error occurred\n
Run Code Online (Sandbox Code Playgroud)\n

成功与devtools::build_vignettes()

\n

奇怪的是,尽管存在上述构建小插图的问题,但当我调用devtools::build_vignettes()sans argument 或 with时,一切都以某种方式顺利运行dependencies = TRUE

\n
i Building my_pkg vignettes\n\xe2\x88\x9a Creating \'doc/\'\n\xe2\x88\x9a Adding \'^doc$\' to \'.Rbuildignore\'\n\xe2\x88\x9a Setting active project to \'<no active project>\'\n\xe2\x88\x9a Adding \'/doc/\' to \'.gitignore\'\n\xe2\x88\x9a Setting active project to \'<no active project>\'\ni Moving backstory.html, intro.html, library.html, template.html, usage.html, backstory.R, intro.R, library.R, template.R, and usage.R to doc/\ni Copying backstory.Rmd, intro.Rmd, library.Rmd, template.Rmd, and usage.Rmd to doc/\n\xe2\x88\x9a Creating \'Meta/\'\n\xe2\x88\x9a Adding \'^Meta$\' to \'.Rbuildignore\'\n\xe2\x88\x9a Setting active project to \'<no active project>\'\n\xe2\x88\x9a Adding \'/Meta/\' to \'.gitignore\'\n\xe2\x88\x9a Setting active project to \'<no active project>\'\ni Building vignette index\n
Run Code Online (Sandbox Code Playgroud)\n

笔记

\n

假设错误是我的,并且我无意中在 R 项目中的某个地方引入了问题,我切换到了一个完全不同的 Git 分支。最近对该分支的提交已经devtools::check()顺利通过。然而,即使切换到这个“安全”分支后,同样的问题仍然存在!

\n

从上次成功检查到问题开始之间,我没有进行任何更新:

\n\n

同样,这些小插曲从项目的早期就已经存在了。

\n

结论

\n

我希望my_pkg在不久的将来推出一个概念验证,而这些小插图对其可用性来说非常重要。

\n
\n

按要求提供信息

\n

由于“ my_pkg”是专有的,因此我在这里将我的个人和组织信息(名称、文件路径等)匿名化,如上所述。

\n

对于@SteffenMoritz

\n
\n

您介意分享您的描述文件和插图标题/元信息吗?

\n
\n

文件DESCRIPTION

\n
Package: my_pkg\nTitle: Proprietary Package for My Org\nVersion: 0.0.0.9000\nAuthors@R: \n    person(given = "Greg",\n           family = "Lastname",\n           role = c("aut", "cre"),\n           email = c("glastname@myorg.com"))\nDescription: The `my_pkg` package is a proprietary project for My Org,\n    and as such I have changed the names to project the innocent.\nLicense: file LICENSE\nEncoding: UTF-8\nLazyData: true\nRoxygen: list(markdown = TRUE)\nRoxygenNote: 7.1.2\nURL: https://github.com/myorg/my_pkg\nBugReports: https://github.com/my_org/my_pkg/issues\nSuggests: \n    knitr,\n    rmarkdown,\n    testthat (>= 3.0.0)\nConfig/testthat/edition: 3\nVignetteBuilder: knitr\nDepends: \n    R (>= 2.10)\n
Run Code Online (Sandbox Code Playgroud)\n

小插图标题:

\n
    \n
  • intro.Rmd
  • \n
\n
---\ntitle: "A Catchphrase!"\nauthor: "Gregory Lastname"\ndate: "`r Sys.Date()`"\noutput: rmarkdown::html_vignette\nvignette: >\n  %\\VignetteIndexEntry{A Catchphrase!}\n  %\\VignetteEngine{knitr::rmarkdown}\n  %\\VignetteEncoding{UTF-8}\n---\n\n```{r, include = FALSE}\nknitr::opts_chunk$set(\n  # Show no output.\n  eval = FALSE, results = "hide",\n  # Show no dialog.\n  message = FALSE, warning = FALSE,\n  # Show no errors.\n  error = TRUE, purl = FALSE,\n  # Default format.\n  collapse = TRUE, comment = "#>"\n)\n    ```\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • backstory.Rmd
  • \n
\n
---\ntitle: "A Reference, to Science Fiction"\nauthor: "Gregory Lastname"\ndate: "`r Sys.Date()`"\noutput: rmarkdown::html_vignette\nvignette: >\n  %\\VignetteIndexEntry{A Reference, to Science Fiction}\n  %\\VignetteEngine{knitr::rmarkdown}\n  %\\VignetteEncoding{UTF-8}\n---\n\n```{r, include = FALSE}\nknitr::opts_chunk$set(\n  # Show no output.\n  eval = FALSE, results = "hide",\n  # Show no dialog.\n  message = FALSE, warning = FALSE,\n  # Show no errors.\n  error = TRUE, purl = FALSE,\n  # Default format.\n  collapse = TRUE, comment = "#>"\n)\n    ```\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • library.Rmd
  • \n
\n
---\ntitle: "A Generic One-Liner"\nauthor: "Gregory Lastname"\ndate: "`r Sys.Date()`"\noutput: rmarkdown::html_vignette\nvignette: >\n  %\\VignetteIndexEntry{A Generic One-Liner}\n  %\\VignetteEngine{knitr::rmarkdown}\n  %\\VignetteEncoding{UTF-8}\n---\n\n```{r, include = FALSE}\nknitr::opts_chunk$set(\n  # Show no output.\n  eval = FALSE, results = "hide",\n  # Show no dialog.\n  message = FALSE, warning = FALSE,\n  # Show no errors.\n  error = TRUE, purl = FALSE,\n  # Default format.\n  collapse = TRUE, comment = "#>"\n)\n    ```\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • template.Rmd
  • \n
\n
---\ntitle: "A Well-Written Description"\nauthor: "Gregory Lastname"\ndate: "`r Sys.Date()`"\noutput: rmarkdown::html_vignette\nvignette: >\n  %\\VignetteIndexEntry{A Well-Written Description}\n  %\\VignetteEngine{knitr::rmarkdown}\n  %\\VignetteEncoding{UTF-8}\n---\n\n```{r, include = FALSE}\nknitr::opts_chunk$set(\n  # Show no output.\n  eval = FALSE, results = "hide",\n  # Show no dialog.\n  message = FALSE, warning = FALSE,\n  # Show no errors.\n  error = TRUE, purl = FALSE,\n  # Default format.\n  collapse = TRUE, comment = "#>"\n)\n    ```\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • usage.Rmd
  • \n
\n
---\ntitle: "An Exhortation!"\nauthor: "Gregory Lastname"\ndate: "`r Sys.Date()`"\noutput: rmarkdown::html_vignette\nvignette: >\n  %\\VignetteIndexEntry{An Exhortation!}\n  %\\VignetteEngine{knitr::rmarkdown}\n  %\\VignetteEncoding{UTF-8}\n---\n\n```{r, include = FALSE}\nknitr::opts_chunk$set(\n  # Show no output.\n  eval = FALSE, results = "hide",\n  # Show no dialog.\n  message = FALSE, warning = FALSE,\n  # Show no errors.\n  error = TRUE, purl = FALSE,\n  # Default format.\n  collapse = TRUE, comment = "#>"\n)\n    ```\n
Run Code Online (Sandbox Code Playgroud)\n

对于@亚历克西斯

\n
\n

如果.Rproj使用文本编辑器打开该文件,您会看到什么?

\n
\n

my_pkg.Rproj文件在 MS 记事本中打开。注意:自最初提交以来,该文件尚未被修改。

\n
Version: 1.0\n\nRestoreWorkspace: No\nSaveWorkspace: No\nAlwaysSaveHistory: Default\n\nEnableCodeIndexing: Yes\nUseSpacesForTab: Yes\nNumSpacesForTab: 2\nEncoding: UTF-8\n\nRnwWeave: Sweave\nLaTeX: pdfLaTeX\n\nAutoAppendNewline: Yes\nStripTrailingWhitespace: Yes\nLineEndingConversion: Posix\n\nBuildType: Package\nPackageUseDevtools: Yes\nPackageInstallArgs: --no-multiarch --with-keep.source\nPackageRoxygenize: rd,collate,namespace\n
Run Code Online (Sandbox Code Playgroud)\n

要求

\n
\n

如果R CMD build/INSTALL ...从命令行运行它可以工作吗?

\n
\n

我也从命令行构建

\n
greg@CO-GLASTNAME MINGW64 ~/Workspace/R\n$ R CMD build C:/Users/greg/Workspace/R/Packages/my_pkg\n
Run Code Online (Sandbox Code Playgroud)\n

但我得到了上面回显的相同输出:

\n
* checking for file \'C:/Users/greg/Workspace/R/Packages/my_pkg/DESCRIPTION\' ... OK\n* preparing \'my_pkg\':\n* checking DESCRIPTION meta-information ... OK\n* installing the package to build vignettes\n      -----------------------------------\n* installing *source* package \'my_pkg\' ...\n** using staged installation\n** R\n** inst\n** byte-compile and prepare package for lazy loading\n** help\n*** installing help indices\n  converting help for package \'my_pkg\'\n    finding HTML links ... done\n    foo                                     html\n    my_pkg-package                          html\n*** copying figures\n** building package indices\n** installing vignettes\n** testing if installed package can be loaded from temporary location\nError : package \'my_pkg\' is not installed for \'arch = x64\'\nError: loading failed\nExecution halted\nERROR: loading failed\n* removing \'C:/Users/greg/AppData/Local/Temp/RtmpgFIc2r/Rinst1cc0231a6b37/my_pkg\'\n      -----------------------------------\nERROR: package installation failed\n
Run Code Online (Sandbox Code Playgroud)\n

sta*_*007 3

你可能是对的,这是小插图的问题。\n(但当然我不能 100% 确定,因为我不知道你的文件)

\n

check()关于您对and运行的困惑install()

\n
\n

RStudio\xe2\x80\x99s \xe2\x80\x9cbuild 并重新加载不\xe2\x80\x99t 构建小插图

\n
\n

这就是为什么您可能必须运行 devtools::install() 才能收到错误。

\n

我将向您发布一些最有可能出现的小插图问题(这里也是一个很好的较长教程):

\n

首先检查以下事项:

\n
    \n
  1. 该目录名为 vignettes/ 而不是 vignette/。

    \n
  2. \n
  3. 检查 .Rbuildignore 是否未覆盖小插图

    \n
  4. \n
  5. 确保您拥有必要的插图元数据(乍一看您的效果似乎不错)

    \n
  6. \n
\n

这些东西很可能对你来说没问题(但只是为了检查)。

\n

在我看来,最可能的问题是,您的描述文件不包含 .Rmd 小插图的所有必要依赖项

\n

还最好写:

\n
VignetteBuilder: knitr, rmarkdown\n
Run Code Online (Sandbox Code Playgroud)\n

建议中还额外保留 rmarkdown。还对 Suggests 和 VignetteBuilder 进行了编织。

\n

更重要的是(!)您还需要在 .Rmd 文件中使用的软件包Suggests。由于我假设您正在使用 RMarkdown,因此您的插图中有一些代码。\n检查您的代码并查看您正在使用哪些包。小插图使用的任何包都应在DESCRIPTION.

\n

我可以想象这也可能是原因,为什么它看起来有效一次,然后在没有任何改变(在你看来)之后它失败了。

\n

可能是当它工作时,您仍然在后台加载了所有必需的包。这样就不会产生影响,因为Suggests.

\n

这是我的第一个猜测,问题可能是什么。\n如果这不起作用,我会尝试删除小插图,看看是否是某个小插图导致了问题。

\n