gpt4 book ai didi

msbuild - 用 MSBuild 替换 .sln 并将包含的项目包装到目标中

转载 作者:行者123 更新时间:2023-12-04 01:55:34 25 4
gpt4 key购买 nike

我想创建一个 MSBuild 项目,该项目反射(reflect)解决方案中的项目依赖关系,并将 VS 项目包装在可重用目标中。

我喜欢解决的问题是在 BizTalk 应用程序中 svn 导出、构建和部署特定程序集(及其依赖项)。

我的问题是 :如何使 svn 导出、构建和部署的目标可重用,并在为不同的依赖项构建包装项目时重用它们?

我知道只构建解决方案并仅部署所需的程序集会更简单,但我想尽可能多地重用目标。

零件

我喜欢部署的项目

<Project DefaultTargets="Deploy" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<ExportRoot Condition="'$(Export)'==''">Export</ExportRoot>
</PropertyGroup>

<Target Name="Clean_Export">
<RemoveDir Directories="$(ExportRoot)\My.Project.Dir" />
</Target>

<Target Name="Export_MyProject">
<Exec Command="svn export svn://xxx/trunk/Biztalk2009/MyProject.btproj --force" WorkingDirectory="$(ExportRoot)" />
</Target>

<Target Name="Build_MyProject" DependsOnTargets="Export_MyProject">
<MSBuild Projects="$(ExportRoot)\My.Project.Dir\MyProject.btproj" Targets="Build" Properties="Configuration=Release"></MSBuild>
</Target>

<Target Name="Deploy_MyProject" DependsOnTargets="Build_MyProject">
<Exec Command="BTSTask AddResource -ApplicationName:CORE -Source:MyProject.dll" />
</Target>
</Project>

它所依赖的项目看起来几乎完全一样(其他 .btproj 和 .csproj)。

最佳答案

