Msbuild 自动递增";“最低要求版本”;在ClickOnce部署中?
是否有办法自动增加ClickOnce部署中的“最低要求版本”字段,使其始终等于当前版本号?基本上,我总是希望我的部署在发布时自动更新Msbuild 自动递增";“最低要求版本”;在ClickOnce部署中?,msbuild,clickonce,Msbuild,Clickonce,是否有办法自动增加ClickOnce部署中的“最低要求版本”字段,使其始终等于当前版本号?基本上,我总是希望我的部署在发布时自动更新 我想我需要一些编译前/编译后的事件,但我希望有一个更简单的方法。您正在寻找应用程序更新吗 右键单击解决方案资源管理器中的项目,然后单击发布。。。是获取应用程序更新的错误方法。必须在项目上单击鼠标右键,然后单击“属性”,然后单击“发布”选项卡。单击更新。。。按钮,然后选中“应用程序应检查更新”复选框。在那里,您还可以指定应用程序所需的最低版本。(我没有使用过该功能,
我想我需要一些编译前/编译后的事件,但我希望有一个更简单的方法。您正在寻找应用程序更新吗
右键单击解决方案资源管理器中的项目,然后单击发布。。。是获取应用程序更新的错误方法。必须在项目上单击鼠标右键,然后单击“属性”,然后单击“发布”选项卡。单击更新。。。按钮,然后选中“应用程序应检查更新”复选框。在那里,您还可以指定应用程序所需的最低版本。(我没有使用过该功能,但更新功能是我使用ClickOnce的核心原因,它非常有效。)开箱即用,我不相信有办法。然而,你并不需要花太多的精力来实现自己的目标 我采用的方法如下: 1) 创建一个Version.Properties文件
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Util-VersionMajor>1</Util-VersionMajor>
<Util-VersionMinor>11</Util-VersionMinor>
<Util-VersionBuild>25</Util-VersionBuild>
<Util-VersionRevision>0</Util-VersionRevision>
<Util-VersionDots>$(Util-VersionMajor).$(Util-VersionMinor).$(Util-VersionBuild).$(Util-VersionRevision)</Util-VersionDots>
<Util-VersionUnders>$(Util-VersionMajor)_$(Util-VersionMinor)_$(Util-VersionBuild)_$(Util-VersionRevision)</Util-VersionUnders>
<MinimumRequiredVersion>$(Util-VersionDots)</MinimumRequiredVersion>
<ApplicationVersion>$(Util-VersionDots)</ApplicationVersion>
<ApplicationRevision>$(Util-VersionRevision)</ApplicationRevision>
</PropertyGroup>
</Project>
1.
11
25
0
$(Util VersionMajor)。$(Util VersionMinor)。$(Util VersionBuild)。$(Util VersionRevision)
$(Util VersionMajor)\$(Util VersionMinor)\$(Util VersionBuild)\$(Util VersionRevision)
$(Util VersionDots)
我最终在VS上运行了一个加载项,该加载项同步了所有版本号,然后只需单击一下即可构建和发布。这很容易
Public Sub Publish()
Try
Dim startProjName As String = Nothing
Dim targetProj As Project = Nothing
Dim soln As Solution2 = TryCast(Me._applicationObject.DTE.Solution, Solution2)
If soln IsNot Nothing Then
For Each prop As [Property] In soln.Properties
If prop.Name = "StartupProject" Then
startProjName = prop.Value.ToString()
Exit For
End If
Next
If startProjName IsNot Nothing Then
For Each proj As Project In soln.Projects
If proj.Name = startProjName Then
targetProj = proj
Exit For
End If
Next
If targetProj IsNot Nothing Then
Dim currAssemVersionString As String = targetProj.Properties.Item("AssemblyVersion").Value.ToString
Dim currAssemVer As New Version(currAssemVersionString)
Dim newAssemVer As New Version(currAssemVer.Major, currAssemVer.Minor, currAssemVer.Build, currAssemVer.Revision + 1)
targetProj.Properties.Item("AssemblyVersion").Value = newAssemVer.ToString()
targetProj.Properties.Item("AssemblyFileVersion").Value = newAssemVer.ToString()
Dim publishProps As Properties = TryCast(targetProj.Properties.Item("Publish").Value, Properties)
Dim shouldPublish As Boolean = False
If publishProps IsNot Nothing Then
shouldPublish = CBool(publishProps.Item("Install").Value)
If shouldPublish Then
targetProj.Properties.Item("GenerateManifests").Value = "true"
publishProps.Item("ApplicationVersion").Value = newAssemVer.ToString()
publishProps.Item("MinimumRequiredVersion").Value = newAssemVer.ToString()
publishProps.Item("ApplicationRevision").Value = newAssemVer.Revision.ToString()
End If
End If
targetProj.Save()
Dim build As SolutionBuild2 = TryCast(soln.SolutionBuild, SolutionBuild2)
If build IsNot Nothing Then
build.Clean(True)
build.Build(True)
If shouldPublish Then
If build.LastBuildInfo = 0 Then
build.Publish(True)
End If
End If
End If
End If
End If
End If
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
我是这样处理这件事的。首先,我创建了一个自定义任务来包装字符串替换:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Build.Utilities;
using Microsoft.Build.Framework;
namespace SynchBuild
{
public class RemoveAsterisk : Task
{
private string myVersion;
[Required]
public string Version
{
set{myVersion = value;}
}
[Output]
public string ReturnValue
{
get { return myVersion.Replace("*", ""); }
}
public override bool Execute()
{
return true;
}
}
}
因此,它被内置到SynchBuild.dll中,您可以在下面的UsingTask中看到它的引用。现在我尝试覆盖MinimumRequiredVersion属性,但它似乎没有被选中,所以我只是通过在csproj文件的末尾添加以下行来重写GenerateApplicationManifest目标:
<UsingTask AssemblyFile="$(MSBuildExtensionsPath)\WegmansBuildTasks\SynchBuild.dll" TaskName="SynchBuild.RemoveAsterisk" />
<Target Name="GenerateDeploymentManifest" DependsOnTargets="GenerateApplicationManifest" Inputs="
 $(MSBuildAllProjects);
 @(ApplicationManifest)
 " Outputs="@(DeployManifest)">
