Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#解决方案的MSBuild(类似版本)自定义_C#_Visual Studio 2012_Command Line_Msbuild - Fatal编程技术网

C#解决方案的MSBuild(类似版本)自定义

C#解决方案的MSBuild(类似版本)自定义,c#,visual-studio-2012,command-line,msbuild,C#,Visual Studio 2012,Command Line,Msbuild,我认为最终的结果将是“不可能那么容易做到”,但似乎应该如此。我有一个我正在做的个人项目。我不想手动(甚至在脚本中)更改所有assembly.cs文件的版本、公司、版权以及所有这些内容,我希望这些内容要么在脚本中,要么在我想要更新版本时可以更改的文件中(因此脚本大部分保持不变)。但看起来MSBuild主要是“在VisualStudio中指定的构建”。我只是不喜欢这些文件的所有历史,我只更改版本,甚至可能犯错误,因为这个项目将继续变得越来越大。我希望能够将一个新项目添加到VisualStudio,并

我认为最终的结果将是“不可能那么容易做到”,但似乎应该如此。我有一个我正在做的个人项目。我不想手动(甚至在脚本中)更改所有assembly.cs文件的版本、公司、版权以及所有这些内容,我希望这些内容要么在脚本中,要么在我想要更新版本时可以更改的文件中(因此脚本大部分保持不变)。但看起来MSBuild主要是“在VisualStudio中指定的构建”。我只是不喜欢这些文件的所有历史,我只更改版本,甚至可能犯错误,因为这个项目将继续变得越来越大。我希望能够将一个新项目添加到VisualStudio,并在我的powershell脚本中使用任何命令行,只要说“编译这个,但给它这个公司名称和文件版本,而不是代码文件中列出的任何内容”

谷歌在这方面并没有取得丰硕成果。我甚至发现很难将文件构建到特定的文件夹中。到目前为止,我必须确保我所有的项目都有两个文件夹深,并且能够说在…\,构建它们,但如果我愿意,我希望能够随机更改,如果我愿意,可以在其他地方构建它们

MSBuild可能不是一条出路吗?是否有其他方法可以通过命令行更好地构建VisualStudio?最后,我还希望使用wix自动构建安装,并能够将其版本与二进制版本相匹配


谢谢

因为csproj是xml,所以在构建之前,您可以使用XmlUpdate“helpers”修改csproj文件中的值

对于其他文件,您可以使用其他一些任务来完成此工作

以下是一个有用的目标:

和/或具有(FileUpdate(和svversion任务,如果这是您的源代码管理))任务

开始。项目代码。(注意,我没有为FileUpdate任务导入库)


.
9999
为了增强上述功能,您将创建一个新的目标,该目标将在“BeforeBuild_VersionTagIt_target”之前运行,该目标将从源代码管理中提取代码并将其放入$(WorkingCheckout)文件夹中

基本步骤是:1。从源代码管理签出代码。2.运行更改AssemblyVersion(以及您想要操纵的任何其他内容)和3的目标。构建.sln文件


这是.proj文件的基础。你可以做得更多。通常通过使用已经存在的帮助程序库来实现。

看起来MSBuild主要是“在Visual Studio中指定的生成”,但事实并非如此。你可能会这样想,因为你不太了解它,或者因为你没有充分地使用它,或者因为你只是通过VS或它们的组合使用它。但它相当强大,例如,参见granadcoder的答案。其他示例:由于使用C#,因此始终可以编写C#来执行类似的任务,并直接或作为来自MsBuild的自定义任务调用它,有时候,这比必须弄清楚msbuild是如何工作的要快。我认为至少你应该对有人花时间帮助你的答案表示尊重和感激。我想知道他怎么连评论都没有发表+1我猜SOF的起起落落。谢谢你的注意。从未收到过回复的通知。所以,我从来没有看过。收到关于@Kasrak回复的通知。不是故意的。是的,这就是为什么我不想飞得太高或太低。当有很多未知的事情发生时,尽量不要去想最坏的情况。如果可能,请将此(或其中一个)答案标记为“答案”,这样它就不会继续显示在“未回答”的SOF查询中。有些人故意寻找没有答案的人来帮助他们。
<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\(&quot;(\d+)\.(\d+)\.(\d+)\.(\d+)"
            ReplacementText="AssemblyFileVersion(&quot;$1.$2.$3.$(MyRevision)" />

</Target>
  <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>
"msbuild.exe" "MyBuild.proj".
<?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\(&quot;(\d+)\.(\d+)\.(\d+)\.(\d+)"
            ReplacementText="AssemblyFileVersion(&quot;$1.$2.$3.$(MyRevision)" />

</Target>



</Project>