如果文件不存在,则使用MSBuild复制或创建文件。

7
我有一个简单的需求,需要在项目目录下创建一个名为user.config的文件,但仅当该文件不存在时才创建。
第一次尝试:
  <Target Name="BeforeBuild">
    <ItemGroup>
      <Line Include="line01"><Text>&lt;appSettings&gt;&lt;/appSettings&gt;</Text></Line>
      <LineText Include="%(Line.Text)" />
    </ItemGroup>
    <WriteLinesToFile File="user.config" Lines="@(LineText)" Overwrite="false" />
  </Target>

不起作用,因为它将内容附加到文件中。
第二次尝试:
  <Target Name="BeforeBuild">
    <CreateItem Include="user_example.config">
      <Output ItemName="ItemsThatNeedToBeCopied" TaskParameter="Include" />
    </CreateItem>
    <Copy SourceFiles="@(ItemsThatNeedToBeCopied)" DestinationFolder="$(ProjectDir)" Condition="!Exists('%(RootDir)%(Directory)%(Filename)%(Extension)')" />
  </Target>

无法工作,因为似乎没有任何反应,并且详细的MSBuild输出中没有任何关于原因的信息。
任何MSBuild专家都应该很容易地看出我做错了什么...

1
第一次尝试中,将最后一行更改为<WriteLinesToFile File="user.config" Lines="@(LineText)" Overwrite="True" Condition="!Exists('user.config')"/>如何?另外,要找出第二个不起作用的原因,请增加详细程度(在命令行上传递/v:d)和/或添加一个消息任务,在其中显示%(RootDir)%(Directory)%(Filename)%(Extension)等内容。 - stijn
@Stijn,第一次尝试更改最后一行非常成功。您可以将其添加为答案,我会在此处奖励您正确的答案。 - Trygve
@stijn。希望你看到这条消息。 - Trygve
如果你使用 @,那么被提及的用户将会收到通知。 - stijn
1个回答

13

第一种尝试基本上是实现此操作的标准方法,您基本上做得很对,只是缺少一个条件(每个MsBuild任务都支持):

<WriteLinesToFile File="user.config" Lines="@(LineText)" Overwrite="True"
                  Condition="!Exists('user.config')"/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接