int _main()

in include/poac/subcmd/install.hpp [212:307]


        int _main(VS&& argv) {
            namespace fs = boost::filesystem;
            namespace exception = core::exception;
            namespace path = io::file::path;
            namespace yaml = io::file::yaml;
            namespace cli = io::cli;
            namespace resolver = core::resolver;


            fs::create_directories(path::poac_cache_dir);
            auto node = yaml::load_config();
            std::string timestamp = yaml::get_timestamp();
            const bool quite = util::argparse::use_rm(argv, "-q", "--quite");
            const bool verbose = util::argparse::use_rm(argv, "-v", "--verbose") && !quite;

            // load lock file
            resolver::Resolved resolved_deps{};
            bool load_lock = false;
            if (argv.empty()) { // 引数からの指定の時,lockファイルを無視する
                if (const auto locked_deps = core::lock::load(timestamp)) {
                    resolved_deps = *locked_deps;
                    load_lock = true;
                }
            }

            // resolve package
            if (!quite) {
                cli::echo(cli::to_status("Resolving packages..."));
            }
            resolver::Deps deps;
            if (!argv.empty()) {
                for (const auto& v : argv) {
                    deps.push_back(parse_arg_package(v));
                }
            }
            if (!load_lock) {
                if (const auto deps_node = yaml::get<std::map<std::string, YAML::Node>>(node, "deps")) {
                    const auto resolved_packages = resolve_packages(*deps_node);
                    deps.insert(deps.end(), resolved_packages.begin(), resolved_packages.end());
                }
                else if (argv.empty()) { // 引数から指定しておらず(poac install),poac.ymlにdeps keyが存在しない
                    throw exception::error(
                            "Required key `deps` does not exist in poac.yml.\n"
                            "Please refer to https://docs.poac.io");
                }
            }

            // resolve dependency
            if (!quite) {
                cli::echo(cli::to_status("Resolving dependencies..."));
            }
            if (!load_lock) {
                resolved_deps = resolver::resolve(deps);
            }

            // download packages
            if (!quite) {
                cli::echo(cli::to_status("Fetching..."));
                cli::echo();
            }
            fs::create_directories(path::current_deps_dir);
            fetch_packages(resolved_deps.backtracked, quite, verbose);
            if (!quite) {
                cli::echo();
                cli::echo(cli::status_done());
            }

            // Rewrite poac.yml
            bool fix_yml = false;
            for (const auto& d : deps) {
                if (d.interval == "latest") {
                    node["deps"][d.name] = convert_to_interval(resolved_deps.backtracked[d.name].version);
                    fix_yml = true;
                }
            }
            if (!argv.empty()) {
                fix_yml = true;
                for (const auto& d : deps) {
                    if (d.interval != "latest") {
                        node["deps"][d.name] = d.interval;
                    }
                }
            }
            if (fix_yml) {
                if (std::ofstream ofs("poac.yml"); ofs) {
                    ofs << node;
                }
                timestamp = yaml::get_timestamp();
            }

            if (!load_lock) {
                create_lock_file(timestamp, resolved_deps.activated);
            }

            return EXIT_SUCCESS;
        }