Udostępnij za pośrednictwem


Dostosowywanie kompilacji rozwiązania

Gdy program MSBuild skompiluje plik rozwiązania, najpierw przetłumaczy go wewnętrznie na plik projektu, a następnie skompiluje go. Wygenerowany plik projektu importuje before.{solutionname}.sln.targets przed zdefiniowaniem jakichkolwiek obiektów docelowych i after.{solutionname}.sln.targets po zaimportowaniu obiektów docelowych, w tym obiektów docelowych zainstalowanych w $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportBefore katalogach i $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ImportAfter .

Można na przykład zdefiniować nowy element docelowy do zapisania niestandardowego komunikatu dziennika po utworzeniu pliku MyCustomizedSolution.sln , tworząc plik w tym samym katalogu o nazwie after. MyCustomizedSolution.sln.targets , który zawiera

<Project>
 <Target Name="EmitCustomMessage" AfterTargets="Build">
   <Message Importance="High" Text="The solution has completed the Build target" />
 </Target>
</Project>

Kompilacja rozwiązania jest oddzielona od kompilacji projektu, więc ustawienia w tym miejscu nie mają wpływu na kompilacje projektu.

Ważne

Dostosowanie kompilacji rozwiązania w ten sposób ma zastosowanie tylko do kompilacji wiersza polecenia za pomocą pliku MSBuild.exe. Nie dotyczy kompilacji w programie Visual Studio. Z tego powodu nie zaleca się umieszczania dostosowania na poziomie rozwiązania. Lepszym rozwiązaniem do dostosowywania wszystkich projektów w rozwiązaniu jest użycie plików Directory.Build.props i Directory.build.targets w folderze rozwiązania, jak opisano w innym miejscu tego artykułu.

Jeśli masz wiele plików rozwiązania, które chcesz rozszerzyć w taki sam sposób, ale nie chcesz zapisywać w $(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\SolutionFile\ folderze (co zwykle wymaga podwyższonych uprawnień), możesz utworzyć pliki Directory.Solution.props i Directory.Solution.targets i umieścić je w ścieżce głównej powyżej plików rozwiązania, które chcesz rozszerzyć. Plik Directory.Solution.props jest importowany na początku kompilacji rozwiązania, a element Directory.Solution.targets jest importowany na końcu kompilacji rozwiązania. Podczas tworzenia pliku rozwiązania pliki Directory.Build.props i Directory.Build.Targets nie są importowane, dlatego należy zamiast tego użyć elementów Directory.Solution.props i Directory.Solution.targets . Nie importują się niejawnie.

Jeśli w folderze głównym znajduje się folder Directory.Solution.props lub Directory.Solution.targets , ale masz rozwiązanie w tym folderze, którego nie chcesz importować, możesz użyć wcześniej wymienionych before.{solutionname}.sln.targets wcześniej plików specyficznych dla rozwiązania i after.{solutionname}.sln.targets ustawić właściwości $(ImportDirectorySolutionProps) i $(ImportDirectorySolutionTargets) na wartość false. Możesz też użyć właściwości $(DirectorySolutionPropsPath) i $(DirectorySolutionTargetsPath) określić inną lokalizację dla tych plików. Może to być przydatne, jeśli masz różne podzbiory rozwiązań, które wymagają określonych wartości właściwości lub elementów docelowych wspólnych dla podzbiorów.