我正在编写包管理器,为此我希望依赖解析尽可能强大.
每个包都有一个版本列表,每个版本包含以下信息:
对于当前状态,我有一个包列表及其当前版本.
我现在想,在给定可用包列表和当前状态的情况下,能够在包列表中获取每个包的版本,考虑给定的约束(依赖性,冲突包,其他包提供的包)和获取每个软件包的版本列表.循环依赖是可能的.
如果无法达到有效状态,则可以更改现有软件包的版本,但这只应在必要时进行.如果无法获得有效状态,应尽可能多地获取原因信息(告诉用户"如果删除X则可以正常工作"等).
如果可能,还应该可以将软件包"锁定"到特定版本,在这种情况下,软件包的版本可能不会更改.
我想要完成的工作与现有的包管理器已经完成的工作非常相似,区别在于不一定需要使用最新版本的包(大多数包管理器似乎都在做的假设).
到目前为止,我唯一的想法是为所有可能版本的包构建所有可能状态的结构,然后删除无效状态.我真的希望这不是唯一的解决方案,因为它感觉非常"蛮力" - 非常.保持在几秒钟内可以获得~500个可用的包,每个包含约100个版本,并且~150个已安装的包将是一个很好的目标(尽管越快越好).
我不相信这是一个特定于语言的问题,但为了更好地说明它,这里有一些pseudecode:
struct Version
integer id
list<Package, set<integer>> dependencies
list<Package, set<integer>> conflicts
list<Package, set<integer>> provides
struct Package
string id
list<Version> versions
struct State
map<Package, Version> packages
map<Package, boolean> isVersionLocked
State resolve(State initialState, list<Package> availablePackages, list<Package> newPackages)
{
// do stuff here
}
Run Code Online (Sandbox Code Playgroud)
(如果你应该有实际的代码或者知道某些事情的现有实现(使用任何语言,C++首选),请随时提及它)
对于C++ 14中的成员检测,我在这里使用了基于示例的代码,但它似乎没有用.
一个完整的例子:
#include <string>
template <typename...>
using void_t = void;
template <typename, typename = void> class HasMember_substr : public std::false_type {};
template <typename T> class HasMember_substr<T, void_t<typename T::substr>> : public std::true_type {};
template <typename, typename = void> class HasMember_fff : public std::false_type {};
template <typename T> class HasMember_fff<T, void_t<typename T::fff>> : public std::true_type {};
static_assert(HasMember_substr<std::string>::value, "");
static_assert(!HasMember_fff<std::string>::value, "");
int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)
使用编译clang++ --std=c++14 test.cpp在OS X上,编译器版本(clang++ --version):Apple LLVM version 7.0.2 …
我的nginx.conf中包含以下内容:
location / {
auth_request /auth;
add_header Content-Type text/plain;
return 200 'You are in!';
}
location = /auth {
proxy_pass http://localhost:5021/auth;
proxy_pass_request_body off;
proxy_set_header Host $http_host;
proxy_set_header X-Original-URI $request_uri;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Authorization $http_authorization;
proxy_pass_header Authorization;
}
Run Code Online (Sandbox Code Playgroud)
因此,我希望http://localhost:5021/auth在尝试到达时可以访问(一个Flask应用)/。这不会发生,并且使用nginx-debug二进制文件,并且error_log /var/log/nginx/error.log debug;我从没看到期望看到的任何调试输出(请求的日志在此处)。没有错误,没有打印到控制台,也没有任何nginx的日志文件。似乎auth_request只是默默地忽略了该行。
nginx-debug -V(确实包含--with-http_auth_request_module)的输出:
nginx version: nginx/1.15.8
built by gcc 6.4.0 (Alpine 6.4.0)
built with OpenSSL 1.0.2q 20 …Run Code Online (Sandbox Code Playgroud) 我有一个简单的 .dot 文件(graphviz),如下所示:
digraph Mapper{
Mapper [label=Mapper];
General [label=General];
GeneralNew [label=New];
GeneralOpen [label=Open];
GeneralSave [label=Save];
GeneralClose [label=Close];
GeneralSettings [label=Settings];
GeneralHelp [label=Help];
GeneralAbout [label=About];
GeneralNewLoad [label="Load symbol set"];
GeneralNewLoadFile [label="Load symbol set from file"];
GeneralNewNoLoad [label="Don't load symbols"];
GeneralOpenFiles [label="OCD|OMAP", shape=record];
GeneralOpenRecent [label="Open recent"];
GeneralSaveFiles [label="OMAP|MapperXML", shape=record];
GeneralHelpStartup [label="Startup tips"];
GeneralHelpHTML [label="HTML Help"];
GeneralHelpWhatsThis [label="What's this?"];
General -> GeneralNew;
General -> GeneralOpen;
General -> GeneralSave;
General -> GeneralClose;
General -> GeneralSettings;
General -> GeneralHelp;
General -> GeneralAbout;
GeneralNew -> GeneralNewLoad;
GeneralNew …Run Code Online (Sandbox Code Playgroud) 我现在已经使用 Flex/Bison 工作了大约 6 个小时,这是我无法解决的第一个问题:
我有以下文件...
state state1: {
1-3: 255
4: 255
}
Run Code Online (Sandbox Code Playgroud)
...我使用 cat 和 | 将其传递给我的 flex/bison 程序。Flex 文件包含这一行:
\bstate\b { return STATE; }
Run Code Online (Sandbox Code Playgroud)
再往下看这一点:
.* { fprintf(stderr, "Lexer error on line %d: \"%s\"\n", linenum, yytext); exit(-1); }
Run Code Online (Sandbox Code Playgroud)
人们应该认为 \bstate\b 应该在文件中匹配,但事实并非如此。相反,我得到以下输出:
"exer error on line 1: "state state1: {
Run Code Online (Sandbox Code Playgroud)
这在几个方面都很奇怪。首先,Lexer 中的 L 接缝已被“替换”,但更重要的是,状态没有匹配。为什么???
当然,\bstate\b 位于 .* 之前,并且它们位于正确的部分。
谢谢你的帮助,简