예제 #1
0
    def test_parse(self):
        folder = temp_folder()
        path = os.path.join(folder, "conanws.yml")
        project = "root: Hellob/0.1@lasote/stable"
        save(path, project)
        with six.assertRaisesRegex(self, ConanException,
                                   "Root Hellob/0.1@lasote/stable is not defined as editable"):
            Workspace(path, None)

        project = dedent("""
            editables:
                HelloB/0.1@lasote/stable:
                    path: B
                    random: something
            root: HelloB/0.1@lasote/stable
            """)
        save(path, project)

        with six.assertRaisesRegex(self, ConanException,
                                   "Workspace unrecognized fields: {'random': 'something'}"):
            Workspace(path, None)

        project = dedent("""
            editables:
                HelloB/0.1@lasote/stable:
                    path: B
            root: HelloB/0.1@lasote/stable
            random: something
            """)
        save(path, project)

        with six.assertRaisesRegex(self, ConanException,
                                   "Workspace unrecognized fields: {'random': 'something'}"):
            Workspace(path, None)

        project = dedent("""
            editables:
                HelloB/0.1@lasote/stable:
            root: HelloB/0.1@lasote/stable
            """)
        save(path, project)

        with six.assertRaisesRegex(self, ConanException,
                                   "Workspace editable HelloB/0.1@lasote/stable "
                                   "does not define path"):
            Workspace(path, None)

        project = dedent("""
            editables:
                HelloB/0.1@lasote/stable:
                    layout: layout
            root: HelloB/0.1@lasote/stable
            """)
        save(path, project)

        with six.assertRaisesRegex(self, ConanException,
                                   "Workspace editable HelloB/0.1@lasote/stable "
                                   "does not define path"):
            Workspace(path, None)
def workspace_install(self,
                      path,
                      settings=None,
                      options=None,
                      env=None,
                      remote_name=None,
                      build=None,
                      profile_name=None,
                      update=False,
                      cwd=None,
                      install_folder=None):
    cwd = cwd or get_cwd()
    abs_path = os.path.normpath(os.path.join(cwd, path))

    remotes = self.app.load_remotes(remote_name=remote_name, update=update)
    # remotes = self.app.cache.registry.load_remotes()
    # remotes.select(remote_name)
    # self.app.python_requires.enable_remotes(update=update, remotes=remotes)

    workspace = Workspace(abs_path, self.app.cache)
    graph_info = get_graph_info(profile_name, settings, options, env, cwd,
                                None, self.app.cache, self.app.out)

    self.app.out.info("Configuration:")
    self.app.out.writeln(graph_info.profile_host.dumps())

    self.app.cache.editable_packages.override(workspace.get_editable_dict())

    recorder = ActionRecorder()
    deps_graph = self.app.graph_manager.load_graph(workspace.root, None,
                                                   graph_info, build, False,
                                                   update, remotes, recorder)

    print_graph(deps_graph, self.app.out)

    # Inject the generators before installing
    for node in deps_graph.nodes:
        if node.recipe == RECIPE_EDITABLE:
            generators = workspace[node.ref].generators
            if generators is not None:
                tmp = list(node.conanfile.generators)
                tmp.extend([g for g in generators if g not in tmp])
                node.conanfile.generators = tmp

    installer = BinaryInstaller(self.app, recorder)
    installer.install(deps_graph,
                      remotes,
                      build,
                      update,
                      keep_build=False,
                      graph_info=graph_info)

    install_folder = install_folder or cwd
    workspace.generate(install_folder, deps_graph, self.app.out)

    workspace.build(install_folder, deps_graph, self.app.out, self.app)
예제 #3
0
파일: conan_api.py 프로젝트: zhuhaow/conan
    def install(self, path="", settings=None, options=None, env=None,
                remote_name=None, verify=None, manifests=None,
                manifests_interactive=None, build=None, profile_name=None,
                update=False, generators=None, no_imports=False, install_folder=None, cwd=None):

        try:
            recorder = ActionRecorder()
            cwd = cwd or os.getcwd()
            manifests = _parse_manifests_arguments(verify, manifests, manifests_interactive, cwd)
            manifest_folder, manifest_interactive, manifest_verify = manifests

            profile = profile_from_args(profile_name, settings, options, env, cwd,
                                        self._client_cache)

            wspath = _make_abs_path(path, cwd)
            if install_folder:
                if os.path.isabs(install_folder):
                    wsinstall_folder = install_folder
                else:
                    wsinstall_folder = os.path.join(cwd, install_folder)
            else:
                wsinstall_folder = None
            workspace = Workspace.get_workspace(wspath, wsinstall_folder)
            if workspace:
                self._user_io.out.success("Using conanws.yml file from %s" % workspace._base_folder)
                manager = self._init_manager(recorder)
                manager.install_workspace(profile, workspace, remote_name, build, update)
                return

            install_folder = _make_abs_path(install_folder, cwd)
            conanfile_path = _get_conanfile_path(path, cwd, py=None)
            manager = self._init_manager(recorder)
            manager.install(reference=conanfile_path,
                            install_folder=install_folder,
                            remote_name=remote_name,
                            profile=profile,
                            build_modes=build,
                            update=update,
                            manifest_folder=manifest_folder,
                            manifest_verify=manifest_verify,
                            manifest_interactive=manifest_interactive,
                            generators=generators,
                            no_imports=no_imports)
            return recorder.get_info()
        except ConanException as exc:
            recorder.error = True
            exc.info = recorder.get_info()
            raise