2010-04-09 116 views
2

我建立了我的c#项目后,将一个dll文件放在一个特定的目录中后,我有一个后生成脚本。这个DLL保存在SVN中。我的问题是,有没有办法在构建我的项目时知道该dll没有更改,并且不知道是否将其复制到目录中,以便SVN不会修改副本?如何比较dll文件

回答

0

快速简单的方法是统计两个文件并比较它们的修改时间 - 如果目标目录中的DLL比您正在复制的DLL旧,则只复制该文件。

更健壮但速度更慢的方法是使用任意数量的diff程序来逐字节比较两个DLL。

0

除非我误解了你的问题,否则你不需要做任何事情。如果文件没有被修改,SVN知道这一点,不会提交。

编辑: 你已经澄清在回答蒂姆,你这样做是为了节省其他开发者的建设麻烦。这是错误的方式来做到这一点。不应该使用源代码控制来保存源代码的输出。相反,你应该:

  1. 得到持续集成处理您的树
  2. 发送所有输出从1至AA普通股
  3. 告诉所有的开发者把眼光放在这个份额,如果他们不想要建立的东西
+0

我看到一个红色的“!”每次我建立项目时在dll文件上。你的意思是即使它有这个红色的“!”标记,当我提交时,SVN不会提交dll文件? – queandans 2010-04-09 19:40:48

+0

一般来说,表示文件已被修改,所以这意味着你会得到一个新的副本签入。请记住,即使你建立完全相同的源,你会得到一个(稍微)不同的二进制文件每次(链接器时间戳,代码签名时间戳等)注意:如果是“红色!”你的意思是一个乌龟覆盖层记住,这些覆盖是不是100%准确。 – 2010-04-10 14:28:03

1

你为什么把你构建成svn的dll?

编辑

你应该找出一个更好的办法来做到这一点 - 就像有一个安装程序或FTP服务器的地方,开发人员可以得到您的DLL。将您的派生作品放入svn是一个非常糟糕的主意。特别糟糕。

+0

,因此同一公司的开发人员可以使用此dll构建插件,而无需获取所有源代码并构建它。 – queandans 2010-04-09 19:43:32

+3

这不是一个很好的做法。如果他们没有构建它,那么我会将构建/安装在不同的服务器上进行下载。源头控制应该是源头。属于svn的唯一二进制文件是不会改变的第三方文件。 – Tim 2010-04-09 19:56:00

+1

我同意蒂姆。在VCS中自动生成文件会给你带来各种痛苦,因为很难找出哪个二进制文件是“正确的”。当开发人员检查旧版本时,痛苦开始了,建立.dll并检查这个。现在VCS中没有任何迹象表明现在最新的.dll实际上是一个旧版本。 – Rudi 2010-04-10 15:08:53

0

SVN应该已经为你照顾好了。如果文件之间确实没有区别,并且您将其中一个替换为另一个,SVN将不会考虑将文件“修改”,即使它具有新的时间戳。 SVN保留了该文件的基本版本,并使用diff本身来查看哪些文件需要提交。所以你可以随时复制dll,SVN会照顾其余的。

0

试图无论如何承诺,看看SVN是否与你的图形界面一致。

如果它试图提交,那么无论构建文件是否每次都包含一些不同的信息(可能是时间戳或其他东西)。由于该文件不同,您可能希望实际提交。您可以检查您的编译选项以查看它是否包含某种时间戳记,但是如果找不到这样的选项,则很难判断dll的更改是否有意义,或者只是某些编译器元数据,

0

可以将二进制文件检入到subversion中。原因是下游用户(QA或用户)可能没有从源代码构建的环境。他们也对从源代码构建不感兴趣。

这里的问题是一个建筑管理问题 - 当你释放该DLL时,以及如果QA发现你的DLL有问题,你如何跟踪源代码。

时间戳不是一个可靠的方法。

为了达到这个目的,你需要在建筑物管理中有一些东西。在我的项目中,我们的构建脚本查找涉及的文件的最大修订版本号(请注意,这不是当前修订版本号,因为您应该可以在将来构建,但产生相同的结果)。然后它将这个数字戳到DLL的版本资源。在我们对结果满意后,我们通过手动将二进制文件拷贝到subversion中的文件夹并签入来释放它。

如果QA发现一个错误,我们总是可以回到构建DLL的状态(通过查找了解版本号)并找出问题所在。