小编Tom*_*ver的帖子

Hg子存储库依赖项

过去(这里这里)有关于Hg子回购依赖关系的几个问题但是接受的答案似乎并没有解决我的问题.

我的一个项目有4个依赖项:A,B,C,D.D依赖于A,B和C; 而B和C依赖于A:

A,B,C,D的依赖图

我想使用Hg子存储库来存储它们,以便我可以跟踪它们所依赖的每个版本.这是因为,当我用A,B,C和d在这个项目,其他项目将需要的只是A和B.因此,B和C必须独立于D来跟踪它们所需的A版本.同时,在我的应用程序中,给定版本的D引用的B和C版本必须始终使用与A引用的版本相同的A版本.给定版本的D(否则它将在运行时崩溃).我真正想要的是允许他们在同一目录中作为兄弟姐妹互相引用 - 即D's .hgsub看起来像下面这样,而B和C看起来就像是第一行.

..\A = https:(central kiln repo)\A
..\B = https:(central kiln repo)\B
..\C = https:(central kiln repo)\C
Run Code Online (Sandbox Code Playgroud)

然而,这似乎不起作用:我可以看到为什么(给人们足够的绳索让自己挂起来很容易),但我觉得它是我的依赖关系的最佳解决方案,这是一种耻辱.我已经阅读了一些建议的解决方案,我会快速概述这些解决方案以及它们为什么不能为我工作:

  1. 将副本包含为嵌套子目录,将这些副本引用为Hg子存储库.这会产生以下目录结构(我删除了A,B,C,B\A,C\A的主副本,因为我可以接受引用\ D中的副本):

    • project \(所有主要项目文件)
    • 项目\ d
    • 项目\ d\A
    • 项目\ d \乙
    • 项目\ d\B \一
    • 项目\ d\C
    • 项目\ d\C\A

    这种方法的问题:

    • 我现在在磁盘上有3个A副本,所有这些副本都可以进行独立修改,在推送到中央仓库之前必须同步并合并.
    • 我必须使用其他机制来确保B,C和D引用相同版本的A(例如D可以使用v1而D\B可以使用v2)
  2. 变体:使用上面但指定.hgsub的RHS指向父副本中的副本(即B和C应该具有下面的.hgsub):

    A = ..\A
    
    Run Code Online (Sandbox Code Playgroud)

    这种方法的问题:

    • 我仍然在磁盘上有三个副本
    • 第一次克隆B或C时,它将尝试递归地从"..\A"中提取A的引用版本,这可能不存在,可能会导致错误.如果它不存在,则不知道应该找到回购的位置.
    • 当我进行递归推送更改时,D\B\A中的更改不会进入共享的中央存储库; 他们只是被推到D\A而不是.因此,如果我连续两次推送,我可以保证所有更改都会正确传播,但这是一个相当的软糖.
    • 类似地,如果我做(手动)递归拉动,我必须得到正确的顺序以获得最新的更改(即在我拉D\B\A之前拉D\A)
  3. 使用符号链接将文件夹\ D\B\A指向D\A等.

    这种方法的问题:

    • 符号链接无法在Hg repo本身中进行编码,因此每次团队成员克隆回购时,他们都必须手动/使用脚本重新创建符号链接.这可能是可以接受的,但我更喜欢更好的解决方案.另外(个人喜好)我发现符号链接非常不直观.

这些是最好的解决方案吗?我的初始.hgsub(见上)是一个梦想有没有一个很好的理由,还是有办法我可以请求/实现这个改变?

更新以更好地解释A,B,C,D的更广泛使用

mercurial dependencies subrepos

19
推荐指数
2
解决办法
3798
查看次数

这个定义语法宏在方案中有什么问题?

我正在为SICP工作,并希望尝试一些诡计的例子.我正在尝试流示例,并想要一个cons-stream的实现,我从这个StackOverflow问题得到了.然而当我把它打成诡计时,我得到:

guile> (define-syntax cons-stream
  (syntax-rules ()
  [(cons-stream x y) (cons x (delay y))]))
ERROR: invalid syntax ()
ABORT: (misc-error)
Run Code Online (Sandbox Code Playgroud)

