53

我正在设置发布到相对路径以进行本地测试(尤其是 xml 配置转换)。每个开发人员都有自己的签出项目路径,我想设置一个与机器/环境无关的发布。

发布对话框不提示其中允许的任何变量或通配符,它​​不接受obj\publishfile://./obj/publish

有没有办法发布到相对文件系统路径?

4

6 回答 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 目录。从那里你应该遍历到你需要去的地方。

于 2012-11-07T10:23:45.230 回答
17

编辑

对于 Visual Studio 2012,此解决方案将不起作用。您应该在此之后查看 michielvoo 的答案。

原始答案

经过反复尝试,我找到了解决方案:您可以通过设置使用相对路径

file:///./obj/publish

Publish WebApp对话框中,但您必须使用您正在使用的用户已经存在且可写的路径。这样,您可以在本地文件夹或与路径相关的文件夹中发布您的 Web 应用程序。

让我知道这是否有帮助。它对我有用。

于 2011-07-11T14:33:01.913 回答
7

在 Visual Studio 2012 中,只需一条带有正斜杠的常规路径即可:

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

这从已发布项目的根目录开始。

于 2014-10-27T22:17:46.120 回答
5

这在 Visual Studio 2013 中对我有用:

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

请注意,这不会像原始发布者想要的那样发布到 obj\publish,而是根据我的需要发布到我系统上的另一个目录(几个文件夹)。如果您愿意,可以为 obj\publish 修改它。

于 2014-02-13T00:31:49.670 回答
5

VS 2015 接受类似的东西

..\..\..\DeployFiles

如果文件夹丢失,它也会创建该文件夹,以便您的发布设置可以进入源代码控制,但您可以轻松忽略 DeployFiles 文件夹及其内容。

于 2016-07-27T19:11:11.133 回答
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 ”。

于 2016-03-30T01:04:06.717 回答