[英]Building my unaltered package suddenly fails: for Vignettes and 'arch = x64'
我一直在使用最新版本(4.1.1)的 R 在 RStudio 中開發一個帶有小插圖的專有軟件包(稱為“ my_pkg
”)。我正在使用以下軟件開發聯想 ThinkPad
sysname release version machine
"Windows" "10 x64" "build 19043" "x86-64"
由Sys.info()
提供。
直到最近,我的devtools
工作流程還算順利( 偶爾有一個例外)。 但是,我開始遇到一個非常令人費解的錯誤,該錯誤發生在與之前幾乎相同的條件下,當工作流程順利進行時。
盡管我的小插曲以前總是成功構建的,而我同時沒有編輯它們,但由於架構上的特定原因,現在構建失敗了......
Error : package 'my_pkg' is not installed for 'arch = x64'
...當且僅當我在構建中包含小插曲時。
我從頭開始重新安裝了 R (以及 Rtools 和 RStudio),重新安裝了devtools
(及其依賴項),並將我的項目“倒回”到了devtools::check()
成功的最后一個 Git 提交。 我還與@SteffenMoritz和@Alexis等響應者一起進行了廣泛的故障排除,我在Info by Request部分中為他們附加了更多信息。
不幸的是,沒有任何效果。
devtools::check()
失敗當我運行devtools::check()
時,一切都開始有希望......
i Updating my_pkg documentation
i Loading my_pkg
Writing NAMESPACE
Writing NAMESPACE
-- Building --------------------------------------------------------------------------------- my_pkg --
Setting env vars:
* CFLAGS : -Wall -pedantic
* CXXFLAGS : -Wall -pedantic
* CXX11FLAGS: -Wall -pedantic
-------------------------------------------------------------------------------------------------------
√ checking for file 'C:\Users\greg\Workspace\R\Packages\my_pkg/DESCRIPTION' ...
- preparing 'my_pkg': (733ms)
√ checking DESCRIPTION meta-information ...
- installing the package to build vignettes
-----------------------------------
- installing *source* package 'my_pkg' ...
** using staged installation
** R
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
converting help for package 'my_pkg'
finding HTML links ... done
foo html
my_pkg-package html
*** copying figures
** building package indices
** installing vignettes
** testing if installed package can be loaded from temporary location
...直到步驟testing if installed package can be loaded from temporary location
。 這里發生錯誤:
Error : package 'my_pkg' is not installed for 'arch = x64'
Error: loading failed
Execution halted
ERROR: loading failed
- removing 'C:/Users/greg/AppData/Local/Temp/RtmpSaabgx/Rinst332419517258/my_pkg'
-----------------------------------
ERROR: package installation failed
Error in (function (command = NULL, args = character(), error_on_status = TRUE, :
System command 'Rcmd.exe' failed, exit status: 1, stdout + stderr (last 10 lines):
E> ** building package indices
E> ** installing vignettes
E> ** testing if installed package can be loaded from temporary location
E> Error : package 'my_pkg' is not installed for 'arch = x64'
E> Error: loading failed
E> Execution halted
E> ERROR: loading failed
E> * removing 'C:/Users/greg/AppData/Local/Temp/RtmpSaabgx/Rinst332419517258/my_pkg'
E> -----------------------------------
E> ERROR: package installation failed
Type .Last.error.trace to see where the error occurred
.Last.error.trace
指出了pkgbuild
的一個問題:
> .Last.error.trace
Stack trace:
1. devtools::check()
2. withr::with_envvar(pkgbuild::compiler_flags(FALSE), action = "prefix", ...
3. base:::force(code)
4. pkgbuild::build(pkg$path, tempdir(), args = build_args, quiet = quiet, ...
5. withr::with_temp_libpaths(rcmd_build_tools(options$cmd, c(options$path, ...
6. base:::force(code)
7. pkgbuild:::rcmd_build_tools(options$cmd, c(options$path, options$args), ...
8. pkgbuild:::with_build_tools(callr::rcmd_safe(..., env = env, ...
9. withr::with_path(rtools_path(), code)
10. base:::force(code)
11. callr::rcmd_safe(..., env = env, spinner = FALSE, show = FALSE, ...
12. callr:::run_r(options)
13. base:::with(options, with_envvar(env, do.call(processx::run, ...
14. base:::with.default(options, with_envvar(env, do.call(processx::run, ...
15. base:::eval(substitute(expr), data, enclos = parent.frame())
16. base:::eval(substitute(expr), data, enclos = parent.frame())
17. callr:::with_envvar(env, do.call(processx::run, c(list(bin, args = real_cmdargs, ...
18. base:::force(code)
19. base:::do.call(processx::run, c(list(bin, args = real_cmdargs, ...
20. (function (command = NULL, args = character(), error_on_status = TRUE, ...
21. throw(new_process_error(res, call = sys.call(), echo = echo, ...
我不知道為什么架構
Error : package 'my_pkg' is not installed for 'arch = x64'
應該只是現在的問題。 我的電腦沒有實質性的變化。
盡管消息package installation failed
,並且盡管我運行的是devtools::
check()
而不是devtools::
install()
,但該包的行為就好像它已經“中途”安裝了一樣! 我可以在控制台中輸入my_p
,RStudio 會自動完成my_pkg
; 然后我可以鍵入my_pkg::
並且 RStudio 將提供my_pkg
中所有可用的函數的標准自動完成列表。
但是,鍵入my_pkg::
不僅會@export
ed 函數,還會公開我的內部函數和數據,就好像我鍵入my_pkg
:::
一樣!
devtools::install()
或devtools::build(vignettes = FALSE)
成功奇怪的是,當我實際運行devtools::install()
或類似的devtools::build_vignettes(vignettes = FALSE)
時,該過程順利完成!
√ checking for file 'C:\Users\greg\Workspace\R\Packages\my_pkg/DESCRIPTION' ...
- preparing 'my_pkg': (640ms)
√ checking DESCRIPTION meta-information ...
- checking for LF line-endings in source and make files and shell scripts (384ms)
- checking for empty or unneeded directories
Removed empty directory 'my_pkg/inst/libs'
Omitted 'LazyData' from DESCRIPTION
- building 'my_pkg_0.0.0.9000.tar.gz'
Running "C:/Users/greg/R/bin/x64/Rcmd.exe" INSTALL \
"C:\Users\greg\AppData\Local\Temp\Rtmpozvh26/my_pkg_0.0.0.9000.tar.gz" --install-tests
* installing to library 'C:/Users/greg/R/library'
* installing *source* package 'my_pkg' ...
** using staged installation
** R
** inst
** tests
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
converting help for package 'my_pkg'
finding HTML links ... done
foo html
my_pkg-package html
*** copying figures
** building package indices
** installing vignettes
** testing if installed package can be loaded from temporary location
*** arch - i386
*** arch - x64
** testing if installed package can be loaded from final location
*** arch - i386
*** arch - x64
** testing if installed package keeps a record of temporary installation path
* DONE (my_pkg)
Making 'packages.html' ... done
現在,自動完成功能完全按預期工作, my_pkg::
和my_pkg:::
分別只公開了適當的函數。
devtools::install(build_vignettes = TRUE)
或devtools::build()
失敗然而,還有一個進一步的情節轉折。 當我使用devtools::install(
build_vignettes = TRUE
)
或類似的devtools::build()
時,我得到與devtools::check()
類似的錯誤:
√ checking for file 'C:\Users\greg\Workspace\R\Packages\my_pkg/DESCRIPTION' ...
- preparing 'my_pkg': (672ms)
√ checking DESCRIPTION meta-information ...
- installing the package to build vignettes
-----------------------------------
- installing *source* package 'my_pkg' ...
** using staged installation
** R
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
converting help for package 'my_pkg'
finding HTML links ... done
foo html
my_pkg-package html
*** copying figures
** building package indices
** installing vignettes
** testing if installed package can be loaded from temporary location
Error : package 'my_pkg' is not installed for 'arch = x64'
Error: loading failed
Execution halted
ERROR: loading failed
- removing 'C:/Users/greg/AppData/Local/Temp/RtmpM7RbHr/Rinst504119422cd/my_pkg'
-----------------------------------
ERROR: package installation failed
Error in (function (command = NULL, args = character(), error_on_status = TRUE, :
System command 'Rcmd.exe' failed, exit status: 1, stdout + stderr (last 10 lines):
E> ** building package indices
E> ** installing vignettes
E> ** testing if installed package can be loaded from temporary location
E> Error : package 'my_pkg' is not installed for 'arch = x64'
E> Error: loading failed
E> Execution halted
E> ERROR: loading failed
E> * removing 'C:/Users/greg/AppData/Local/Temp/RtmpM7RbHr/Rinst504119422cd/my_pkg'
E> -----------------------------------
E> ERROR: package installation failed
Type .Last.error.trace to see where the error occurred
devtools::build_vignettes()
取得成功奇怪的是,盡管在構建小插圖時存在上述問題,但當我調用devtools::build_vignettes()
無參數或使用dependencies = TRUE
時,一切都以某種方式順利運行:
i Building my_pkg vignettes
√ Creating 'doc/'
√ Adding '^doc$' to '.Rbuildignore'
√ Setting active project to '<no active project>'
√ Adding '/doc/' to '.gitignore'
√ Setting active project to '<no active project>'
i Moving backstory.html, intro.html, library.html, template.html, usage.html, backstory.R, intro.R, library.R, template.R, and usage.R to doc/
i Copying backstory.Rmd, intro.Rmd, library.Rmd, template.Rmd, and usage.Rmd to doc/
√ Creating 'Meta/'
√ Adding '^Meta$' to '.Rbuildignore'
√ Setting active project to '<no active project>'
√ Adding '/Meta/' to '.gitignore'
√ Setting active project to '<no active project>'
i Building vignette index
假設是我的錯,並且我無意中在我的 R 項目中的某個地方引入了一個問題,我切換到了一個完全不同的 Git 分支。 最近對該分支的提交通過了devtools::check()
並取得了成功。 然而,即使在切換到這個“安全”分支之后,同樣的問題仍然存在!
在最后一次成功檢查和問題開始之間,我沒有更新:
同樣,這些小插曲在項目的早期就已經存在。
我希望在不久的將來my_pkg
的概念驗證,並且這些小插曲對其可用性非常重要。
由於“ my_pkg
”是專有的,因此我在此匿名化我的個人和組織信息(名稱、文件路徑等),如上所述。
您介意分享您的說明文件和小插圖標題/元信息嗎?
DESCRIPTION
文件:
Package: my_pkg
Title: Proprietary Package for My Org
Version: 0.0.0.9000
Authors@R:
person(given = "Greg",
family = "Lastname",
role = c("aut", "cre"),
email = c("glastname@myorg.com"))
Description: The `my_pkg` package is a proprietary project for My Org,
and as such I have changed the names to project the innocent.
License: file LICENSE
Encoding: UTF-8
LazyData: true
Roxygen: list(markdown = TRUE)
RoxygenNote: 7.1.2
URL: https://github.com/myorg/my_pkg
BugReports: https://github.com/my_org/my_pkg/issues
Suggests:
knitr,
rmarkdown,
testthat (>= 3.0.0)
Config/testthat/edition: 3
VignetteBuilder: knitr
Depends:
R (>= 2.10)
小插圖標題:
intro.Rmd
:---
title: "A Catchphrase!"
author: "Gregory Lastname"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{A Catchphrase!}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r, include = FALSE}
knitr::opts_chunk$set(
# Show no output.
eval = FALSE, results = "hide",
# Show no dialog.
message = FALSE, warning = FALSE,
# Show no errors.
error = TRUE, purl = FALSE,
# Default format.
collapse = TRUE, comment = "#>"
)
```
backstory.Rmd
:---
title: "A Reference, to Science Fiction"
author: "Gregory Lastname"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{A Reference, to Science Fiction}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r, include = FALSE}
knitr::opts_chunk$set(
# Show no output.
eval = FALSE, results = "hide",
# Show no dialog.
message = FALSE, warning = FALSE,
# Show no errors.
error = TRUE, purl = FALSE,
# Default format.
collapse = TRUE, comment = "#>"
)
```
library.Rmd
---
title: "A Generic One-Liner"
author: "Gregory Lastname"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{A Generic One-Liner}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r, include = FALSE}
knitr::opts_chunk$set(
# Show no output.
eval = FALSE, results = "hide",
# Show no dialog.
message = FALSE, warning = FALSE,
# Show no errors.
error = TRUE, purl = FALSE,
# Default format.
collapse = TRUE, comment = "#>"
)
```
template.Rmd
---
title: "A Well-Written Description"
author: "Gregory Lastname"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{A Well-Written Description}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r, include = FALSE}
knitr::opts_chunk$set(
# Show no output.
eval = FALSE, results = "hide",
# Show no dialog.
message = FALSE, warning = FALSE,
# Show no errors.
error = TRUE, purl = FALSE,
# Default format.
collapse = TRUE, comment = "#>"
)
```
usage.Rmd
---
title: "An Exhortation!"
author: "Gregory Lastname"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
%\VignetteIndexEntry{An Exhortation!}
%\VignetteEngine{knitr::rmarkdown}
%\VignetteEncoding{UTF-8}
---
```{r, include = FALSE}
knitr::opts_chunk$set(
# Show no output.
eval = FALSE, results = "hide",
# Show no dialog.
message = FALSE, warning = FALSE,
# Show no errors.
error = TRUE, purl = FALSE,
# Default format.
collapse = TRUE, comment = "#>"
)
```
如果您使用文本編輯器打開
.Rproj
文件,您會看到什么?
在 MS 記事本中打開的my_pkg.Rproj
文件。 注意:自從最初的提交以來,該文件沒有被修改過。
Version: 1.0
RestoreWorkspace: No
SaveWorkspace: No
AlwaysSaveHistory: Default
EnableCodeIndexing: Yes
UseSpacesForTab: Yes
NumSpacesForTab: 2
Encoding: UTF-8
RnwWeave: Sweave
LaTeX: pdfLaTeX
AutoAppendNewline: Yes
StripTrailingWhitespace: Yes
LineEndingConversion: Posix
BuildType: Package
PackageUseDevtools: Yes
PackageInstallArgs: --no-multiarch --with-keep.source
PackageRoxygenize: rd,collate,namespace
按要求
如果您從命令行運行
R CMD build/INSTALL ...
是否有效?
我也是從命令行構建的
greg@CO-GLASTNAME MINGW64 ~/Workspace/R
$ R CMD build C:/Users/greg/Workspace/R/Packages/my_pkg
但我在上面得到了相同的輸出:
* checking for file 'C:/Users/greg/Workspace/R/Packages/my_pkg/DESCRIPTION' ... OK
* preparing 'my_pkg':
* checking DESCRIPTION meta-information ... OK
* installing the package to build vignettes
-----------------------------------
* installing *source* package 'my_pkg' ...
** using staged installation
** R
** inst
** byte-compile and prepare package for lazy loading
** help
*** installing help indices
converting help for package 'my_pkg'
finding HTML links ... done
foo html
my_pkg-package html
*** copying figures
** building package indices
** installing vignettes
** testing if installed package can be loaded from temporary location
Error : package 'my_pkg' is not installed for 'arch = x64'
Error: loading failed
Execution halted
ERROR: loading failed
* removing 'C:/Users/greg/AppData/Local/Temp/RtmpgFIc2r/Rinst1cc0231a6b37/my_pkg'
-----------------------------------
ERROR: package installation failed
你可能是對的,這是小插圖的問題。 (但當然我不能 100% 確定,因為我不知道你的文件)
關於您對check()
和install()
運行的困惑:
RStudio 的“構建和重新加載不會構建小插曲
這就是為什么您可能必須運行 devtools::install() 才能獲得錯誤。
我會向您發布一些最有可能與小插圖有關的問題(這里也是一個很好的更長的教程):
首先檢查以下幾點:
該目錄稱為小插圖/而不是小插圖/。
檢查 .Rbuildignore 未涵蓋小插圖
確保你有必要的小插圖元數據(你從第一眼看就很好)
很可能這些東西對你來說沒問題(但只是為了檢查)。
在我看來,最可能的問題是,您的說明文件不包含 .Rmd 小插圖的所有必要依賴項
也最好寫:
VignetteBuilder: knitr, rmarkdown
仍然在建議中另外保留 rmarkdown。 也 knitr 到 Suggests 和 VignetteBuilder。
更重要的是(!)您還需要在Suggests
的 .Rmd 文件中使用的包。 由於我假設您使用的是 RMarkdown,因此您的小插圖中有一些代碼。 瀏覽您的代碼並查看您正在使用哪些包。 小插圖使用的任何包都應在DESCRIPTION
聲明。
我可以想象這也可能是原因,為什么它似乎工作一次,然后在沒有改變任何東西(在你看來)之后它失敗了。
當它工作時,您是否仍然在后台加載了所有必需的包。 因此它不會產生影響,即Suggests
中缺少軟件包。
這將是我的第一個猜測,可能是什么問題。 如果這不起作用,我會嘗試刪除小插圖,看看是否是某個小插圖導致了問題。
截至目前,尚未發布解決名義錯誤的答案。 我發布此消息是為了向遇到相同錯誤的任何用戶澄清,該錯誤仍未得到診斷和解決。 事實上,即使在通過 Git 重置我的項目並從頭開始重新安裝 R(以及 Rtools 和 RStudio)后,該錯誤仍然存在。
感謝@SteffenMoritz和@Alexis頑強的調試會話。 雖然我們的努力沒有成功,但我感謝他們的時間、努力和友好。 任何在類似問題上掙扎的人都會很好地遵循他們的建議,在答案和評論中找到。
我會用我將來可能遇到的任何真正的解決方案來更新這篇文章。
在我的情況下解決它的方法是從%\VignetteEngine{knitr::rmarkdown}
切換到%\VignetteEngine{knitr::knitr}
。 我不知道為什么,但它停止了錯誤並放回rmarkdown
而不是knitr
重現了錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.