使用MSBuild发布时创建文件夹

时间:2018-04-04 11:43:42

标签: c# visual-studio msbuild

我正在尝试在Visual Studio 2015中使用文件系统位置发布我的Web应用程序项目时创建一个Temp文件夹。我尝试在.csfile中添加以下代码,但它不是在目标位置创建文件夹发布目录。如果给定静态位置来创建文件夹,它的工作正常。如何动态获取发布目录?

<Target Name="CustomCollectFiles" AfterTargets="Build">
    <MakeDir Directories="$(PublishDirectory)$(OutputDirectoryTemp)" />
  </Target>
  <PropertyGroup>   
    <OutputDirectoryTemp>\Temp\</OutputDirectoryTemp> 
  </PropertyGroup>

2 个答案:

答案 0 :(得分:1)

  

使用MSBuild

发布时创建文件夹

您需要通过创建一个属性名称为PublishDirectory元素子元素的元素来声明属性PropertyGroup,因为没有这样的MSBuild宏,您可以检查{{3 }}

作为测试,我将PublishDirectory设置为路径D:\Publish

  <PropertyGroup>
    <PublishDirectory>D:\Publish</PublishDirectory>
  </PropertyGroup>

然后我在目标中添加输出命令行<Message Test="xxx" />以输出$(PublishDirectory)$(OutputDirectoryTemp)的内容:

  <Target Name="CustomCollectFiles" AfterTargets="Build">
    <MakeDir Directories="$(PublishDirectory)$(OutputDirectoryTemp)" />

    <Message Text="$(PublishDirectory)$(OutputDirectoryTemp)">
    </Message>
  </Target>
  <PropertyGroup>
    <OutputDirectoryTemp>\Temp\</OutputDirectoryTemp>
  </PropertyGroup>

  <PropertyGroup>
    <PublishDirectory>D:\Publish</PublishDirectory>
  </PropertyGroup>

在输出窗口中,您将看到以下日志:

Common Macros for Build Commands and Properties

将创建文件夹Temp

enter image description here

如果您已经定义了PublishDirectory的变量,则可以尝试使用输出命令行<Message Test="xxx" />检查路径是否正确。

<强>更新

  

我想让发布目录的目标位置动态而非静态或硬编码

由于您希望获取发布目录动态的目标位置,我们知道,发布目录的位置存储在.pubxml文件的节点{{ 1}},要动态获取此值,我们可以使用<publishUrl>D:\Publish\Test</publishUrl>在目标中获取此值,但是,发布过程在构建之后,我们无法获取此值构建过程,因此我们需要将此目标的顺序从$(publishUrl)更改为AfterTargets="Build"。目标应该是:

AfterTargets="PipelineTransformPhase"

在这种情况下,当您将项目发布到系统位置时,发布目录将存储在 <Target Name="CustomCollectFiles" AfterTargets="PipelineTransformPhase"> <MakeDir Directories="$(publishUrl)$(OutputDirectoryTemp)" /> <Message Text="$(publishUrl)$(OutputDirectoryTemp)" /> </Target> <PropertyGroup> <OutputDirectoryTemp>\Temp\</OutputDirectoryTemp> </PropertyGroup> 中,我们可以在该目标中获取它。

希望这有帮助。

答案 1 :(得分:0)

尝试在目标之前指定PropertyGroup,以确保它已创建。

同时检查PublishDirectory的值以确保它是一个有效的路径 - 我怀疑它可能带有&#34; \&#34;在它的最后,所以你最后得到两个斜杠