将Web应用程序发布到相对文件系统路径

54

我正在为本地测试设置相对路径的发布(特别是xml配置转换)。每个开发人员都有自己检出的项目路径,我想设置一个发布,它与机器/环境无关。

发布对话框没有提示可以在其中使用的任何变量或通配符,并且它不接受obj\publishfile://./obj/publish

是否有一种方法可以发布到相对文件系统路径?


3
我也需要解决这个问题。正在为它设置悬赏! - marzapower
为什么你需要首先发布开发呢?如果这是为了部署,大多数人使用nant、msbuild等构建脚本。 - eaglestorm
@eaglestorm - 本地测试部署功能。 - Maslow
我仍然会使用nant、msbuild或rake,并在构建脚本中添加部署目标。 - eaglestorm
2
@eaglestorm - 你也可以将内容发布到本地文件夹,然后将文件收集到安装程序包中。在使用某些安装程序产品时,这种方式非常必要。 - StingyJack
VS 2015 接受类似 ......\DeployFiles 的路径。如果该文件夹不存在,它将被创建。 - wingyip
6个回答

49

对于那些使用Visual Studio 2012及其新的发布配置文件(Properties/PublishProfiles/Local.pubxml)的人,您可以在文件本身中使用以下语法:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <WebPublishMethod>FileSystem</WebPublishMethod>
    <SiteUrlToLaunchAfterPublish />
    <publishUrl>$(MSBuildThisFileDirectory)..\..\obj\publish</publishUrl>
    <DeleteExistingFiles>True</DeleteExistingFiles>
  </PropertyGroup>
</Project>

请注意,$(MSBuildThisFileDirectory) 属性将解析为 Local.pubxml 目录。从那里开始,你应该向上遍历以到达你需要的位置。


截至最新版本,如果您正在从命令行执行此操作,则需要将其翻转为以下方式:<publishUrl>$(MSBuildProjectDirectory)....\obj\publish</publishUrl>。这将在VS2012和MSBuild中均可使用。 - joshua.ewer
VS2012的问题已在VS Update 2中得到修复(请参阅this answer上的评论)。 - Trisped
1
VS2012的问题是否已经解决,即它会将目录解析为发布配置文件夹而不是实际项目目录?因为现在您不再需要使用“....”来跳转。 - drzaus
1
根据https://dev59.com/Q2ct5IYBdhLWcg3wh91K#12029021,我们应该使用$(MSBuildThisFileDirectory),这将始终解析为PublishProfile文件夹。 - Patrick McDonald
你在那里有一个多余的反斜杠。MSBuildThisFileDirectory后面没有反斜杠。例如: <publishUrl>$(MSBuildThisFileDirectory)....\obj\publish</publishUrl> - LarryBud
很遗憾,这种方法只能一次性地工作,因为Visual Studio会根据这个变量替换相对路径为绝对路径。我原本打算使用这个方法,让不同文件系统结构的开发人员都能相对于项目本身发布到同一个目录,但这样做行不通。 - Virus721

18

编辑

对于Visual Studio 2012,这个解决方案将不起作用。您应该查看紧接着本回答之后的michielvoo的回答。

原始回答

尝试了很多次后,我找到了解决方案:您可以通过设置相对路径来使用它。

file:///./obj/publish

发布WebApp对话框中,您必须使用一个已经存在并且由您所使用的用户可写入的路径。这样,您就可以将Web应用程序发布到本地文件夹或与路径相关的文件夹中。

如果这有帮助,请告诉我。对我来说确实有用。


我不得不创建 obj/publish 文件夹,但一旦我创建了它,它就可以工作了。 - Maslow
1
那么,要使其稳定,您是否会添加一个预构建任务来检查并创建obj/publish文件夹? - Peter T. LaComb Jr.
1
看起来工作得很好,但如果路径中有空格(引号似乎没有帮助),它似乎不起作用(在执行 file:///../../Web 时出现问题)。 - ykatchou
1
这个方案对我在VS 2012上并不起作用。但是下面的'file://$(MSBuildProjectDirectory)/../../obj/publish'可以。 - sky-dev
在VS2012中,我只是使用了: obj/publish - Justin Clarke
显示剩余2条评论

7

在Visual Studio 2012中,只需使用正斜杠的常规路径即可:

../../../../../app

这从公开项目根目录开始。


5

VS 2015接受类似以下格式的内容:

..\..\..\DeployFiles

它还会创建文件夹(如果它不存在),这样您的发布设置就可以进入源代码控制,但您可以轻松忽略DeployFiles文件夹及其内容。

5

这是我在Visual Studio 2013中使用的方法:

file:\\..\..\..\Publish

请注意,此操作不会发布到 obj\publish 目录,因为原帖子作者希望这样做,但我希望将其发布到我的系统上另一个目录(更高级别的文件夹)。如果您愿意,请将其修改为 obj\publish。

1
我的VS2013不需要\。这个路径文件:......\Publish 对我来说是正确的。 - NicoD
在我的VS 2015中有效。 - Zolbayar

0
对于需要在发布后通过相对路径调用msdeploy(MSVS 2015,dnx)的情况,另一种选择是编辑项目文件(尽管 pubxml 也可能有效),并创建一个变量,将相对路径转换为绝对路径。
<Target Name="AfterWebPublish" AfterTargets="WebPublish">
     <!-- 
          msdeploy cannot currently handle relative paths for contentPath so first convert it to an absolute path 
     -->    
    <PropertyGroup>
        <AbsOutDir>$([System.IO.Path]::GetFullPath("$(ProjectDir)$(OutDir)"))</AbsOutDir>
    </PropertyGroup>

    <Exec WorkingDirectory="$(ProjectDir)" Command='call "$(DevEnvDir)..\Tools\vsvars32.bat"' />    
    <Exec WorkingDirectory="$(ProjectDir)" Command='"C:\Program Files (x86)\IIS\Microsoft Web Deploy V3\msdeploy" -verb:sync -source:contentPath="$(AbsOutDir)PublishOutput" -dest:package="$(AbsOutDir)$(MSBuildProjectName).zip"' />
  </Target>

然后 $(AbsOutDir) 可以在其他需要的地方使用(例如 msdeploy contentPath)。我认为它无法在对话框中输入。

来自 "how-can-i-get-msbuild-to-evaluate-and-print-the-full-path-when-given-a-relative"。


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