如何在我的项目中覆盖柯南共享选项?

How to overwrite conan shared option inside my project?

我有一个包含以下柯南食谱的项目:

from conans import ConanFile, CMake

class MyLibConan(ConanFile):
    name = "mylib"
    version = "1.16.0"
    generators = "cmake"
    settings = "os", "arch", "compiler", "build_type"
    options = {"shared": [True, False]}
    default_options = "shared=False"
    exports_sources = ["*"]
    url = "some-url"
    license = "my license"
    description = "my library"

    def build(self):
        cmake = CMake(self)
        cmake.configure()
        cmake.build()

    def package(self):
       # do some copying here

    def package_info(self):
        self.cpp_info.includedirs = ['include']
        self.cpp_info.libdirs = ['lib']
        self.cpp_info.libs = ['mylib']

这个库应该以静态模式构建。但是公司服务器将其构建为共享,而我的库测试失败,因为它们找不到 .lib 文件。

即使我将默认类型设置为静态,当服务器运行它的脚本时它也会被覆盖。我还从 options 中删除了 True 值,但随后整个脚本失败,因为 True 不是一个选项。

options = {"shared": [False]}

如何确保库始终以静态模式构建而服务器脚本不会失败?

显而易见的建议是修复您的服务器脚本,因为您的库可以构建为共享的和静态的。另一种可能性是更新您的服务器脚本以生成静态和共享,而不仅仅是一个选项。如果在您的公司中您需要维护内部脚本,我建议您改用 Conan Package Tools,您可以在其中定义一组要构建的配置。

但是,如果这不是一种可能的情况并且您确实需要解决方法,您仍然可以在 configure(self) 方法中强制执行您的包选项:

def configure(self):
    self.options.shared = False

它将覆盖构建时参数传递的任何值。此外,包 ID 将相同,因为您的包将始终是静态的。