哇,这是一个论坛帖子的加载问题。我在我的 book 中写了大约 20 页关于创建可重用 .targets 文件的内容。 ,但我会从这里开始介绍基础知识。我相信创建可重用构建脚本(即 .targets 文件)的关键是三个要素:

  • 将行为(即目标)放入单独的文件
  • 将数据(即属性和项目,这些称为 .proj 文件)放入它们自己的文件中
  • 可扩展性
  • .targets 文件应该验证假设

  • 这个想法是您希望将所有目标放入单独的文件中,然后这些文件将由驱动构建过程的文件导入。这些是包含数据的文件。由于您导入了 .targets 文件,因此您将获得所有目标,就好像它们是内联定义的一样。 .proj 和 .targets 文件之间将有一个静默契约(Contract)。此契约(Contract)在两者都使用的属性和项目中定义。这是需要验证的。

    这里的想法并不新鲜。此模式之后是 .csproj(以及 Visual Studio 生成的其他项目)。如果您查看您的 .csproj 文件,您将找不到单个目标,只有属性和项目。然后在文件的底部导入 Microsoft.csharp.targets(可能因项目类型而异)。该项目文件(以及它导入的其他文件)包含实际执行构建的所有目标。

    所以它的布局是这样的:
  • SharedBuild.targets
  • MyProduct.proj

  • 在哪里 MyProdcut.proj 可能看起来像:
    <?xml version="1.0" encoding="utf-8"?>
    <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <!-- This uses a .targets file to off load performing the build -->
    <PropertyGroup>
    <Configuration Condition=" '$(Configuration)'=='' ">Release</Configuration>
    <OutputPath Condition=" '$(OutputPath)'=='' ">$(MSBuildProjectDirectory)\BuildArtifacts\bin\</OutputPath>
    </PropertyGroup>

    <ItemGroup>
    <Projects Include="$(MSBuildProjectDirectory)\..\ClassLibrary1\ClassLibrary1.csproj"/>
    <Projects Include="$(MSBuildProjectDirectory)\..\ClassLibrary2\ClassLibrary2.csproj"/>
    <Projects Include="$(MSBuildProjectDirectory)\..\ClassLibrary3\ClassLibrary3.csproj"/>
    <Projects Include="$(MSBuildProjectDirectory)\..\WindowsFormsApplication1\WindowsFormsApplication1.csproj"/>
    </ItemGroup>

    <Import Project="SharedBuild.targets"/>
    </Project>

    SharedBuild.targets 可能看起来像:
    <Project  DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <!-- This represents a re-usable build file -->
    <Target Name="SharedBuild_Validate">
    <!-- See http://sedodream.com/2009/06/30/ElementsOfReusableMSBuildScriptsValidation.aspx for more info
    about this validation pattern
    -->
    <ItemGroup>
    <_RequiredProperties Include ="Configuration">
    <Value>$(Configuration)</Value>
    </_RequiredProperties>
    <_RequiredProperties Include ="OutputPath">
    <Value>$(OutputPath)</Value>
    </_RequiredProperties>

    <_RequiredItems Include="Projects">
    <RequiredValue>%(Projects.Identity)</RequiredValue>
    <RequiredFilePath>%(Projects.Identity)</RequiredFilePath>
    </_RequiredItems>
    </ItemGroup>

    <!-- Raise an error if any value in _RequiredProperties is missing -->
    <Error Condition="'%(_RequiredProperties.Value)'==''"
    Text="Missing required property [%(_RequiredProperties.Identity)]"/>

    <!-- Raise an error if any value in _RequiredItems is empty -->
    <Error Condition="'%(_RequiredItems.RequiredValue)'==''"
    Text="Missing required item value [%(_RequiredItems.Identity)]" />

    <!-- Validate any file/directory that should exist -->
    <Error Condition="'%(_RequiredItems.RequiredFilePath)' != '' and !Exists('%(_RequiredItems.RequiredFilePath)')"
    Text="Unable to find expeceted path [%(_RequiredItems.RequiredFilePath)] on item [%(_RequiredItems.Identity)]" />
    </Target>

    <PropertyGroup>
    <BuildDependsOn>
    SharedBuild_Validate;
    BeforeBuild;
    CoreBuild;
    AfterBuild;
    </BuildDependsOn>
    </PropertyGroup>
    <Target Name="Build" DependsOnTargets="$(BuildDependsOn)"/>
    <Target Name="BeforeBuild"/>
    <Target Name="AfterBuild"/>
    <Target Name="CoreBuild">
    <!-- Make sure output folder exists -->
    <PropertyGroup>
    <_FullOutputPath>$(OutputPath)$(Configuration)\</_FullOutputPath>
    </PropertyGroup>
    <MakeDir Directories="$(_FullOutputPath)"/>
    <MSBuild Projects="@(Projects)"
    BuildInParallel="true"
    Properties="OutputPath=$(_FullOutputPath)"/>
    </Target>
    </Project>

    不要看太多 SharedBuild_Validate目标呢。我把它放在那里是为了完整性,但不要专注于它。您可以在我的博客 http://sedodream.com/2009/06/30/ElementsOfReusableMSBuildScriptsValidation.aspx 上找到更多信息。 .

    需要注意的重要部分是可扩展点。尽管这是一个非常基本的文件,但它具有可重用 .targets 文件的所有组件。您可以通过传入不同的属性和要构建的项目来自定义它的行为。您可以通过覆盖目标( BeforeBuildAfterBuild 甚至 CoreBuild )来扩展它的行为,并且可以将自己的目标注入(inject)到构建中:
    <Project ...>
    ...
    <Import Project="SharedBuild.targets"/>
    <PropertyGroup>
    <BuildDependsOn>
    $(BuildDependsOn);
    CustomAfterBuild
    </BuildDependsOn>
    </PropertyGroup>
    <Target Name="CustomAfterBuild">
    <!-- Insert stuff here -->
    </Target>
    </Project>

    在您的情况下,我将创建一个使用所需属性的 SvnExport.targets 文件:
  • SvnExportRoot
  • svnUrl
  • Svn工作目录
    您将使用这些属性来执行导出。

  • 然后为 Biztalk 构建和部署创建另一个。如有必要,您可以将其拆分为 2。

    然后在您的 .proj 文件中,您只需导入两者并设置目标以按正确的顺序构建,然后关闭。

    这只是创建可重复使用的构建元素的真正开始,但这应该会让你头脑发热。我将把所有这些发布到我的 blog以及所有文件的下载链接。

    更新:

    发布到博客 http://sedodream.com/2010/03/19/ReplacingSolutionFilesWithMSBuildFiles.aspx

    关于msbuild - 用 MSBuild 替换 .sln 并将包含的项目包装到目标中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2472183/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com