1
16
我想我有个答案。这会有点复杂,但它可以让您不必做任何批处理文件。您可以依赖msbuild和自定义任务来完成此操作。我使用了msbuild的扩展包(可在 CodePlex )-但是你需要的第二个任务是你可以很容易地写自己的东西。 使用此解决方案,您可以右键单击该dll,并在文件属性中查看该dll(或exe)来自哪个Mercurial版本。 步骤如下:
获取Mercurial ID的自定义任务: (这需要很好地进行测试,也许更好地概括…)
修改后的项目文件: (评论可能有帮助)
最后一个注意事项:构建任务项目只需要构建一次。不要每次执行其余的解决方案时都尝试构建它。如果这样做,您将发现VS2008已锁定了DLL。还没弄清楚,但我认为最好的办法是按你想要的方式构建DLL,然后只将它与代码一起分发,确保DLL的位置相对于你需要在其中使用它的每个项目都是固定的。这样,就不用安装任何东西了。 祝你好运,希望这对你有所帮助! 奥迪 |
2
25
我刚刚发布了一个小型的开源msbuild任务,以完全满足您的需要:
|
3
5
是否考虑使用字符串资源而不是C语言字符串常量?字符串资源可以在生成后的输出二进制文件中使用用于本地化的工具进行编辑/替换。 您将把您的mercurial版本号发送到C build未使用的文本文件,然后使用后期生成操作将版本资源替换为所发送文本文件的实际值。如果对程序集进行强名称签名,则需要在签名之前进行资源字符串替换。 这就是我们多年前在Borland为Windows产品处理这个问题的方式。从那时起,世界变得更加复杂,但这一原则仍然适用。 |
4
2
我是我的。我有这个:
在我的源文件(Java)中,我这样做:
在提交$id$之后,它被扩展为:
|
5
2
我们用另一个源代码控制系统Subversion解决了这个问题。 我们要做的是,我们有一个commonassemblyinfo.cs文件,并使用一个msbuild脚本将SVN修订号插入该文件。 我们直接调用svninfo并从revision:part中获取输出,然后将其插入commonassemblyinfo.cs文件。 我们解决方案中的每个项目都有一个到公共文件的链接,然后进行编译,这意味着程序集在编译时使用SVN版本号进行版本控制,也意味着我们编写的所有依赖库也都进行了版本控制。 我们很容易使用CruiseControl.net和msbuild文件实现这一点。 我没有使用mercurial,但我相信您可以用id命令做类似的事情? 但是由于输出的格式不同,您需要了解如何使用它。 我将有一个标准的XML文件,在应用启动时读取,您可以将信息插入其中(也适用于resx文件)。然后您可以在代码中读取该值。有点恶心,但很管用。 我最喜欢的解决方案是我们这样做,但是你不能在Mercurial中这样做,因为变更集信息不是像SVN版本号那样纯数字的。 |
6
1
这个问题似乎有多种可能的解决方法。第一个可能也是首选的解决方案是安装一个构建服务器,并且只将在那里生成的构建分发给客户。这样做的好处是,您永远不会发送未提交的更改。通过使用msbuild、nant或其他基于任务的构建工具,整个过程非常灵活。我可以安装TeamCity,只需很少的努力就可以完成最初的两个构建和运行,但是也有其他好的构建服务器。这真的应该是你的解决方案。 如果出于某种原因,您坚持认为可以将开发人员构建分发给客户机;)那么您需要一个本地解决方案。 一个相当简单的解决方案是使用内置支持自动增加程序集的内部版本号:
这个
我最后的建议是只为hg id创建一个单独的项目,并使用后期构建步骤将生成的程序集合并为一个。ILmerge支持对已签名的程序集进行重新签名,因此这可能更容易工作。缺点是不允许重新分配ilmerge(尽管商业用途是)。 这不是一个解决方案,但希望能激励你前进。 |
7
1
我们在这里做的是:我们不会每次在开发人员的机器上构建项目时都嵌入修订。这最多会导致上面提到的问题,最糟糕的是,这会误导您,因为您可能已经修改了工作区中的文件。
相反,我们只在项目构建时嵌入源代码管理修订号。
TeamCity
在单独的生成服务器上。修订嵌入到两者中
默认情况下,版本以9999.9999结尾,我们将修订拆分为12345678版本将变为1234.5678版本(而不是说我们的版本接近1200万版本…)。 此过程确保版本为2.3.1.1256的产品 一定地 修订版11256的原始版本。开发人员手工构建的任何东西都会变成这样:2.3.9999.9999。 由于我们不使用mercurial,因此上述实现方式的确切细节并不直接相关,而是简单地说:teamcity处理签出所需的修订版并将其编号传递给我们的msbuild脚本,然后在自定义任务的帮助下重写assemblyinfo.cs写的。 我特别喜欢的是,在Visual Studio中按F5键绝对不会修改任何文件—事实上,就Visual Studio而言,它使用的是一个简单的老的常规解决方案。 |
Mr.H. · 如何在外部文件中定义函数? 6 年前 |
Jon Goe · 实现SeekArc时生成同步失败 6 年前 |
Farzad J · VSTS中PowerShell脚本的打包管理器 6 年前 |
vladfau · Maven没有在多模型项目中构建兄弟依赖关系 6 年前 |