javascript

java

python

c#

android

node.js

c++

reactjs

php

html

jquery

css

.net

ios

git

ruby-on-rails

sql

c

string

ruby

eclipse-Java项目:.classpath .project文件是否应提交到存储库中?

这个问题已经在这里有了答案:

  • 的.classpath和.project - 检查到版本控制或没有?                                     7个答案

我应该检入.project和.classpath文件吗?

我的朋友告诉我,我只应检入.java文件和build.xml以保证可移植性。 他说:“。classpath将使您在不同环境下的可移植性大大降低。.project完全是您的本地Eclipse设置”

我同意他的观点,但部分同意。

-不签入.project文件会使我的开发效率降低(我不能简单地从目录中“导入”项目代码)

-如果我的build.xml是精心编写的,则不签入.classpath文件对我来说似乎可以(?)。

有人要在这里分享他们的经验吗?

trans by 2020-02-16T03:51:09Z

REST api版本控制(仅对表示形式进行版本控制,而不对资源本身进行版本控制)

我看过API版本控制的最佳做法?,但对答案并不太满意,因此我再次用一个更具体的示例来质疑版本控制部分。 我有两个URI(一个带有版本控制作为URI的一部分,另一个没有版本控制):

http://xxxx/v1/user/123    -> favored solution in discussed thread
http://xxxx/user/123             

我怀疑第一个链接是否表达了REST的想法。 我发现http://xxxx/v1/user/123令人困惑,因为它暗示某天会有更高的api版本,例如http://xxxx/v2/user/123。但这在REST方面没有意义,api版本本身是HTTP 1.0或1.1,已经在HTTP请求中发送了。 这种以REST资源为中心的视图与其他api接口(例如SOAP或Java接口)(通常使用合格名称的api版本)非常不同。

在REST中,唯一有意义的版本控制就是该资源的表示形式(例如,添加或删除新字段)。 此版本控制属于内容协商的一部分,例如:

http://xxx/user/123 + HTTP 'Accept' Header -> Content negotation through header
http://xxx/user/123?v=1                    -> for perma-links/hyperlinks

可能还会有人争辩说,这种版本的内容协商可能是路径内URI的一部分,但我发现它与直觉相反,因为您可能最终为同一资源使用不同的URI,并且必须在某个时候保持重定向。

总结一下:在REST URI中,没有api版本控制,只有资源表示形式的版本控制。 表示形式版本信息属于内容协商(如queryParam或HTTP'Accept')。

你怎么看? 您会在哪些方面不同意/同意?

trans by 2020-01-24T02:21:04Z

版本控制-如何发布依赖于Maven中的第三方SNAPSHOT项目的项目

我想使用Maven发布插件发布快照项目'foo-1.0-SNAPSHOT'。 该项目取决于尚未发布的第三方模块'bar-1.0-SNAPSHOT'。我在项目的pom.xml中使用选项'allowTimestampedSnapshots'允许带时间戳的快照,但我假设除非我自己构建它,否则第3方模块(bar)不会带时间戳,因为maven仍然抱怨未解决的SNAPSHOT依赖关系。

有没有一种方法可以释放项目foo,而与依赖的SNAPSHOT项目无关,如果没有,我如何为第三方项目添加时间戳?

trans by 2020-01-24T01:49:37Z

数据库-数据版本控制

我已经阅读了关于SO(例如此问题)的一些问题,这些问题涉及对数据库中的数据进行版本控制。

我喜欢提到的一些建议。 我有最长的时间想要(需要)修改我的许多表,但从来没有解决过。 作为一个只有简单数据库工作的程序员,我想知道人们将如何去做。

我不是在要求使用SQL语法的实际解决方案。 我最终可以自己解决这个问题(或在时机成熟时发布SO)。 我只是想让人们评论一下他们将如何去做,如果我要“修订”数亿条记录,可能会出现任何潜在的性能问题。 或任何其他建议,只要它基于以下示例即可。

举一个简单的例子:

Person
------------------------------------------------
ID                UINT NOT NULL,
PersonID          UINT NOT NULL,
Name              VARCHAR(200) NOT NULL,
DOB               DATE NOT NULL,
Email             VARCHAR(100) NOT NULL