<RemoveAsterisk Version="$(ApplicationVersion)$(ApplicationRevision)">
<Output TaskParameter="ReturnValue" PropertyName="MinimumRequiredVersion" />
</RemoveAsterisk>
<GenerateDeploymentManifest MinimumRequiredVersion="$(MinimumRequiredVersion)" AssemblyName="$(_DeploymentDeployManifestIdentity)" AssemblyVersion="$(_DeploymentManifestVersion)" CreateDesktopShortcut="$(CreateDesktopShortcut)" DeploymentUrl="$(_DeploymentFormattedDeploymentUrl)" Description="$(Description)" DisallowUrlActivation="$(DisallowUrlActivation)" EntryPoint="@(_DeploymentResolvedDeploymentManifestEntryPoint)" ErrorReportUrl="$(_DeploymentFormattedErrorReportUrl)" Install="$(Install)" MapFileExtensions="$(MapFileExtensions)" MaxTargetPath="$(MaxTargetPath)" OutputManifest="@(DeployManifest)" Platform="$(PlatformTarget)" Product="$(ProductName)" Publisher="$(PublisherName)" SuiteName="$(SuiteName)" SupportUrl="$(_DeploymentFormattedSupportUrl)" TargetCulture="$(TargetCulture)" TargetFrameworkVersion="$(TargetFrameworkVersion)" TrustUrlParameters="$(TrustUrlParameters)" UpdateEnabled="$(UpdateEnabled)" UpdateInterval="$(_DeploymentBuiltUpdateInterval)" UpdateMode="$(UpdateMode)" UpdateUnit="$(_DeploymentBuiltUpdateIntervalUnits)" Condition="'$(GenerateClickOnceManifests)'=='true'">
<Output TaskParameter="OutputManifest" ItemName="FileWrites" />
</GenerateDeploymentManifest>
</Target>
最终结果是,我们将应用程序版本和修订版合并,删除星号,然后设置所需的最低版本。我在发布属性中设置了自动增量应用程序版本,这就是增量的发生方式,然后我只是将minimumrequiredversion设置为始终匹配。我不使用team build,这只是为了让使用visual studio的开发人员能够进行所需的所有clickonce部署而设计的。希望这能有所帮助。我回答这个问题可能有点晚,但我发现在谷歌上很难找到解决方案,但最终还是找到了答案,所以我想与大家分享
对于MSBuild版本4(VS2010和VS2012),这可以通过插入以下目标来实现:
<Target Name="AutoSetMinimumRequiredVersion" BeforeTargets="GenerateDeploymentManifest">
<FormatVersion Version="$(ApplicationVersion)" Revision="$(ApplicationRevision)">
<Output PropertyName="MinimumRequiredVersion" TaskParameter="OutputVersion" />
</FormatVersion>
<FormatVersion Version="$(ApplicationVersion)" Revision="$(ApplicationRevision)">
<Output PropertyName="_DeploymentBuiltMinimumRequiredVersion" TaskParameter="OutputVersion" />
</FormatVersion>
</Target>
$(ApplicationVersion)与您可以在VS IDE的项目发布窗口中手动设置的设置相同,修订部分设置为星号。$(ApplicationRevision)是用于发布版本的实际版本。FormatVersion任务是一个内置的MSBuild任务,它将这两个任务格式化为一个完整的版本号
这会将“所需最低版本”设置为与“发布版本”相同,从而确保新部署始终由用户安装,即没有跳过更新的选项
当然,如果您不想将所需的最低版本设置为发布版本,并且希望使用不同的源属性,那么可以直接修改目标,但是原理是一样的。如果您要从Visual Studio发布ClickOnce应用程序,那么只需在项目中安装即可
如果是从生成服务器或其他脚本发布,则可以使用。我的博客对此进行了更详细的描述。我想做的是自动增加“应用程序所需的最低版本”,以匹配即将发布的当前版本。我明白了。听起来很有用。事实上,如果微软是聪明的,他们会把它做成一个内置的复选框功能…:-)问题是如何自动增加该功能。我花了一段时间才弄清楚该放在哪里。您必须卸载该项目,右键单击并选择“Edit Test.csproj”(或在编辑器中的VS外部打开它)。“MinimumRequiredVersion”和“\u DeploymentBuiltMinimumRequiredVersion”之间有什么区别?如果我删除第一个FormatVersion部分,它似乎仍然有效。何时需要?请注意,虽然这将正确部署MinimumRequiredVersion的值,但该值不会在您的项目文件或发布UI中表示。谢谢,这太棒了,应该被接受answer@Bob有趣的是,您的解决方案适用于非VSTO项目,但是“发布”属性对VSTO项目无效。是否可以使用“发布”选项卡上的按钮进行发布“VSTO项目中的选项卡?是的,“发布”按钮工作正常。你试过了吗?这有可能是环境问题,但我认为这对于VSTO项目来说是完全不可能的。在有许多开发人员参与项目的情况下,VS AddIn并不是最好的方法。你找到了使用构建事件的方法吗?我有一个干净的解决方案。请看我的答案。
<Target Name="AutoSetMinimumRequiredVersion" BeforeTargets="GenerateDeploymentManifest">
<FormatVersion Version="$(ApplicationVersion)" Revision="$(ApplicationRevision)">
<Output PropertyName="MinimumRequiredVersion" TaskParameter="OutputVersion" />
</FormatVersion>
<FormatVersion Version="$(ApplicationVersion)" Revision="$(ApplicationRevision)">
<Output PropertyName="_DeploymentBuiltMinimumRequiredVersion" TaskParameter="OutputVersion" />
</FormatVersion>
</Target>