C# 解决方案的 MSBuild 自定义(如版本)
Customizations on MSBuild (like version) for a C# solution
我认为最终结果会是 "it can't be that easily done",但看起来应该是这样。我有一个正在进行的个人项目。我不想手动(甚至在脚本中)更改版本、公司、版权以及所有 assembly.cs 文件中的所有内容,并且希望所有这些都在脚本或文件中当我想更新版本时更改(因此脚本大部分保持不变)。但似乎 MSBuild 主要是 "build as is specified in Visual Studio"。我只是讨厌拥有这些文件的所有历史记录,我只更改版本,甚至可能犯错误,因为这个项目将继续变得越来越大。我希望能够向 Visual studio 添加一个新项目,并在我的 powershell 脚本中使用任何命令行,只需说 "compile this, but give it this company name and this file version instead of whatever is listed in the code file".
Google 在这方面没有被证明是富有成果的。我什至发现很难将我的文件构建到特定文件夹中。到目前为止,我必须确保我所有的项目都是 2 个文件夹深,并且能够说在 ....\ 构建它们,但如果我愿意,我希望能够随机更改它并在其他地方构建它们如果我愿意的话。
MSBuild 也许不是正确的选择?有没有其他方法可以从命令行构建更好的 visual studio ?最后,我还想使用 wix 自动构建安装,并能够将其版本与二进制版本相匹配。
谢谢
由于 csproj 是 xml,您可以在构建之前使用 XmlUpdate "helpers" 修改 csproj 文件中的值。
对于其他文件,您可以使用其他一些任务来完成这项工作。
这是一个有用的目标:
http://msbuildtasks.tigris.org/ and/or https://github.com/loresoft/msbuildtasks 有(FileUpdate(和 SvnVersion 任务,如果那是你的源代码控制))任务。
<Target Name="BeforeBuild_VersionTagIt_Target">
<ItemGroup>
<AssemblyInfoFiles Include="$(ProjectDir)\**\*AssemblyInfo.cs" />
</ItemGroup>
<!--
<SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="$(SVNToolPath)">
<Output TaskParameter="Revision" PropertyName="MyRevision" />
</SvnVersion>
-->
<PropertyGroup>
<MyRevision>9999</MyRevision>
</PropertyGroup>
<FileUpdate Files="@(AssemblyInfoFiles)"
Regex="AssemblyFileVersion\("(\d+)\.(\d+)\.(\d+)\.(\d+)"
ReplacementText="AssemblyFileVersion("...$(MyRevision)" />
</Target>
下面是一个操作 csproj(xml) 的例子。
How to add a linked file to a csproj file with MSBuild. (3.5 Framework)
但基本上,当您构建时,您可以将所有重复的内容放在一个 msbuild 定义文件中(通常扩展名为 .proj 或 .msbuild)...然后调用 msbuild.exe MyFile.proj .
在 .proj 文件中,您将引用您的 .sln 文件。
例如:
$(WorkingCheckout) 将是一个变量(此处未定义)...它包含您从源代码管理中获取 hte 代码副本的目录。
<Target Name="BuildIt" >
<MSBuild Projects="$(WorkingCheckout)\MySolution.sln" Targets="Build" Properties="Configuration=$(Configuration)">
<Output TaskParameter="TargetOutputs" ItemName="TargetOutputsItemName"></Output>
</MSBuild>
<Message Text="BuildItUp completed" />
</Target>
下面是更完整的示例。
您可以将其保存为 "MyBuild.proj" 然后调用
"msbuild.exe" "MyBuild.proj".
开始.proj 代码。 (注意,我没有为 FileUpdate 任务导入库)
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="AllTargetsWrapped">
<PropertyGroup>
<!-- Always declare some kind of "base directory" and then work off of that in the majority of cases -->
<WorkingCheckout>.</WorkingCheckout>
</PropertyGroup>
<Target Name="AllTargetsWrapped">
<CallTarget Targets="BeforeBuild_VersionTagIt_Target" />
<CallTarget Targets="BuildItUp" />
</Target>
<Target Name="BuildItUp" >
<MSBuild Projects="$(WorkingCheckout)\MySolution.sln" Targets="Build" Properties="Configuration=$(Configuration)">
<Output TaskParameter="TargetOutputs" ItemName="TargetOutputsItemName"></Output>
</MSBuild>
<Message Text="BuildItUp completed" />
</Target>
<Target Name="BeforeBuild_VersionTagIt_Target">
<ItemGroup>
<AssemblyInfoFiles Include="$(ProjectDir)\**\*AssemblyInfo.cs" />
</ItemGroup>
<!--
<SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="$(SVNToolPath)">
<Output TaskParameter="Revision" PropertyName="MyRevision" />
</SvnVersion>
-->
<PropertyGroup>
<MyRevision>9999</MyRevision>
</PropertyGroup>
<FileUpdate Files="@(AssemblyInfoFiles)"
Regex="AssemblyFileVersion\("(\d+)\.(\d+)\.(\d+)\.(\d+)"
ReplacementText="AssemblyFileVersion("...$(MyRevision)" />
</Target>
</Project>
为了增强上述功能,您可以在 "BeforeBuild_VersionTagIt_Target" 之前创建一个 运行 的新目标,该目标将从源代码管理中提取您的代码并将其放入 $(WorkingCheckout) 文件夹中。
基本步骤如下: 1. 从源代码管理中检出代码。 2. 运行 更改 AssemblyVersion 的目标(以及您要操作的任何其他内容)和 3. 构建 .sln 文件。
这是 .proj 文件的基础知识。你可以做更多。通常使用已经存在的辅助库。
我认为最终结果会是 "it can't be that easily done",但看起来应该是这样。我有一个正在进行的个人项目。我不想手动(甚至在脚本中)更改版本、公司、版权以及所有 assembly.cs 文件中的所有内容,并且希望所有这些都在脚本或文件中当我想更新版本时更改(因此脚本大部分保持不变)。但似乎 MSBuild 主要是 "build as is specified in Visual Studio"。我只是讨厌拥有这些文件的所有历史记录,我只更改版本,甚至可能犯错误,因为这个项目将继续变得越来越大。我希望能够向 Visual studio 添加一个新项目,并在我的 powershell 脚本中使用任何命令行,只需说 "compile this, but give it this company name and this file version instead of whatever is listed in the code file".
Google 在这方面没有被证明是富有成果的。我什至发现很难将我的文件构建到特定文件夹中。到目前为止,我必须确保我所有的项目都是 2 个文件夹深,并且能够说在 ....\ 构建它们,但如果我愿意,我希望能够随机更改它并在其他地方构建它们如果我愿意的话。
MSBuild 也许不是正确的选择?有没有其他方法可以从命令行构建更好的 visual studio ?最后,我还想使用 wix 自动构建安装,并能够将其版本与二进制版本相匹配。
谢谢
由于 csproj 是 xml,您可以在构建之前使用 XmlUpdate "helpers" 修改 csproj 文件中的值。
对于其他文件,您可以使用其他一些任务来完成这项工作。
这是一个有用的目标:
http://msbuildtasks.tigris.org/ and/or https://github.com/loresoft/msbuildtasks 有(FileUpdate(和 SvnVersion 任务,如果那是你的源代码控制))任务。
<Target Name="BeforeBuild_VersionTagIt_Target">
<ItemGroup>
<AssemblyInfoFiles Include="$(ProjectDir)\**\*AssemblyInfo.cs" />
</ItemGroup>
<!--
<SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="$(SVNToolPath)">
<Output TaskParameter="Revision" PropertyName="MyRevision" />
</SvnVersion>
-->
<PropertyGroup>
<MyRevision>9999</MyRevision>
</PropertyGroup>
<FileUpdate Files="@(AssemblyInfoFiles)"
Regex="AssemblyFileVersion\("(\d+)\.(\d+)\.(\d+)\.(\d+)"
ReplacementText="AssemblyFileVersion("...$(MyRevision)" />
</Target>
下面是一个操作 csproj(xml) 的例子。
How to add a linked file to a csproj file with MSBuild. (3.5 Framework)
但基本上,当您构建时,您可以将所有重复的内容放在一个 msbuild 定义文件中(通常扩展名为 .proj 或 .msbuild)...然后调用 msbuild.exe MyFile.proj .
在 .proj 文件中,您将引用您的 .sln 文件。
例如:
$(WorkingCheckout) 将是一个变量(此处未定义)...它包含您从源代码管理中获取 hte 代码副本的目录。
<Target Name="BuildIt" >
<MSBuild Projects="$(WorkingCheckout)\MySolution.sln" Targets="Build" Properties="Configuration=$(Configuration)">
<Output TaskParameter="TargetOutputs" ItemName="TargetOutputsItemName"></Output>
</MSBuild>
<Message Text="BuildItUp completed" />
</Target>
下面是更完整的示例。 您可以将其保存为 "MyBuild.proj" 然后调用
"msbuild.exe" "MyBuild.proj".
开始.proj 代码。 (注意,我没有为 FileUpdate 任务导入库)
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="AllTargetsWrapped">
<PropertyGroup>
<!-- Always declare some kind of "base directory" and then work off of that in the majority of cases -->
<WorkingCheckout>.</WorkingCheckout>
</PropertyGroup>
<Target Name="AllTargetsWrapped">
<CallTarget Targets="BeforeBuild_VersionTagIt_Target" />
<CallTarget Targets="BuildItUp" />
</Target>
<Target Name="BuildItUp" >
<MSBuild Projects="$(WorkingCheckout)\MySolution.sln" Targets="Build" Properties="Configuration=$(Configuration)">
<Output TaskParameter="TargetOutputs" ItemName="TargetOutputsItemName"></Output>
</MSBuild>
<Message Text="BuildItUp completed" />
</Target>
<Target Name="BeforeBuild_VersionTagIt_Target">
<ItemGroup>
<AssemblyInfoFiles Include="$(ProjectDir)\**\*AssemblyInfo.cs" />
</ItemGroup>
<!--
<SvnVersion LocalPath="$(MSBuildProjectDirectory)" ToolPath="$(SVNToolPath)">
<Output TaskParameter="Revision" PropertyName="MyRevision" />
</SvnVersion>
-->
<PropertyGroup>
<MyRevision>9999</MyRevision>
</PropertyGroup>
<FileUpdate Files="@(AssemblyInfoFiles)"
Regex="AssemblyFileVersion\("(\d+)\.(\d+)\.(\d+)\.(\d+)"
ReplacementText="AssemblyFileVersion("...$(MyRevision)" />
</Target>
</Project>
为了增强上述功能,您可以在 "BeforeBuild_VersionTagIt_Target" 之前创建一个 运行 的新目标,该目标将从源代码管理中提取您的代码并将其放入 $(WorkingCheckout) 文件夹中。
基本步骤如下: 1. 从源代码管理中检出代码。 2. 运行 更改 AssemblyVersion 的目标(以及您要操作的任何其他内容)和 3. 构建 .sln 文件。
这是 .proj 文件的基础知识。你可以做更多。通常使用已经存在的辅助库。