我的目标是在Visual Studio Team Services中为测试和生产环境创建构建定义。我需要在代码中更新2个变量,这些变量决定了哪个数据库以及环境使用的blob存储。到目前为止,我已经在Resource变量中处理了这个值,并在代码中从My.Resources.DB
为库提取了该值,并为Microsoft.Azure.CloudConfigurationManager.GetSetting("DatabaseConnectionString")
提取了Azure辅助角色。但是,每次发布时更改4个变量都会让人感到疲惫。
我看到很多帖子都接近我想要的内容,但他们面向C#。由于我无法影响的原因,这个项目是用VB.NET编写的。看来我有两个选择。首先,我可以使用几个已定义的属性调用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"
这似乎有效,但我需要重建以更改该常量的值。我应该吗?应该建设足够吗?这是正常现象,还是表明我没有设置正确的东西?
我已经看过其他帖子谈论与其他一些构建器(如Ant)预处理源文件,但这看起来有点过分。感觉就像我在这附近。但我想缩小并从一张干净的纸上询问,如果您给出了2个需要根据环境进行更改的变量,那么您使用的是VB.NET,并且希望合并这些变量值在代码签入的自动VS Team Services构建过程中,最好的方法是什么? (我想在VSTS面板中定义变量,但这只是将它们传递给我的构建器,所以我必须知道如何解析对MSBuild的调用以使它们变得有用。)
我现在可以通过编译器指令控制两个静态字符串之间的选择,但是我真的想引用从MSBuild进程出来的Build.BuildNumber来显示给用户,如果可以的话这样做,我可以通过相同的机制为数据库和blob容器提供变量,并跳过预处理器。
答案 0 :(得分:0)
您已经找到了将数据从MsBuild Arguments直接传递到代码中的方法。另一种方法是使用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的一些评论。在实际开始编译阶段之前,有些项目最好存储在其他地方或更新。
可能的解决方案:
Parameters.xml
file that matches the deploy package。SetParameters.xml
文件在部署时覆盖变量。在专门讨论版本控制时,有许多方法可以在编译时间之前设置AssemblyVersion和AssemblyFileVersion,通常它涉及在编译之前覆盖AssemblyInfo.cs文件。然后,您的代码可以使用反射在运行时读取值。您可以使用AssemblyInformationalversion
指定与上面示例中包含.xxx
或其他文本的内容类似的内容。它还确保显示的版本始终反映通过Windows资源管理器读取文件属性时获得的信息。