对于我目前正在进行的项目,我需要实现对象版本控制.不幸的是,我需要保留每个对象的完整历史记录,因此像Papertrail这样的单个表解决方案很快就会变得无法管理.然而,我喜欢Papertrail的功能,我在一个解决方案中找不到每个模型的单独表格(例如acts_as_versioned).
还有Papertrail没有的一些功能可以奖励:
我目前正在考虑让Papertrail为每个模型使用单独的表格,但是如果有现有的解决方案,我想节省这些努力.
更新: Vestal版本默认使用单个表,但通过为每个模型提供自定义版本类并使用ActiveRecord的"set_table_name"方法,我能够为每个模型创建单独的表.Vestal版本也内置差异支持,但其界面不如Papertrails强大.它也缺乏关联支持.
更新2: 由于papertrail似乎是一个更活跃的项目,我已经分叉了gem并添加了类似于版本的自定义类支持,现在允许为每个模型定义单独的表.我的分支在这里,但我希望它很快就会被拉入主项目库. https://github.com/benzittlau/paper_trail
我需要对存储在面向文档的数据库(MongoDB)中的(简单)Java对象图进行版本控制.对于关系数据库和Hibernate,我发现了Envers并且对这些可能性感到非常惊讶.是否有类似的东西可以用于Spring Data Documents?
我发现这篇文章概述了我对存储对象版本的想法(以及更多......),我当前的实现类似,因为它将对象的副本存储在带有时间戳的单独历史记录集合中,但我想改进这一点以节省存储空间.因此,我认为我需要在对象树上实现"diff"操作,并且需要"merge"操作来重建旧对象.有没有图书馆帮助这个?
编辑:任何MongoDB和版本的体验高度赞赏!我看到很可能没有Spring Data解决方案.
我正在考虑在我们的网络产品中构建基本的CMS功能,并正在研究版本化内容的技巧和设计思路.我特意在寻找今天使用的数据库模式.
您使用什么内容版本控制?如果您有需要存储版本的不同类型的内容,哪些模式适用?如何在Stack Overflow上处理问题版本控制?
谢谢
如何在编译后读取.csproj中的AssemblyFileVersion或其组件AssemblyFileMajorVersion,AssemblyFileMinorVersion,AssemblyFileBuildNumber,AssemblyFileRevision?
我尝试了以下从构建的程序集中提取信息:
<Target Name="AfterCompile">
<GetAssemblyIdentity AssemblyFiles="$(TargetPath)">
<Output
TaskParameter="Assemblies"
ItemName="MyAssemblyIdentities"/>
</GetAssemblyIdentity>
<Message Text="AssemblyVersion = %(MyAssemblyIdentities.Version)" />
</Target>
Run Code Online (Sandbox Code Playgroud)
但是,它检索AssemblyVersion而不是AssemblyFileVersion.对于后者,似乎没有记录的元数据条目.我也尝试过:
<Import Project="$(MSBuildExtensionsPath)\ExtensionPack\MSBuild.ExtensionPack.tasks" />
<Target Name="AfterCompile">
<MSBuild.ExtensionPack.Framework.Assembly TaskAction="GetInfo" NetAssembly="$(TargetPath)">
<Output TaskParameter="OutputItems" ItemName="Info" />
</MSBuild.ExtensionPack.Framework.Assembly>
<Message Text="AssemblyFileVersion = %(Info.FileVersion)" />
</Target>
Run Code Online (Sandbox Code Playgroud)
不幸的是,虽然这会检索正确的值,但它也会锁定程序集,直到VS2008关闭.
坦率地说,我不想要什么,因为我宁愿直接从AssemblyInfo.cs读取信息.但是,我无法弄清楚如何做到这一点.我假设MSBuild Extensions中的AssemblyInfo是一种方式,但它似乎专注于写入AssemblyInfo而不是从中检索值.
我怎样才能最好地完成这个?
为什么不同版本的Silverlight程序集具有相同的版本号?
Location: ...\Silverlight\v3.0\System.Core.dll
Name: System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
Location: ...\Silverlight\v4.0\System.Core.dll
Name: System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
Location: ...\Silverlight\v4.0\Profile\WindowsPhone\System.Core.dll
Name: System.Core, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e
Run Code Online (Sandbox Code Playgroud)
虽然标准.net有不同的版本号
Location: ...\Framework\v4.0.30319\System.dll
Name: System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Location: ...\Framework\v2.0.50727\System.dll
Name: System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Run Code Online (Sandbox Code Playgroud) 有没有一种简单的方法可以在运行时从资源文件中获取应用程序版本信息?
实际上,我想要做的是能够在运行时显示"Version XYZ",而不必在某个地方使用我必须与ProductVersion和FileVersion保持同步的单独变量.
澄清一下:是的,这是一个标准的C++ Windows项目.我知道GetFileVersionInfo方法但是从内存中的版本打开二进制文件只是为了查询版本信息似乎很愚蠢 - 我确定我错过了一些明显的东西:-)
如果我想序列化一个对象,我必须使用[Serializable]属性,所有成员变量都将写入该文件.我不知道如何进行版本控制,例如,如果我添加一个新的成员变量(重命名一个变量或只是删除一个变量),然后打开(反序列化)该文件,我如何确定对象/文件版本,这样才能正确设置新成员还是进行某种迁移?如何确定变量是否在加载期间初始化(由反序列化器忽略).
我知道有版本容忍方法,我可以用[OptionalField(VersionAdded = 1)]属性标记变量.如果我打开一个旧文件,框架将忽略这个可选(新变量),它将只是零/ null.但是,我如何确定变量是通过加载初始化还是被忽略.
我可以将类/对象版本号写入流中.使用ISerializable方法并在constructor(SerializationInfo oInfo, StreamingContext context)方法中读取此版本号.这将告诉我流中的类版本是什么.
但是我预计C#中的流式传输框架已经实现了这种版本控制.我试图从中获取程序集版本,SerializationInfo但它始终设置为当前版本而不是保存对象时使用的版本.
什么是首选方法?我在网上发现了很多文章,但我找不到一个很好的解决方案来解决版本问题......
任何帮助表示感谢,谢谢,深渊
只是想知道.NET构建版本化的最佳方法是什么?
我用:
我想设置版本:
理想的版本号将允许跟踪已安装的软件回到确切的源代码.
就像是:
<Major>.<Minor>.<TFS_changeset_number>
Run Code Online (Sandbox Code Playgroud)
我希望在解决方案附近的版本控制中存储一些简单文本\ XML文件的前两部分版本,因为我相信它们应该共存.开发人员将手动更新此文件(例如,遵循语义版本控制方法).每个构建都将读取此版本文件,从调用CI工具获取3d版本的部分,并使用该版本更新所有必需的文件.
实现这个的最佳方法是什么?
我过去曾使用过几种方法:
1)执行此版本的NAnt\MsBuild包装器,然后调用MsBuild获取解决方案.它可以从CI工具(Jenkins\TeamCity\etc)调用.
问题 - 当我构建解决方案两次时,与TFS门控签入的集成很难看.
2)自定义TFS构建过程模板
问题 - 它不是那么简单,并导致一些合并工作TFS升级.此外,在门控签到中还不存在变更集编号,因此我们只能使用先前的变更集ID.
3)解决方案中的单独MsBuild项目,它仅执行此版本控制任务,并配置为首先在VS解决方案的项目构建顺序中运行.
问题 - 需要在所有其他项目(包括所有未来的项目)中引用这个元项目,这些项目感觉很难看
我知道不同的MsBuild和TFS扩展包可以简化更新.这个主题不是关于哪一个是最好的.问题是方法论而不是技术问题.
我还认为,如果微软在其标准TFS构建模板中包含版本控制功能,那将是理想的选择.其他CI工具已经具有此功能(AssemblyInfo修补程序).
更新11/09/2014
我决定明确表达符合敏捷\持续交付最佳实践的版本控制原则:
1)能够再现任何历史建筑
2)由于1)并且根据CD原则,所有内容(源代码,测试,应用程序配置,环境配置,构建\包\部署脚本等)都存储在版本控制下,因此具有分配给它的版本
3)版本号与其适用的源代码紧密存储在一起
4)人们可以根据他们的业务\营销逻辑更新版本
5)该版本只有一个主副本,用于自动构建\包装过程的所有部分
6)您可以轻松地说出目标系统上当前安装了哪个版本的软件
7)已安装软件的版本必须明确标识用于构建它的源代码
8)比较版本比较低,哪些更高,以控制允许哪些升级\降级方案及其实现细节是非常简单的
更新15/09/2014
请看下面我自己的答案.
我很幸运能找到满足我所有要求的解决方案!
我希望能够对现有SignalR集线器上的方法签名,名称等进行更改.是否有针对SignalR集线器版本化的定义策略,以便旧的JS代码可以继续工作,而无需为新调用创建新的新命名集线器?
我一直在教育自己关于monorepos,因为我相信这对我的团队和我们项目的现状是一个很好的解决方案.我们有多个Web产品(客户端门户,内部门户,API,核心共享代码).
我正在努力寻找我想要找到的答案的版本.
当您的所有项目和产品都在monorepo内时,版本控制策略是什么?
从CI的角度来看,当您在项目A中提交某些内容时,是否应该在所有项目中启动整套测试以确保没有任何损坏,即使没有必要对依赖/共享模块进行更改?
versioning continuous-integration continuous-deployment monorepo
versioning ×10
.net ×4
c# ×2
msbuild ×2
api-design ×1
assemblies ×1
c++ ×1
diff ×1
java ×1
javascript ×1
migration ×1
mongodb ×1
monorepo ×1
signalr ×1
silverlight ×1
spring-data ×1
tfs ×1
winapi ×1
windows ×1
wix ×1