在VS2010 Web项目中发布空目录到Web应用程序

40

通常我需要发布一个Web项目,即使目录为空也需要保留目录结构,例如用于保存上传文件的目录。 如果使用VS2010发布命令发布应用程序,则空目录不会在远程文件系统或Web服务器上创建。

有没有办法强制VS在目标目录中创建某些空文件夹? 谢谢!

5个回答

41
抱歉,这是不可能的,我们遇到了同样的问题。如果您想要预编译工具生成这些空文件夹,您需要在每个空目录中创建一个placeholder.txt文件。如果失败,您可以创建一个命令行应用程序,在后期构建事件中创建文件夹(但仅适用于Web应用程序项目而非Web站点项目)。
希望对您有所帮助。

这对我有效...相当奇怪的问题..还是谢谢 :) - Vikash Pandey

8
我知道这个问题提到了 Visual Studio 2010,但我因为同样的问题而来到这里...
我正在使用 Visual Studio 2012,并找到了一种好的/优雅的方法来解决这个烦人的情况。我认为这也适用于 VS 2010,比添加空文件夹中的虚拟文件更好。
当你使用 VS 2012 创建一个发布配置文件时,它会在 Properties\PublishProfiles 文件夹(My Project\PublishProfiles 对于 VB)中生成一个 MyPublishProfile.pubxml 文件。这些是 MSBuild 文件,可以编辑它们以自定义发布过程。在我们的情况下,我们可以将一个目标插入到发布过程中,在实际发布之前进行操作,像这样:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <AfterAddIisSettingAndFileContentsToSourceManifest>CreateEmptyFolders
    </AfterAddIisSettingAndFileContentsToSourceManifest>
  </PropertyGroup>
  <Target Name="CreateEmptyFolders">
    <Message Text="Adding empty folder to hold Files" />
    <MakeDir Directories="$(_MSDeployDirPath_FullPath)\Files\MyEmptyFolder"/>
  </Target>
</Project>

属性AfterAddIisSettingAndFileContentsToSourceManifest保存了在准备部署包内容后将被调用的目标名称。这是添加其他文件或文件夹到包中的最佳时间。

源自以下混合了代码和文本的内容:

如何在VS 2012中仅在Web Deploy发布任务之前执行PowerShell脚本?

Web Deploy:自定义部署包


1
嗯,对我没用。但我感觉可能是我漏了什么。我把你的代码粘贴到现有发布配置文件的底部,却没有任何效果。 - jpierson

3

1
好像这个答案上的注释是错误的。将生成操作设置为“无”会阻止在IIS服务器上创建文件夹。 - GoClimbColorado
多么令人恼火的错误!无论是“None”还是“Compile”都没有帮助……所以现在我的文件名为“ReadMe.txt”,其内容为“这是一个包含诸如此类的文件夹”的文本(使用“Content”编译模式)。 - Chris W
这个注释是正确的。将生成操作设置为“内容”,将复制到输出目录设置为“不复制”。 - Robert Tanenbaum
很遗憾,看起来连接已经失效了。 - jpierson

2

这个方法对我有用:

像Leniel Macaferi提到的那样,编辑Visual Studio生成的发布pubxml文件,然后添加以下内容: Visual Studio已经生成了一个属性,如下:

<publishUrl>f:\publish_web</publishUrl>

in the

<PropertyGroup>    

我使用了 section,就像这样:

添加到 section 中:

 <PipelineDependsOn>
      CustomBeforePublish;
      $(PipelineDependsOn);
    </PipelineDependsOn>  

并且还添加了:
<Target Name="CustomBeforePublish">
    <Message Text="CustomBeforePublish task:"/>
    <MakeDir Directories="$(publishUrl)\MyFolder\MyFolder2"/>
  </Target>

在VS 2013中对我有效。澄清一下:将<PipelineDependsOn>添加到与<publishUrl>相同的<PropertyGroup>中,并在该<PropertyGroup>之后添加<Target> - Keith

1
在空文件夹中添加一个Default.aspx文件。您可以将其保留为空,然后它将在预编译版本中创建该文件夹。

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