C# MSBuild-根据生成配置复制一个或另一个文件

C# MSBuild-根据生成配置复制一个或另一个文件,c#,.net,visual-studio,msbuild,C#,.net,Visual Studio,Msbuild,我的解决方案中有一个文件,该文件当前复制到以下路径上的生成输出:Core\Bootstrap.txt (我的应用程序在运行时使用它,但我希望它根据构建配置具有不同的内容) 我怀疑这是修改csproj和玩MSBuild造成的,但我没有任何线索。很多时候我看到人们这样做,我看到他们有一个单独的文件名为Bootstrap.Development.txt,加载文件时可以在dotnet中检查环境类型并加载$“Bootstrap.{envName}.json”只要始终加载Bootstrap.json,但如果

我的解决方案中有一个文件,该文件当前复制到以下路径上的生成输出:Core\Bootstrap.txt

(我的应用程序在运行时使用它,但我希望它根据构建配置具有不同的内容)


我怀疑这是修改csproj和玩MSBuild造成的,但我没有任何线索。

很多时候我看到人们这样做,我看到他们有一个单独的文件名为Bootstrap.Development.txt,加载文件时可以在dotnet中检查环境类型并加载$“Bootstrap.{envName}.json”只要始终加载Bootstrap.json,但如果您的envName为“Development”,则不要使用它

编辑:
请记住,在属性中,如果较新,则两个文件始终复制到输出目录唯一的功能是创建两个其他txt文件,分别名为
Bootstrap.Debug.txt
Bootstrap.Release.txt

<ItemGroup>
    <Content Include="Core\Bootstrap.txt">
    </Content>
    <Content Include="Core\Bootstrap.Debug.txt" Condition="'$(Configuration)'=='Debug'">
      <DependentUpon>Bootstrap.txt</DependentUpon>
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="Core\Bootstrap.Release.txt" Condition="'$(Configuration)'=='Release'">
      <DependentUpon>Bootstrap.txt</DependentUpon>
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>
首先,将这两个其他文件的复制到输出目录设置为
不复制

记住清除
Bootstrap.txt
,然后将所有内容放入
Bootstrap.Debug.txt
Bootstrap.Release.txt
。如果要使用Debug模式,请在
Bootstrap.Debug.txt
上进行更改,同时在Release模式下的
Bootstrap.Release.txt
上进行更改

第二步,卸载您的项目,将其添加到
csproj
文件中:

 <ItemGroup>
    <Content Include="Core\Bootstrap.txt">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="Core\Bootstrap.Debug.txt">
      <DependentUpon>Bootstrap.txt</DependentUpon>
    </Content>
    <Content Include="Core\Bootstrap.Release.txt">
      <DependentUpon>Bootstrap.txt</DependentUpon>
    </Content>
  </ItemGroup>
  <Target Name="CopyFiles" BeforeTargets="PrepareForBuild">
    <Exec Command="xcopy /y $(ProjectDir)Core\Bootstrap.$(Configuration).txt $(ProjectDir)Core\Bootstrap.txt" />
  </Target>
如果仍然需要固定名称文件
Bootstrap.txt
,则必须使用复制任务使相关的txt文件覆盖主
Bootstrap.txt
文件。而且MSBuild不够灵活,无法基于 txt文件上的配置条件,然后根据构建配置将相应信息添加到相应的构建文件中

MSBuild没有此功能,因此只能手动写入逻辑,并根据不同的基于配置的文件覆盖主文件

如果不需要
xcopy
命令,可以使用,它属于MSBuild

<ItemGroup>
    <Content Include="Core\Bootstrap.txt">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
    <Content Include="Core\Bootstrap.Debug.txt" >
      <DependentUpon>Bootstrap.txt</DependentUpon>

    </Content>
    <Content Include="Core\Bootstrap.Release.txt">
      <DependentUpon>Bootstrap.txt</DependentUpon>  
    </Content>
  </ItemGroup>
  <Target Name="CopyFiles" BeforeTargets="PrepareForBuild">
      <Copy SourceFiles="$(ProjectDir)Core\Bootstrap.$(Configuration).txt" DestinationFiles="$(ProjectDir)Core\Bootstrap.txt"></Copy>
  </Target>

保存最新
Bootstrap.txt
Bootstrap.txt

否则,就没有别的办法了。

谢谢,但我认为这是构建过程中必须考虑的一部分。而且,我不知道你说的“环境”是什么意思,谢谢!虽然xcopy部分看起来很棘手。完全依赖于xcopy,而xcopy不是构建过程的一部分。有没有更干净的方法来进行实际的复制?或者您应该使用一个条件来直接将相关的Bootstrap.Debug或Release.txt复制到输出文件夹中。然后您可以根据配置直接使用
Bootstrap.Debug.txt
Bootstrap.Release.txt
。这是一个更简单的方法。如果最后必须在输出文件中显式使用名为Bootstrap.txt的文件,则必须将其复制到主文件中。否则,就没有别的办法了。我已经更新了我的答案,您可以查看。我使用的是您在上一部分中提出的解决方案(没有xcopy)。我注意到,每次重建解决方案时,Bootstrap.txt都会被覆盖。如果我在单词“占位符”中写入,它将被重写为与当前配置对应的单词。我不知道为什么会这样!谢谢你的反馈。相反,请尝试在
CopyFiles
目标下使用
。您必须使用
xcopy
任务,因为它将跳过现有文件,而复制任务将始终覆盖现有文件。多亏了您,Perry。我想避免直接执行OS命令,但似乎没有比这更好的方法了。对吗?