使用 .Rbuildignore 排除 R 文件夹的 R 文件
Exclude R files for R folder with .Rbuildignore
有些文件包含正在进行的工作,我想从整个构建过程中排除(检查、安装,如果可能的话甚至记录),但不加载 (devtools::load_all()
)。
我总是将它们命名为 dev-{feature}.R
所以我正要使用通配符,但碰巧我什至无法从构建中排除单个文件。
为了调试,我创建了一个名为“R/dev-myfeature.R”的 R 文件,仅包含行 stop("TEST")
。然后我 运行 usethis::use_build_ignore("R/dev-myfeature.R")
,它在 .Rbuildignore
文件中添加了 ^R/dev-myfeature\.R$
。
无论我是 运行 devtools::load_all(".")
、devtools::check()
还是 devtools::document()
,我都会得到 TEST
错误,所以 .Rbuildignore
被忽略了。由于它适用于所有其他文件,我猜它在 R
文件夹中没有任何功能。
有什么办法可以解决这个限制吗?
否则,对于不应该成为构建的一部分的正在进行的文件,什么是好的工作流程?
我认为 .Rbuildignore
文件对于打包您的包很有用,仅此而已。如果您想要 R/*.R
文件中的某些功能,但只在您的控制台上进行测试,那么您可以考虑使用包装 if
表达式来构建测试文件。
例如,我将存在和true-ness一个名为MYDEV
的变量来声明我要加载文件的内容。
if (exists("MYDEV") && MYDEV) {
stop("TEST")
}
在默认环境中(MYDEV
未定义),load_all
、check
和 document
看不到错误。使用 exists(...)
有助于确保这不会在不同的 R 实例中出错 (object not found
),无论是在您的计算机上还是在其他地方。
如果您设置 MYDEV <- TRUE
,那么所有 devtools
函数都会看到 stop
并相应地出错。我相信没有(合理的)方法可以使用 document
.
获取 load_all
和 not 中的代码
not 错误与 devtools::document
的一个问题是它在内部调用 devtools::load_all
,因为这样的简单测试不起作用。可以改编 中的函数:
search_calling_pkg <- function(pkgs, funcs) {
# <borrowed from="rlang::trace_back">
frames <- sys.frames()
idx <- rlang:::trace_find_bottom(NULL, frames)
frames <- frames[idx]
parents <- sys.parents()[idx]
calls <- as.list(sys.calls()[idx])
calls <- purrr::map(calls, rlang:::call_fix_car)
#==# calls <- lapply(calls, rlang:::call_fix_car)
calls <- rlang:::add_pipe_pointer(calls, frames)
calls <- purrr::map2(calls, seq_along(calls), rlang:::maybe_add_namespace)
#==# calls <- Map(rlang:::maybe_add_namespace, calls, seq_along(calls))
# </borrowed>
calls_chr <- vapply(calls, function(cl) as.character(cl)[1], character(1))
ptn <- paste0("^(", paste(pkgs, collapse = "|"), ")::")
pkgres <- any(grepl(ptn, calls_chr))
funcres <- !missing(funcs) && length(calls_chr) &&
any(mapply(grepl, paste0("(^|::)", funcs, "$"), list(calls_chr)))
return(pkgres && funcres)
}
如果找到任何 package/function 对,此函数 returns 为真,并且此组合将“看到”(错误) stop("TEST")
与 devtools::load_all
但不是devtools::document
:
if (search_calling_pkg("pkgload", "load_all") &&
!search_calling_pkg("devtools", "document")) {
stop("TEST")
}
是的,这意味着您需要 search_calling_pkg
在您的环境中的某处,无论是否是此包的一部分。回想一下,如果 .Rbuildignore
文件包含 R/dev-myfeature.R
,那么软件包和所有 down-stream 用户将永远不会看到此代码。如果您想更加防御,可以使用
if (exists("search_calling_pkg") &&
search_calling_pkg("pkgload", "load_all") &&
!search_calling_pkg("devtools", "document")) {
stop("TEST")
}
有些文件包含正在进行的工作,我想从整个构建过程中排除(检查、安装,如果可能的话甚至记录),但不加载 (devtools::load_all()
)。
我总是将它们命名为 dev-{feature}.R
所以我正要使用通配符,但碰巧我什至无法从构建中排除单个文件。
为了调试,我创建了一个名为“R/dev-myfeature.R”的 R 文件,仅包含行 stop("TEST")
。然后我 运行 usethis::use_build_ignore("R/dev-myfeature.R")
,它在 .Rbuildignore
文件中添加了 ^R/dev-myfeature\.R$
。
无论我是 运行 devtools::load_all(".")
、devtools::check()
还是 devtools::document()
,我都会得到 TEST
错误,所以 .Rbuildignore
被忽略了。由于它适用于所有其他文件,我猜它在 R
文件夹中没有任何功能。
有什么办法可以解决这个限制吗?
否则,对于不应该成为构建的一部分的正在进行的文件,什么是好的工作流程?
我认为 .Rbuildignore
文件对于打包您的包很有用,仅此而已。如果您想要 R/*.R
文件中的某些功能,但只在您的控制台上进行测试,那么您可以考虑使用包装 if
表达式来构建测试文件。
例如,我将存在和true-ness一个名为MYDEV
的变量来声明我要加载文件的内容。
if (exists("MYDEV") && MYDEV) {
stop("TEST")
}
在默认环境中(MYDEV
未定义),load_all
、check
和 document
看不到错误。使用 exists(...)
有助于确保这不会在不同的 R 实例中出错 (object not found
),无论是在您的计算机上还是在其他地方。
如果您设置 MYDEV <- TRUE
,那么所有 devtools
函数都会看到 stop
并相应地出错。我相信没有(合理的)方法可以使用 document
.
load_all
和 not 中的代码
not 错误与 devtools::document
的一个问题是它在内部调用 devtools::load_all
,因为这样的简单测试不起作用。可以改编
search_calling_pkg <- function(pkgs, funcs) {
# <borrowed from="rlang::trace_back">
frames <- sys.frames()
idx <- rlang:::trace_find_bottom(NULL, frames)
frames <- frames[idx]
parents <- sys.parents()[idx]
calls <- as.list(sys.calls()[idx])
calls <- purrr::map(calls, rlang:::call_fix_car)
#==# calls <- lapply(calls, rlang:::call_fix_car)
calls <- rlang:::add_pipe_pointer(calls, frames)
calls <- purrr::map2(calls, seq_along(calls), rlang:::maybe_add_namespace)
#==# calls <- Map(rlang:::maybe_add_namespace, calls, seq_along(calls))
# </borrowed>
calls_chr <- vapply(calls, function(cl) as.character(cl)[1], character(1))
ptn <- paste0("^(", paste(pkgs, collapse = "|"), ")::")
pkgres <- any(grepl(ptn, calls_chr))
funcres <- !missing(funcs) && length(calls_chr) &&
any(mapply(grepl, paste0("(^|::)", funcs, "$"), list(calls_chr)))
return(pkgres && funcres)
}
如果找到任何 package/function 对,此函数 returns 为真,并且此组合将“看到”(错误) stop("TEST")
与 devtools::load_all
但不是devtools::document
:
if (search_calling_pkg("pkgload", "load_all") &&
!search_calling_pkg("devtools", "document")) {
stop("TEST")
}
是的,这意味着您需要 search_calling_pkg
在您的环境中的某处,无论是否是此包的一部分。回想一下,如果 .Rbuildignore
文件包含 R/dev-myfeature.R
,那么软件包和所有 down-stream 用户将永远不会看到此代码。如果您想更加防御,可以使用
if (exists("search_calling_pkg") &&
search_calling_pkg("pkgload", "load_all") &&
!search_calling_pkg("devtools", "document")) {
stop("TEST")
}