C# MSBuild-根据生成配置复制一个或另一个文件
我的解决方案中有一个文件,该文件当前复制到以下路径上的生成输出:Core\Bootstrap.txt (我的应用程序在运行时使用它,但我希望它根据构建配置具有不同的内容)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,但如果
我怀疑这是修改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命令,但似乎没有比这更好的方法了。对吗?