Msbuild und SLN unbindig
Frage
Ich möchte meine sln Datei von TFS-Server entbinden und veröffentlichen es auf SVN gibt es eine „easy“ Option, dies zu tun. Es ist einfach sln zu öffnen und wählte unbind Option in Visual Studio, aber hat man je versucht, diesen Prozess zu automatisieren? Es gibt eine Lösung SLN-Datei mit xmlpoke und Löschen von Bindungsinformationen zu bearbeiten, aber ist es sicher?
Lösung
Ich habe einige auf der MSDN Code Gallery veröffentlicht Proben für den TFS 2010 SDK , die zeigen, wie dies zu tun mit MSBuild und dem MSBuild Community-Aufgaben . Hier ist ein Ausschnitt von MSBuild-Skript aus dem WorkItemType.csproj Datei WorkItemObjectModel Beispiels:
<Import Project="$(MSBuildExtensionsPath32)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<ItemGroup>
<SourceFiles
Include="$(SolutionDir)**/*.*"
Exclude="$(SolutionDir)Package/**/*.*;$(SolutionDir)**/bin/**/*.*;$(SolutionDir)**/obj/**/*.*;$(SolutionDir)**/internal.proj;$(SolutionDir)**/*.*scc;$(SolutionDir)$(SolutionName).zip">
<Visible>False</Visible>
</SourceFiles>
</ItemGroup>
<Target Name="AfterBuild" Condition="'$(Configuration)'=='Release'"
Inputs="@(SourceFiles)" Outputs="$(SolutionDir)$(SolutionName).zip">
<Delete
Files="$(SolutionDir)$(SolutionName).zip"
Condition="Exists('$(SolutionDir)$(SolutionName).zip')" />
<PropertyGroup>
<PackageDir>$(SolutionDir)Package\</PackageDir>
</PropertyGroup>
<MakeDir
Directories="$(PackageDir)" />
<Copy
SourceFiles="@(SourceFiles)"
DestinationFiles="$(PackageDir)%(RecursiveDir)%(Filename)%(Extension)" />
<Delete
Files="$(PackageDir)**/bin/**/*.*;$(PackageDir)**/obj/**/*.*" />
<RemoveDir
Directories="$(PackageDir)**/bin;$(PackageDir)**/obj" />
<Attrib
Files="@(PackageFiles)"
ReadOnly="false" />
<FileUpdate
Files="$(PackageDir)$(SolutionFileName)"
IgnoreCase="true"
Regex="^\s+GlobalSection\(TeamFoundationVersionControl\).+\n(\s*Scc.*\n)+\s+EndGlobalSection"
ReplacementText=" "
Multiline="true"
Singleline="false" />
<ItemGroup>
<ProjectFiles Include="$(PackageDir)**/*.*proj" />
</ItemGroup>
<FileUpdate
Files="@(ProjectFiles)"
Regex="<Scc[A-z]+>.+</Scc[A-z]+>"
ReplacementText=" " />
<ItemGroup>
<PackageFiles Include="$(PackageDir)**\*.*" />
</ItemGroup>
<Zip
Files="@(PackageFiles)"
WorkingDirectory="$(PackageDir)"
ZipFileName="$(SolutionDir)$(SolutionName).zip" />
<Delete
Files="@(PackageFiles)" />
<RemoveDir
Directories="$(PackageDir)" />
</Target>
Auf den Punkt gebracht, dieses Skript kopiert die Quelldateien in ein temporäres Verzeichnis, entfernt die Source-Control-Bindungen aus der Lösung und Projektdateien, dann die Quellen verlieren und schließlich löscht die temporäre Verzeichnis.