如果msbuild要构建目标,我想只更新AssemblyInfo文件。我从BeforeBuild开始,但是在msbuild检查构建是否需要完成之前就已经发生了。如果太早完成,它总是强制构建,因为AssemblyInfo比目标更新。
经过一些研究后,我试了一下我的目标叫做UpdateConfig。
<PropertyGroup>
<CoreCompileDependsOn>
$(CoreCompileDependsOn);
UpdateConfig;
</CoreCompileDependsOn>
</PropertyGroup>
然而,文件也会很快更新。从日志片段中可以看出,我的目标被调用,然后运行CoreCompile目标,它会看到新的assemblyInfo文件并启动构建。
<target name="UpdateConfig" startTime="02/11/2015 10:28:05" elapsedTime="00:00:00" elapsedSeconds="0" success="true">
<task name="Exec" file="E:\SourceCode\Framework.Compiler.csproj" startTime="02/11/2015 10:28:05" elapsedTime="00:00:00" elapsedSeconds="0" success="true">
<message level="high"><![CDATA[powershell -executionpolicy Unrestricted -command "& { &'UpdateAssemblyNuSpec.ps1' 'E:\SourceCode\Framework.Compiler.csproj' 'E:\SourceCode\Framework\' '50' }"]]></message>
</task>
</target>
<target name="CoreCompile" startTime="02/11/2015 10:28:05" elapsedTime="00:00:01" elapsedSeconds="1" success="true">
<message level="low"><![CDATA[Building target "CoreCompile" completely.]]></message>
<message level="low"><![CDATA[Input file "Properties\AssemblyInfo.cs" is newer than output file "obj\Release\Framework.Compiler.pdb".]]></message>
<message level="low"><![CDATA[Using "Csc" task from assembly "Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".]]></message>
我希望我的目标在这里调用
<task name="Csc" file="E:\SourceCode\Framework.Compiler.csproj" startTime="02/11/2015 10:28:05" elapsedTime="00:00:01" elapsedSeconds="1" success="true">
<message level="high"><![CDATA[C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe /noconfig /nowarn:1701,1702 /nostdlib+ /errorreport:prompt /warn:4 /define:TRACE /highentropyva- /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\mscorlib.dll /reference:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll" /reference:C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.dll /debug:pdbonly /filealign:512 /optimize+ /out:obj\Release\Framework.Compiler.dll /resource:obj\Release\Framework.Compiler.g.resources /resource:obj\Release\Framework.Compiler.Properties.Resources.resources /target:library /utf8output Properties\AssemblyInfo.cs ]]></message>
我正在试图找出哪个DependOn或哪个目标可以将我的目标挂钩,以便在检查之后和编译器之前将其发生。
我尝试了MSBuildExtenstion Pack,这是我获得CoreCompileDependsOn技巧的地方,但它在检查之前也进行了更新并强制构建,因为AssemblyInfo.cs比之前的构建更新。
处理它的另一种方法是在调用我的目标之前调用相同的方法来检查是否会发生构建(与CodeCompile的做法相同)。这将保持在msbuild但我不知道我是否可以访问该方法(如果它存在)
第三种选择是使用;
更改刚刚构建的程序集中的AssemblyFileVerison<PropertyGroup>
<TargetsTriggeredByCompilation>
$(TargetsTriggeredByCompilation);
UpdateFileVersionInAssembly;
</TargetsTriggeredByCompilation>
</PropertyGroup>
如果我找不到挂钩到构建中正确位置的方法,看起来我可能不得不走这条路。
任何进入我想要的构建的想法或技巧都将受到赞赏。
丹