Audit
------------------------------------------------
ID                UINT NOT NULL,
UserID            UINT NOT NULL,               -- Who
TableName         VARCHAR(50) NOT NULL,        -- What
OldRecID          UINT NOT NULL,               -- Where
NewRecID          UINT NOT NULL,
AffectedOn        DATE NOT NULL,               -- When
Comment           VARCHAR(500) NOT NULL        -- Why

如果TableName是字符串,我不确定如何将Audit表链接到任何其他表(例如Person)?

另外,假设我要填充三个GUI:

  1. 特定人员ID的完整记录
  2. 列出所有人的表格视图(按ID)
  3. 显示每个人及其每个条目下方的修订信息的视图(每个人的修订号,修订日期,修订注释等),按最新修订排序。

要完成1和2,查询Person表或Audit表会更好吗?

要完成3,所谓的数据库专家会简单地获取所有记录并将其传递给软件进行处理,还是按PersonID和受影响日期进行分组? 通常在一个或多个查询中处理吗?

trans by 2020-01-19T01:18:21Z

java-如何允许用户从应用程序内部检查最新的应用程序版本?

我想在应用程序中添加一个“检查更新”按钮,以便当有人单击它时,它将显示一个敬酒消息/进度对话框,用于检查应用程序的版本。

如果找到新版本,则应用程序将自动将其下载到手机,并允许用户手动安装更新的应用程序。

或任何其他方法都可以,只要它可以检查最新版本并通知用户进行更新即可。

trans by 2020-01-02T07:54:21Z

版本控制-在父模块上执行Maven插件目标,但在子模块上不执行

我们有一个多模块maven项目,该项目使用定义了buildnumber-maven-plugin的配置文件来增加内部版本号,然后将其检入源代码管理。

如果我在父pom.xml中定义插件,那么它也会对所有子版本执行。

这是我的父母pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                      http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.webwars</groupId>
  <artifactId>parent</artifactId>
  <packaging>pom</packaging>
  <properties>
    <buildNumber.properties>${basedir}/../parent/buildNumber.properties</buildNumber.properties>
  </properties>
  <version>1.0-SNAPSHOT</version>
  <name>Parent Project</name>
  <profiles>
    <profile>
      <id>release</id>
      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
              <debug>false</debug>
              <optimize>true</optimize>
            </configuration>
          </plugin>
          <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>buildnumber-maven-plugin</artifactId>
            <version>1.0-beta-3</version>
            <executions>
              <execution>
                <phase>validate</phase>
                <goals>
                  <goal>create</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <buildNumberPropertiesFileLocation>${buildNumber.properties}</buildNumberPropertiesFileLocation>
              <getRevisionOnlyOnce>true</getRevisionOnlyOnce>
              <doCheck>false</doCheck>
              <doUpdate>false</doUpdate>
              <format>{0, number}</format>
              <items>
                <item>buildNumber</item>
              </items>
            </configuration>
          </plugin>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-scm-plugin</artifactId>
            <executions>
              <execution>
                <phase>install</phase>
                <goals>
                  <goal>checkin</goal>
                </goals>
              </execution>
            </executions>
            <configuration>
              <basedir>${basedir}</basedir>
              <includes>buildNumber.properties</includes>
              <message>[Automated checkin] of ${basedir} Build version: ${major.version}.${minor.version}.${buildNumber}</message>
              <developerConnectionUrl>...</developerConnectionUrl>
            </configuration>
          </plugin>         
        </plugins>
      </build>
    </profile>
  </profiles>

  <modules>

    <module>../common</module>
    <module>../data</module>
    <module>../client</module>
    <module>../webplatform</module>
  </modules>
 ...
</project>
trans by 2019-11-09T12:18:38Z

版本控制-如何使用同一R包的多个版本?

为了能够比较一个程序包的两个版本,我需要选择要加载的程序包的哪个版本。 R的软件包系统默认设置为覆盖现有软件包,因此您始终拥有最新版本。 我如何忽略此行为?

到目前为止,我的想法是:

我可以得到软件包的来源,编辑描述以给出不同的名称,并实际上构建两个不同的软件包。 不过,我宁愿能够直接使用二进制文件,因为这样麻烦得多。