我不知道这有什么问题 - 我尝试用'()替换(),删除[],但它仍然不起作用,即使它似乎是有效的R5RS.我目前正在使用guile 1.8.7,我看不到GNU文档提到的v2.0.1的包,这可能就是为什么它不能为我工作?

macros scheme guile define-syntax

5
推荐指数
1
解决办法
920
查看次数

为什么Go方法不能接收类型是接口?

关于方法声明Go文档:

接收器类型必须是T或*T形式,其中T是类型名称.T称为接收器基类型或仅基类型.基类型不能是指针或接口类型,必须在与方法相同的包中声明.

任何人都可以给我一些有关为什么会这样的见解?是否有其他(静态类型)语言允许这样做?我真的想在接口上定义方法,所以我可以将给定接口类型的任何实例视为另一个.例如(如果以下内容有效,则从模板方法模式维基百科文章中窃取示例):

type Game interface {
    PlayOneGame(playersCount int)
}

type GameImplementation interface {
    InitializeGame()
    MakePlay(player int)
    EndOfGame() bool
    PrintWinner()
}

func (game *GameImplementation) PlayOneGame(playersCount int) {
    game.InitializeGame()
    for j := 0; !game.EndOfGame(); j = (j + 1) % playersCount {
        game.MakePlay(j)
    }
    game.PrintWinner()
}
Run Code Online (Sandbox Code Playgroud)

我可以使用任何实现"GameImplementation"的实例作为"游戏"而无需任何转换:

var newGame Game
newGame = NewMonopolyGame() // implements GameImplementation
newGame.PlayOneGame(2)
Run Code Online (Sandbox Code Playgroud)

更新:这样做的目的是尝试实现抽象基类的所有好处,而不需要与显式层次结构相关的所有耦合.如果我想定义一个新的行为PlayBestOfThreeGames,抽象基类将要求我更改基类本身 - 而在这里我只是在GameImplementation接口之上定义一个更多的方法

methods syntax interface go

5
推荐指数
1
解决办法
454
查看次数

IndexedDB:使用promises升级?

刚刚开始我的第一个使用IndexedDb的项目,我很难在第一次使用时创建一个用于打开和升级数据库的系统.我想使用promises(当前的angularJs$q服务,但我很灵活)给我一些关于捕获任何错误的保证,并减少关于失败模式的心理开销推理.我的要求是:

  • 使用者调用某些函数来打开和升级返回promise的数据库
  • 该功能按顺序执行所有必需的升级/迁移.如果没有发生错误,则通过与数据库的连接解决promise
  • 如果在任何阶段发生任何错误,则保证拒绝承诺错误
  • 添加新的迁移/升级步骤就像定义执行升级的功能一样简单,所有其他并发问题都由"框架"处理.

到目前为止我遇到的问题:

  • onupgraderequired如果DB不需要升级(这样一个承诺,得到了在升级完成解决将永远不会得到解决,如果DB不需要升级回调不叫,并调用代码不知道这是否会是这样接线回调时)
  • 如果一次升级依赖于另一次升级(例如,填充刚创建的商店),则必须等到其onsuccess回调被调用 - 因此每次升级都需要顺序链接
  • 看来,在链中的前任解决之后执行的承诺的延迟足以在再次需要之前将"事务"标记为非活动状态(我认为它们被安排为'nextTick',这可能是相同的机制这使交易失效).
  • 更新如果一个升级依赖于另一个升级,则在onsuccess调用第一个回调时,该versionchange事务不再处于活动状态.

我目前的结论是,API基本上对基于承诺的方法持敌对态度.我最好的尝试在下面(简化了一点以便于阅读).我哪里错了?

var newPromise = function(withDeferred) {
    var deferred = $q.defer();
    try {
        withDeferred(deferred);
    } catch (err) {
        deferred.reject(err); 
    }
    return deferred.promise;
};

var newTransactionPromise = function(getTransaction) {
    return newPromise(function(deferred) {
        var transaction = getTransaction();

        transaction.oncomplete = function(ev) { deferred.resolve(); };
        transaction.onabort = function(ev) { deferred.reject(transaction.error); };
    });
};

var migrations = [
    function(db) {
        return newTransactionPromise(function() …
Run Code Online (Sandbox Code Playgroud)

javascript promise indexeddb

5
推荐指数
1
解决办法
3633
查看次数