Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bazel select在ctx.file中失败_Bazel - Fatal编程技术网

Bazel select在ctx.file中失败

Bazel select在ctx.file中失败,bazel,Bazel,我试图根据运行bazel的操作系统来指定构建条件,因此在.bzl脚本中,我有一个规则,可以从外部源生成所有Simlink,并编写一个构建文件(使用ctx.file),在该文件中声明所有导入和库,并在其中添加select函数。但是,当我构建时,会收到以下错误消息: ERROR: no such package '@maya_repo//': Traceback (most recent call last): File "/var/tmp/doNotRemove/mdilena_p

我试图根据运行bazel的操作系统来指定构建条件,因此在.bzl脚本中,我有一个规则,可以从外部源生成所有Simlink,并编写一个构建文件(使用ctx.file),在该文件中声明所有导入和库,并在其中添加select函数。但是,当我构建时,会收到以下错误消息:

ERROR: no such package '@maya_repo//': Traceback (most recent call last):
        File "/var/tmp/doNotRemove/mdilena_plugins/MayaMathNodes/src/maya.bzl", line 149
                ctx.file("BUILD", _BUILD_STRUC.format(maya_...))
        File "/var/tmp/doNotRemove/mdilena_plugins/MayaMathNodes/src/maya.bzl", line 149, in ctx.file
                _BUILD_STRUC.format(maya_dir = maya_dir)
Invalid character '[' inside replacement field
下面是我的代码示例,以及我试图实现的目标:

_BUILD_STRUC = \
"""
# Windows imports
cc_import(
    name = "Foundation-win",
    interface_library = "{maya_dir}/lib/Foundation.lib",
    shared_library = "{maya_dir}/bin/Foundation.dll",
)

cc_import(
    name = "OpenMaya-win",
    interface_library = "{maya_dir}/lib/OpenMaya.lib",
    shared_library = "{maya_dir}/bin/OpenMaya.dll",
)

# Linux imports
cc_import(
    name = "Foundation-lnx",
    shared_library = "{maya_dir}/bin/Foundation.so",
)

cc_import(
    name = "OpenMaya-lnx",
    shared_library = "{maya_dir}/bin/OpenMaya.so",
)

cc_library(
    name = "Foundation",
    deps = select({
        "@bazel_tools//src/conditions:windows": [":Foundation-win"],
        "//conditions:default": [":Foundation-lnx"],
        }),
    includes = ["{maya_dir}/include"],
    visibility = ["//visibility:public"],
)

cc_library(
    name = "OpenMaya",
    deps = select({
        "@bazel_tools//src/conditions:windows": [":OpenMaya-win"],
        "//conditions:default": [":OpenMaya-lnx"],
        }),
    includes = ["{maya_dir}/include"],
    visibility = ["//visibility:public"],
)
"""

def _impl(ctx):
    maya_src = ctx.os.environ["MAYA_LOCATION"]
    maya_ver = ctx.os.environ["MAYA_VERSION"]
    maya_dir = "maya{}".format(maya_ver)
    ctx.symlink(maya_src, maya_dir)
    ctx.file("BUILD", _BUILD_STRUC.format(maya_dir=maya_dir))


link_maya = repository_rule(
    implementation = _impl,
    local = True,
    environ = ["MAYA_LOCATION"],
)
有人知道为什么会这样吗?我看了一下和文档,似乎这就是使用它的方式;我不知道是我做错了什么,还是某个地方有个bug

谢谢你的帮助

编辑:

看起来Bazel真的不喜欢在ctx.file中使用select, 我会把这个问题留待讨论,以防万一有人能提出一些问题 打开它。与此同时,我通过制作所有的
cc\u导入
并包括关联回购协议中的公众,同时保留所有
cc_库
使用
选择
到我的插件的构建文件;从那里我很高兴 能够使用条件和构建的所有内容


看起来错误来自这一行,特别是对的调用

string.format
在模板字符串中搜索大括号,如
{}
{key}
,并用位置参数或关键字参数替换它们

您看到此错误是因为
string.format
将模板中
select
的dict参数误认为是要替换的对象,因为它以大括号开头。通过将大括号加倍来转义模板字符串中的大括号可以解决此问题:

_BUILD_STRUC = \
"""
...
cc_library(
    name = "Foundation",
    deps = select({{
        "@bazel_tools//src/conditions:windows": [":Foundation-win"],
        "//conditions:default": [":Foundation-lnx"],
        }}),
    includes = ["{maya_dir}/include"],
    visibility = ["//visibility:public"],
)
...

仅供参考,您可能会发现更容易合作。它的语义稍有不同:它逐字替换字符串,而不查找像
{
,因此不需要转义。

太好了,非常感谢!我完全忘记了我使用的是格式,不得不转义字典!
_BUILD_STRUC = \
"""
...
cc_library(
    name = "Foundation",
    deps = select({{
        "@bazel_tools//src/conditions:windows": [":Foundation-win"],
        "//conditions:default": [":Foundation-lnx"],
        }}),
    includes = ["{maya_dir}/include"],
    visibility = ["//visibility:public"],
)
...