我不一定需要同时加载两个版本的软件包(只需同时安装在某个位置)。 我可能会迷惑Sys.getenv('R_HOME')来更改R安装软件包的位置,然后.libpaths()来更改R查找软件包的位置。 但是,这似乎很棘手,所以有人有更好的主意吗?

trans by 2019-11-07T07:44:18Z

git-将标签向前提交一

我有一个只有一个分支的存储库(v1.0)。 我是我的回购的唯一贡献者。

我最近在本地添加了v1.0,并将其推送到GitHub。 完成我的工作之后,尽管是最后一个必要的提交,但是现在我意识到我应该再进行一次更改/提交。

所以我有:

commit 124
commit 125
commit 126 <-- tag v1.0
commit 127

我想将v1.0标记移至本地和GitHub中的下一个提交,即:127

我怎样才能做到这一点?

trans by 2019-11-03T07:32:30Z

git - 如何在Excel文件和SQL模式文件上执行更好的文档版本控制

我负责几个Excel文件和SQL模式文件。 我该如何对这些文件执行更好的文档版本控制?

我需要知道这些文件中修改过的部分(不同部分)并保留所有版本以供参考。 目前我在文件名上附加时间戳,但我发现它似乎效率低下。

有没有办法或好的做法来做更好的文档版本控制?

顺便说一句,编辑通过电子邮件发送给我文件。

trans by 2019-09-11T10:47:53Z

.net - 如何将SVN修订版号与我的ASP.NET网站同步?

Stack Overflow底部有一个subversion版本号:

svn修订版:679

我想在我的.NET Web Site/Application,Windows窗体,WPD项目/解决方案中使用这种自动版本控制。

我该如何实现?

trans by 2019-09-08T16:33:15Z

windows - 如何设置现有.exe,.dll的版本信息?

作为构建过程的一部分,我需要为所有已编译的二进制文件设置版本信息。 一些二进制文件已经有版本信息(在编译时添加),有些则没有。

我希望能够应用以下信息:

  • 公司名
  • 版权声明
  • 产品名称
  • 产品描述
  • 文件版本
  • 产品版本

所有这些属性都由构建脚本指定,并且必须在编译后应用。 这些是使用C ++ Builder 2007编译的标准二进制文件(而不是程序集)。

我怎样才能做到这一点?

trans by 2019-08-02T05:14:46Z

c# - 自动更新版本麻木

我希望我的应用程序的version属性为每个构建增加,但我不确定如何在Visual Studio(2005/2008)中启用此功能。 我试图将AssemblyVersion指定为1.0。*但它并没有让我得到我想要的。

我也使用了一个设置文件,并且在早期的尝试中,当程序集版本发生更改时,我的设置被重置为默认值,因为应用程序在另一个目录中查找了设置文件。

我希望能够以1.1.38的形式显示版本号,因此当用户发现问题时,我可以记录他们正在使用的版本,并告诉他们如果他们有旧版本则升级。

还将理解版本控制如何工作的简短说明。 构建和修订号何时增加?

trans by 2019-07-25T22:33:20Z

如何使用spring管理REST API版本控制?

我一直在搜索如何使用Spring 3.2.x管理REST API版本,但我找不到任何易于维护的东西。 我先解释一下我遇到的问题,然后解决一个问题...但我想知道我是否在这里重新发明了这个问题。

我想基于Accept标头管理版本,例如,如果请求具有Accept标头RequestMappingInfoHandlerMapping,我希望spring MVC将其转发到处理此版本的方法。 并且由于并非API中的所有方法都在同一版本中发生变化,因此我不想访问每个控制器并为版本之间没有更改的处理程序更改任何内容。 我也不想让逻辑找出在控制器中使用哪个版本(使用服务定位器),因为Spring已经发现了要调用的方法。

因此,采用版本1.0到1.8的API,其中版本1.0中引入了处理程序,并在v1.7中进行了修改,我希望以下列方式处理它。 想象一下,代码在控制器内部,并且有一些代码能够从头部提取版本。 (以下在Spring中无效)

@RequestMapping(...)
@VersionRange(1.0,1.6)
@ResponseBody
public Object method1() {
   // so something
   return object;
}

@RequestMapping(...) //same Request mapping annotation
@VersionRange(1.7)
@ResponseBody
public Object method2() {
   // so something
   return object;
}

