2016-04-22 128 views
2

我的目标是在Visual Studio Team Services中为测试和生产环境创建构建定义。我需要在我的代码中更新2个变量,这些变量决定哪个数据库以及环境使用哪个blob存储。到目前为止,我已经在Resource变量中处理了这个值,并从库的代码My.Resources.DB中提取了该值,对于Azure辅助角色,该值为Microsoft.Azure.CloudConfigurationManager.GetSetting("DatabaseConnectionString")。但是,每次发布版本时更改4个变量都会令人疲劳。是否可以将构建过程中的变量传递给Visual Basic代码?

我看到很多接近我想要的帖子,但他们是面向C#。由于超出我的影响的原因,这个项目是用VB.NET编写的。看来我有2个选项。首先,我可以用一些定义的属性调用MSBuild进程,将它们传递给.metaproj构建文件,但我不知道如何让它们用于VB代码。这是可取的,但在这一点上,我开始怀疑这是可能的。

我已经能够设置一些预处理器常量,在#if#else语句中被识别。

#If DEBUG = True Then 
     BarStaticItemVersion.Caption = String.Format("Version: {0}", "1.18.0.xxx") 
#Else 
     BarStaticItemVersion.Caption = String.Format("Version: {0}", "1.18.0.133") 
#End If 

msbuild CalbertNG.sln.metaproj /t:Rebuild /p:DefineConstants="DEBUG=False"

这似乎是工作,但我需要重建更改该常量的值。我需要吗?应该建立足够的?这是正常的,还是表明我没有设置正确的东西?

我已经看到其他一些文章讨论预处理源文件与其他一些建设者,如蚂蚁,但似乎是矫枉过正。感觉就像我在这里。但是我想缩小并从一张干净的纸上问你是否有两个变量需要在每个环境中改变,你使用的是VB.NET,并且你希望将这些变量值合并到一个自动化的VS中团队服务在代码签入时构建过程,最好的方法是什么? (我想在VSTS面板中定义变量,但这只是将它们传递给我的构建器,所以我必须知道如何解析对MSBuild的调用以使它们有用)。

我可以控制2静态字符串,现在,通过编译器指令,但我真的很想引用MSBuild进程中显示给用户的Build.BuildNumber,如果可以这样做,我可以将变量提供给数据库和blob容器通过相同的机制,并跳过预处理器。

+0

我们为每个环境的项目添加配置,并设置转换以设置连接字符串和其他设置。也看看使用SlowCheetah。 – JerryM

+0

您应该使用web.config或app.config来存储环境特定的变量,如连接字符串。 –

+0

我很欣赏使用app.config的建议,但后来我遇到了类似的问题:如何通过msbuild.exe在THAT文件中设置值? –

回答

0

您已经找到了将数据从MsBuild参数直接传递到代码中的方式。另一种方法是使用Condition Attribute in your project files to make certain property groups optional,它允许你甚至有条件地包含特定的文件。你可以control conditions by passing in /p:ConditionalProperty=value on the MsBuild command。这至少可以确保人们使用一组有意义的值。

问题是,当MsBuild以增量模式运行时,它很可能不会处理您的更改(如您已经注意到的),原因是输入文件自上次构建后保持不变,并且都是比上次生成的输出文件还要旧。

要绕过此行为,您通常会创建单独的解决方案配置并覆盖所有项目的输出位置,使其对该配置唯一。结合为特定配置设置编译器常量,可以确保在构建该配置/平台组合时,增量构建按预期工作。

我的确想回应一些JerryM和Daniel Mann的评论。在实际开始编译阶段之前,有些项目会更好地存储在其他位置或已更新。

可能的解决方案:在配置文件和使用配置转型

当谈论专门的版本控制时,有许多方法可以在编译之前设置AssemblyVersion和AssemblyFileVersion,通常它涉及在编译之前覆盖AssemblyInfo.cs文件。然后,您的代码可以使用反射在运行时读取值。您可以使用AssemblyInformationalversion来指定类似于您在上面的示例中所做的操作,其中包含.xxx或其他文本,还可以确保显示的版本始终反映读取文件属性时获得的信息通过Windows资源管理器

+0

我在2年前开始这个项目时尝试了SlowCheetah。我只是用最新的VS再试了一遍,我仍然遇到了同样的问题:VS中没有看到创建的文件。它们在文件系统上创建,但VS文件浏览器忽略它们。这使得他们处于次优状态。 –

+0

我真的很喜欢使用ReplaceTokens VSTS任务的想法。这似乎是一个干净的方法。不过,我只是安装它,并将其添加到我的构建定义中,但我无法确定如何定义标记和替换字符串。这似乎没有用户界面,只是前缀和后缀。 –

+0

我可以定义变量,但是你在哪里定义了要替换的变量?我可以通过msbuild.exe来喂食吗? –

相关问题