我需要構建一個MSBUILD腳本來執行.SQL腳本,自上次構建以來已更改。MSBUILD只執行已更改的SQL腳本
我最初認爲我可以使用<Copy>
任務將複製任務中的所有腳本從一個文件夾複製到另一個文件夾,並使用CopiedFiles <Output>
。但是,複製任務返回它嘗試複製的所有文件,而不是實際複製的文件。
我能夠得到MSBUILD通過MSBUILD.ExtensionPack但是我抓我的頭就這一個
我需要構建一個MSBUILD腳本來執行.SQL腳本,自上次構建以來已更改。MSBUILD只執行已更改的SQL腳本
我最初認爲我可以使用<Copy>
任務將複製任務中的所有腳本從一個文件夾複製到另一個文件夾,並使用CopiedFiles <Output>
。但是,複製任務返回它嘗試複製的所有文件,而不是實際複製的文件。
我能夠得到MSBUILD通過MSBUILD.ExtensionPack但是我抓我的頭就這一個
你可以用一個叫做增量建築的概念做到這一點。這個想法是,你將創建一個目標,然後指定輸入和輸出,這將是文件。 MSBuild會將輸入文件的時間戳與輸出文件進行比較。如果所有輸出都是在所有輸出之後創建的,則跳過目標。如果所有輸入都更新,則所有文件都將執行所有目標。如果只有一部分過期,那麼只有那些部分會傳遞給目標。欲瞭解更多信息,請參閱在我的文章Best Practices For Creating Reliable Builds, Part 2中使用增量版本。
而且對MSBuild的更多的資源,我在http://sedotech.com/Resources#MSBuild
它可能是你複製到一個空目標執行SQL腳本?
SkipUnchangedFiles
If true, skips the copying of files that are unchanged
between the source and destination. The Copy task considers
files to be unchanged if they have the same size and the
same last modified time.
在你的情況我懷疑,被認爲是所有文件的改變,因爲它們根本不存在目標。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="RunScripts">
<Import Project="$(MSBuildExtensionsPath)\ExtensionPack\MSBuild.ExtensionPack.tasks"/>
<PropertyGroup>
<ConnStr>Server=Example;Database=Example;Trusted_Connection=True</ConnStr>
<BuildFolder>Build\</BuildFolder>
</PropertyGroup>
<ItemGroup>
<Scripts Include="*.sql"/>
</ItemGroup>
<Target Name="RunScripts"
Inputs="@(Scripts)"
Outputs="@(Scripts->'$(BuildFolder)%(Filename)%(Extension)')">
<SqlExecute TaskAction="ExecuteScalar"
Files="@(Scripts)"
ConnectionString="$(ConnStr)"/>
<Copy SourceFiles="@(Scripts)"
DestinationFiles="@(Scripts->'$(BuildFolder)%(Filename)%(Extension)')"/>
</Target>
</Project>
這是如何與Data Dude一起解決問題。如果MS將提供「開箱即用」的任務,那將會很好。 – Raffaeu 2012-01-06 13:25:40
看來我的一些文字被解讀爲標籤編寫的清單,第二段應: 我最初以爲我可以複製所有的腳本使用COPY任務將一個文件夾複製到另一個文件夾,並使用CopiedFiles OUTPUT進行復制任務。但是,複製任務返回它嘗試複製的所有文件,而不是實際複製的文件。 – imbz 2010-02-06 01:48:31