Visual Studio用于通过msbuild命令行进行增量生成的生成目标

时间:2019-05-22 22:09:50

标签: c# visual-studio msbuild

我在C#项目中创建了一个任务,以便在发布模式下构建(更改)项目时自动对其进行版本控制。版本控制部分工作完美。但是,所有项目都在构建中,无论从命令行完成时项目是否实际更改。这导致不必要地对项目进行版本控制。在Visual Studio中工作时,不会生成未更改的项目,但是我们制作了一个工具,使用msbuild.exe进行自动生成,并且在使用Bamboo时将其用作临时修补程序,并且该方法始终会进行盲目编译,即使存在对项目没有任何更改。我需要确定是否对该项目进行了更改。

类似

'$(wasSourceUpdated)'=='true'或在我的自定义版本控制目标上使用的某种目标条件。

这是我在项目中的版本控制任务的示例

<Import Project="..\..\DXT.BuildTasks\Targets\DXTAutoIncrementVersion.targets" Condition="Exists('..\..\DXT.BuildTasks\Targets\DXTAutoIncrementVersion.targets') And '$(Configuration)|$(Platform)' == 'Release|AnyCPU' And '$(DeployOnBuild)' != 'true'" />

我还检查了thisthis的文章都没有用。

编辑

我需要在实际执行构建之前运行任务,以便使用新版本标记生成的程序集

编辑2

我真正要寻找的是运行CoreCompile 的条件,或者在我检测到程序集已更新时再次运行 CoreCompile

到目前为止,我已经尝试过:

<Project>
<PropertyGroup>
    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
</PropertyGroup>
<PropertyGroup>
    <_AssemblyTimestampBeforeCompile>%(IntermediateAssembly.ModifiedTime)</_AssemblyTimestampBeforeCompile>
</PropertyGroup>
<PropertyGroup>
    <_AssemblyTimestampAfterCompile>%(IntermediateAssembly.ModifiedTime)</_AssemblyTimestampAfterCompile>
</PropertyGroup>
<PropertyGroup>
    <_ProjectVersioned Condition="'$(_ProjectVersioned)'==''">false</_ProjectVersioned>
</PropertyGroup>
<Target Name="IncrementVersionBeforeBuild" AfterTargets="CoreCompile" Condition="'$(_AssemblyTimestampBeforeCompile)'!='$(_AssemblyTimestampAfterCompile)' and '$(_ProjectVersioned)' == 'false'">
 <Message Text="Before $(_AssemblyTimestampBeforeCompile) After $(_AssemblyTimestampAfterCompile)" Importance="High"/>
    <IncrementVersion
  ProjectPath="$(MSBuildProjectFullPath)"
    VersionRule="3.3.0.+"
    FileName="Properties\AssemblyInfo.cs">
    </IncrementVersion>
</Target>
<PropertyGroup>
    <TaskPath>$(MSBuildThisFileDirectory)..\Tasks\AutoVersionTask\AutoVersionTask\bin\Debug</TaskPath>
</PropertyGroup>
<!-- Sample import for projects
<Import Project="..\..\DXT.BuildTasks\Targets\DXTAutoIncrementVersion.targets" Condition="Exists('..\..\DXT.BuildTasks\Targets\DXTAutoIncrementVersion.targets') And '$(Configuration)|$(Platform)' == 'Release|AnyCPU' And '$(DeployOnBuild)' != 'true'" />
-->
<UsingTask AssemblyFile="$(TaskPath)\AutoVersionTask.dll" TaskName="AutoVersionTask.IncrementVersion" />

<PropertyGroup>
    <_ProjectVersioned>true</_ProjectVersioned>
</PropertyGroup>

预先感谢

2 个答案:

答案 0 :(得分:1)

因此,感谢Lance使我理解MSBuild,以至于我对问题的理解有了更好的了解。

长时间研究默认任务后,我遇到了this个问题,该问题可以完美解决我的问题。应用此修复程序后,版本控制任务现在仅在对msbuild代码进行更改时运行。

输入和输出与CoreCompile目标相同,并确保仅在源发生更改时才运行任务

这是我运行的目标:

<?xml version="1.0" encoding="utf-8"?>
<Project>
    <PropertyGroup>
        <CoreCompileDependsOn>
        $(CoreCompileDependsOn);
        IncrementVersionBeforeBuild
        </CoreCompileDependsOn>
    </PropertyGroup>
    <Target Name="IncrementVersionBeforeBuild"
            Inputs="$(MSBuildAllProjects);
            @(Compile);                               
            @(_CoreCompileResourceInputs);
            $(ApplicationIcon);
            $(AssemblyOriginatorKeyFile);
            @(ReferencePath);
            @(CompiledLicenseFile);
            @(EmbeddedDocumentation); 
            $(Win32Resource);
            $(Win32Manifest);
            @(CustomAdditionalCompileInputs)"
            Outputs="@(DocFileItem);
             @(IntermediateAssembly);
             @(_DebugSymbolsIntermediatePath);                 
             $(NonExistentFile);
             @(CustomAdditionalCompileOutputs)"
    >
        <Message Text="Version Task running" Importance="High"/>
        <IncrementVersion
      ProjectPath="$(MSBuildProjectFullPath)"
        VersionRule="3.3.0.+"
        FileName="Properties\AssemblyInfo.cs">
        </IncrementVersion>
    </Target>
    <PropertyGroup>
        <TaskPath>$(MSBuildThisFileDirectory)..\Tasks\AutoVersionTask\AutoVersionTask\bin\Debug</TaskPath>
    </PropertyGroup>
    <UsingTask AssemblyFile="$(TaskPath)\AutoVersionTask.dll" TaskName="AutoVersionTask.IncrementVersion" />

    <PropertyGroup>
        <_ProjectVersioned>true</_ProjectVersioned>
    </PropertyGroup>
</Project>

答案 1 :(得分:0)

通常,我们可以将以下脚本添加到.csproj文件中:

  <PropertyGroup>
    <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
  </PropertyGroup>
  <Target Name="AutoVersionWhenBuild" AfterTargets="CoreBuild"
          Condition="'$(_AssemblyTimestampBeforeCompile)'!='$(_AssemblyTimestampAfterCompile)'">
    <Message Importance="high" Text="Auto-version begins when changes are made!"/>
    <!--<AutoVersionTask>Do your auto-version task here.</AutoVersionTask>-->
  </Target>

当真正对项目进行更改时,将在构建期间调用它。参见此similar issue

针对您的情况:

您的任务和目标似乎来自目标文件DXTAutoIncrementVersion.targets,您可以打开该文件并将其中的目标更改为上面的格式。

另外:请检查taskstargets.targets文件之间的关系。

1.MSBuild使用任务来执行这些操作。

2.Targets将任务分组在一起。

3.MSBuild包含几个.targets文件,其中包含常见方案的项目,属性,目标和任务。

因此您可以modify your auto-version target in the xx.targets fileuse the script above, and call the auto-version task in the AutoVersionWhenBuild target。希望对您有所帮助:)