这在春天是不可能的,因为2个方法具有相同的RequestMappingInfoHandlerMapping注释并且Spring无法加载。 我们的想法是RequestMappingHandlerMapping注释可以定义打开或关闭的版本范围。 第一种方法从版本1.0到1.6有效,而第二种方法从版本1.7开始(包括最新版本1.8)。 我知道如果某人决定通过99.99版本,这种方法会中断,但这是我可以接受的。

现在,由于上述情况不可能在没有对弹簧如何工作的严重修改的情况下进行,我正在考虑修改处理程序与请求匹配的方式,特别是编写我自己的RequestMappingInfoHandlerMapping,并且在那里有版本范围。 例如

码:

@RequestMapping(..., produces = "application/vnd.company.app-[1.0-1.6]+json)
@ResponseBody
public Object method1() {
   // so something
   return object;
}

@RequestMapping(..., produces = "application/vnd.company.app-[1.7-]+json)
@ResponseBody
public Object method2() {
   // so something
   return object;
}

通过这种方式,我可以在注释的产生部分中定义关闭或打开的版本范围。 我现在正在研究这个解决方案,问题是我仍然需要更换一些我不喜欢的核心Spring MVC类(RequestMappingInfoHandlerMapping,RequestMappingHandlerMappingRequestMappingInfo),因为这意味着每当我决定做额外工作时 升级到更新版本的spring。

我会很感激任何想法......特别是,任何建议都可以用更简单,更容易维护的方式来做到这一点。


编辑

添加赏金。 为了得到赏金,请回答上面的问题,而不建议在控制器本身有这个逻辑。 Spring已经有很多逻辑来选择调用哪个控制器方法,我想捎带它。


编辑2

我在github中分享了原始的POC(有一些改进):[https://github.com/augusto/restVersioning]

trans by 2019-07-24T18:30:22Z

版本控制 - 如何版本REST URI

版本REST URI的最佳方法是什么? 目前我们在URI本身有一个版本#,即。

http://example.com/users/v4/1234/

对于此表示的第4版。

该版本是否属于queryString?即。

http://example.com/users/1234?version=4

或者版本控制最好的另一种方式?

trans by 2019-07-19T17:09:10Z

.net - 版本3.0.0.1的ASP.NET MVC安全补丁打破了构建

这个问题在这里已有答案:

  • Windows更新导致MVC3和MVC4停止工作                                     9个答案

安装ASP.NET MVC 3安全更新KB2990942后,MVC版本似乎从3.0.0.0增加到3.0.0.1.这会导致Visual Studio不再找到引用。

<Reference Include="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />

Resharper没有显示任何问题,但构建失败,有许多未解析的MVC类型和警告:

警告:无法解析此引用。 无法找到   assembly&#34; System.Web.Mvc,Version = 3.0.0.0,Culture = neutral,   PublicKeyToken = 31bf3856ad364e35,processorArchitecture = MSIL&#34;。 检查   确保程序集存在于磁盘上。 如果需要此引用   通过您的代码,您可能会遇到编译错误。

这种做法很有道理。 我的机器上不再存在此版本。

我无法保证dev机器,构建服务器和生产服务器上的确切MVC版本。 他们可能有3.0.0.03.0.0.1,这可能随时改变。 Windows Update可能随时发布新的MVC版本。 此外,每当发布MVC更新时,我都不想增加所有* .csproj文件中的版本号。

更新会影响多个版本:

  • KB 2993939:Microsoft ASP.NET MVC 2的安全更新
  • KB 2993937:Microsoft ASP.NET MVC 3的安全更新
  • KB 2993928:Microsoft ASP.NET MVC 4.0的安全更新
  • KB 2992080:Microsoft ASP.NET MVC 5.0的安全更新

安全公告:MS14-059:ASP.NET MVC中的漏洞可能允许安全功能绕过(2990942)

处理这种情况的最佳方法是什么? 如何在未来的MVC更新中展开构建和生产并保持安全?

trans by 2019-07-16T20:15:24Z

.net - 如何通过CI平台(Hudson)自动增加C#程序集版本?

我自己和我的团队在增加程序集版本号时非常可怕,我们经常发送1.0.0.0版本的程序集。 显然,这会引起很多麻烦。

通过我们的CI平台,我们的实践越来越好,我真的想将其设置为自动递增assemblyinfo.cs文件中的值,以便使用代码自动更新程序集的版本 该组件的变化。

我以前设置(在我们找到Hudson之前)通过assemblyinfo.cs或命令行(无法记住)增加值的方法,但是使用Hudson,这将更新SVN存储库并触发另一个构建。 由于Hudson每小时轮询SVN,这将导致缓慢的无限循环。

让Hudson增加版本号是一个坏主意吗? 什么是另一种方法呢?

理想情况下,我的解决方案标准是:

  • 在构建之前增加assemblyinfo.cs中的内部版本号
  • 仅增加已更改的程序集中的内部版本号。 这可能是不可能的,因为Hudson每次执行构建时都会清除项目文件夹
  • 将更改的assemblyinfo.cs提交到代码存储库(当前为VisualSVN)
  • 在下次扫描更改时,不会导致Hudson触发新构建

在我脑海中解决这个问题,我可以通过批处理文件/命令轻松地提出大部分解决方案,但是我的所有想法都会导致Hudson在下次扫描时触发新的构建。 我不是在寻找某人为我做任何事情,只是指出我正确的方向,也许是让Hudson忽略某些SVN提交的技巧等。

到目前为止,我发现的所有内容都只是一篇文章,解释了如何自动增加版本号,没有任何内容考虑到可以旋转到无限循环的CI平台。

trans by 2019-07-05T23:11:31Z

sql - 修订版的数据库设计?

我们在项目中要求存储数据库中实体的所有修订(更改历史记录)。 目前我们有2个设计方案:

例如 为&#34;员工&#34; 实体

设计1:

-- Holds Employee Entity
"Employees (EmployeeId, FirstName, LastName, DepartmentId, .., ..)"

-- Holds the Employee Revisions in Xml. The RevisionXML will contain
-- all data of that particular EmployeeId
"EmployeeHistories (EmployeeId, DateModified, RevisionXML)"

设计2:

-- Holds Employee Entity
"Employees (EmployeeId, FirstName, LastName, DepartmentId, .., ..)"

-- In this approach we have basically duplicated all the fields on Employees 
-- in the EmployeeHistories and storing the revision data.
"EmployeeHistories (EmployeeId, RevisionId, DateModified, FirstName, 
      LastName, DepartmentId, .., ..)"

有没有其他办法做这件事?

&#34;设计1&#34;的问题 是每次需要访问数据时我们必须解析XML。 这将减慢进程并添加一些限制,例如我们无法在修订数据字段上添加联接。

以及&#34;设计2&#34;的问题 是我们必须复制所有实体上的每个字段(我们有大约70-80个实体,我们要为其维护修订)。

trans by 2019-07-01T18:32:49Z

如何在svn和/或gi中“unversion”一个文件

它总是发生在我身上。 我不小心版本化了一个文件,我不想被版本化(即开发人员/机器特定的配置文件)。

如果我提交这个文件,我会搞乱所有其他开发者机器上的路径 - 他们会不高兴。

如果我从版本控制中删除该文件,它将从其他开发者机器中删除 - 他们会不高兴。

如果我选择永远不提交文件,我总是有一个“脏”的结账 - 我不开心。

是一种干净的方法来“修改”来自修订控制的文件,这会导致没有人感到不快乐吗?

编辑:尝试澄清一点:我已经将文件提交到存储库,我只想将其从版本控制中删除 - 我特别不希望它从每个人进行结账时被物理删除。 我最初希望它被忽略。

答:如果我能接受第二个答案,那就是这个。 它回答了关于git的问题 - 接受的答案是关于svn。

trans by 2019-06-24T05:12:03Z

rest - 如何管理版本化API的底层代码库?

我一直在阅读有关ReST API的版本控制策略,而且它们似乎没有解决您如何管理底层代码库的问题。

假设我们正在对API进行一系列重大更改 - 例如,更改我们的客户资源,使其返回单独的http://api.mycompany.com/v1/customers/{id}http://api.mycompany.com/v2/customers/{id}字段,而不是单个name字段。 (对于此示例,我将使用URL版本控制解决方案,因为它很容易理解所涉及的概念,但问题同样适用于内容协商或自定义HTTP标头)

我们现在有一个端点位于http://api.mycompany.com/v1/customers/{id},另一个不兼容的端点位于http://api.mycompany.com/v2/customers/{id}。我们仍在发布v1 API的错误修正和安全更新,但新功能开发现在都专注于v2。 我们如何编写,测试和部署对API服务器的更改? 我可以看到至少两个解决方案:

  • 为v1代码库使用源代码控制分支/标记。 v1和v2是独立开发和部署的,必要时使用版本控制合并将相同的错误修复应用于两个版本 - 类似于在开发主要新版本的同时管理本机应用程序的代码库,同时仍然支持以前的版本。

  • 使代码库本身了解API版本,因此您最终会得到一个包含v1客户表示和v2客户表示的单一代码库。 将版本控制视为解决方案体系结构的一部分而不是部署问题 - 可能使用命名空间和路由的某种组合来确保请求由正确的版本处理。

分支模型的明显优势在于删除旧的API版本是微不足道的 - 只是停止部署适当的分支/标记 - 但如果您运行多个版本,最终可能会遇到一个非常复杂的分支结构和部署管道。 “统一代码库”模型避免了这个问题,但是(我认为?)会使得在不再需要时从代码库中删除已弃用的资源和端点变得更加困难。 我知道这可能是主观的,因为不太可能有一个简单的正确答案,但我很想知道在多个版本中维护复杂API的组织如何解决这个问题。

trans by 2019-06-12T05:21:40Z

Java项目的构建和版本编号(ant,cvs,hudson)

Java项目中系统构建编号和版本号管理的当前最佳实践是什么? 特别:

  • 如何在分布式开发环境中系统地管理构建号

  • 如何在源/可用于运行时应用程序中维护版本号

  • 如何与源存储库正确集成

  • 如何更自动地管理版本号与存储库标签

  • 如何与持续构建基础架构集成

有很多工具可用,而ant(我们正在使用的构建系统)有一个维护构建号的任务,但是不清楚如何使用CVS,svn或类似的多个并发开发人员来管理它。

[编辑]

下面出现了几个好的和有用的部分或具体的答案,所以我将总结其中的一些。 听起来对我来说就像这里没有真正强大的“最佳实践”,而是一系列重叠的想法。 下面,找到我的摘要和一些人们可能会尝试回答的结果问题。 [新的stackoverflow ...如果我做错了,请提供评论。]

  • 如果您使用的是SVN,则可以使用特定结帐的版本控制。 构建编号可以利用它来创建标识特定结帐/修订的唯一构建号。 [我们因遗留原因而使用的CVS并没有提供这种程度的洞察力......使用标签进行人工干预可以帮助您实现目标。]

  • 如果您使用maven作为构建系统,则支持从SCM生成版本号,以及用于自动生成版本的发布模块。 [出于各种原因,我们不能使用maven,但这有助于那些能够做到的人。 [感谢marcelo-morales]]

  • 如果您使用ant作为构建系统,则以下任务描述可以帮助生成捕获构建信息的Java .properties文件,然后可以通过多种方式将其折叠到构建中。 [我们扩展了这个想法,包括哈德逊派生的信息,感谢marty-lamb]。

  • Ant和maven(以及hudson和巡航控制)提供了将构建号放入.properties文件或.txt / .html文件的简便方法。 这种“安全”是否足以防止它被故意或意外地篡改? 在构建时将它编译成“版本化”类是否更好?

  • 断言:应该在像哈德森这样的持续集成系统中定义/制定构建编号。 [感谢marcelo-morales]我们已经采纳了这个建议,但它确实破解了发布工程问题:发布是如何发生的? 发布中是否有多个buildnumbers? 来自不同版本的构建数量之间是否存在有意义的关系?

  • 问题:内部版本编号背后的目标是什么? 它用于QA吗? 怎么样? 它是否主要由开发人员用于在开发期间消除多个构建之间的歧义,或更多用于QA以确定最终用户构建的内容? 如果目标是可重复性,理论上这就是发布版本号应该提供的 - 为什么不呢? (请在下面作为你的答案的一部分回答这个问题,它将有助于说明你做出的建议/建议...)

  • 问题:手动构建中是否存在构建号码的位置? 这是有问题的,以至于每个人都应该使用CI解决方案吗?

  • 问题:是否应将建立号码签入SCM? 如果目标是可靠且明确地识别特定构建,那么如何应对可能崩溃/重启等的各种连续或手动构建系统......

  • 问题:构建号码是否应该简短且甜蜜(即单调增加整数),以便易于存档到文件名中,易于在通信中引用等等......或者它应该是多长的用户名, 日期戳,机器名等?

  • 问题:请提供有关如何将构建号分配适合您的大型自动发布流程的详细信息。 是的,maven爱好者,我们知道这已经完成了,但并非我们所有人都喝醉了kool-aid ......

我真的很喜欢将其充实成一个完整的答案,至少对于我们的cvs / ant / hudson设置的具体例子,所以有人可以基于这个问题构建一个完整的策略。 我将标记为“答案”的任何人都可以为这个特定情况提供汤到坚果的描述(包括cvs标记方案,相关的CI配置项和释放过程,将构建号折叠到发布中,以便以编程方式 如果你想询问/回答另一个特定的配置(例如,svn / maven /巡航控制),我将链接到这里的问题。--JA

[编辑09年10月23日]我接受了最高投票的答案,因为我认为这是一个合理的解决方案,而其他几个答案也包括好主意。 如果有人想要用marty-lamb's合成其中一些,我会考虑接受另一个。 我对marty-lamb的唯一顾虑是它不会生成一个可靠的序列化构建号 - 它依赖于构建器系统的本地时钟来提供明确的构建号,这并不是很好。

[编辑7月10日]

我们现在包括如下所示的类。 这允许将版本号编译成最终的可执行文件。 在记录数据,长期归档输出产品中发出不同形式的版本信息,并用于跟踪我们(有时是数年以后)对特定构建的输出产品的分析。

public final class AppVersion
{
   // SVN should fill this out with the latest tag when it's checked out.

   private static final String APP_SVNURL_RAW = 
     "$HeadURL: svn+ssh://user@host/svnroot/app/trunk/src/AppVersion.java $";
   private static final String APP_SVN_REVISION_RAW = "$Revision: 325 $";  

   private static final Pattern SVNBRANCH_PAT = 
     Pattern.compile("(branches|trunk|releases)\\/([\\w\\.\\-]+)\\/.*");
   private static final String APP_SVNTAIL = 
     APP_SVNURL_RAW.replaceFirst(".*\\/svnroot\\/app\\/", "");

  private static final String APP_BRANCHTAG;
  private static final String APP_BRANCHTAG_NAME;
  private static final String APP_SVNREVISION = 
    APP_SVN_REVISION_RAW.replaceAll("\\$Revision:\\s*","").replaceAll("\\s*\\$", "");


  static {
    Matcher m = SVNBRANCH_PAT.matcher(APP_SVNTAIL);
    if (!m.matches()) {
      APP_BRANCHTAG = "[Broken SVN Info]";
      APP_BRANCHTAG_NAME = "[Broken SVN Info]";
    } else {
      APP_BRANCHTAG = m.group(1);
      if (APP_BRANCHTAG.equals("trunk")) {
        // this isn't necessary in this SO example, but it 
        // is since we don't call it trunk in the real case
        APP_BRANCHTAG_NAME = "trunk";
      } else {
        APP_BRANCHTAG_NAME = m.group(2);
      }
    }
  }

  public static String tagOrBranchName()
  { return APP_BRANCHTAG_NAME; }

  /** Answers a formatter String descriptor for the app version.
   * @return version string */
  public static String longStringVersion()
  { return "app "+tagOrBranchName()+" ("+
    tagOrBranchName()+", svn revision="+svnRevision()+")"; }

  public static String shortStringVersion()
  { return tagOrBranchName(); }

  public static String svnVersion()
  { return APP_SVNURL_RAW; }

  public static String svnRevision()
  { return APP_SVNREVISION; }

  public static String svnBranchId()
  { return APP_BRANCHTAG + "/" + APP_BRANCHTAG_NAME; } 

  public static final String banner()
  {
    StringBuilder sb = new StringBuilder();
    sb.append("\n----------------------------------------------------------------");
    sb.append("\nApplication -- ");
    sb.append(longStringVersion());
    sb.append("\n----------------------------------------------------------------\n");
    return sb.toString();
  }
}

如果这值得成为维基讨论,请留下评论。

trans by 2019-06-08T22:15:25Z

1 2 下一页 共2页