如何使用 Web 发布管道和 Web 部署 (MSDEPLOY) 发布控制台应用程序?

How to use the Web Publishing Pipeline and Web Deploy (MSDEPLOY) to Publish a Console Application?

提问人:John Saunders 提问时间:7/11/2013 最后编辑:quetzalcoatlJohn Saunders 更新时间:5/1/2014 访问量:2389

问:

我想使用 Web 部署将 Visual Studio“控制台”应用程序发布到目标系统上的文件夹。

我有一些运气,能够生产出与我需要的东西相似的东西,但还不完全是。

我已将以下内容添加到控制台 .csproj:

添加了以下 projectName.wpp.targets 文件

<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

我添加了以下projectName.wpp.targets:

<Project DefaultTargets="Build"  xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0">

  <PropertyGroup>
    <DeployAsIisApp>false</DeployAsIisApp>
    <IncludeSetAclProviderOnDestination>false</IncludeSetAclProviderOnDestination>
  </PropertyGroup>
  <ItemGroup>
    <FilesForPackagingFromProject Include="$(IntermediateOutputPath)$(TargetFileName).config">
      <DestinationRelativePath>bin\%(RecursiveDir)%(FileName)%(Extension)</DestinationRelativePath>
      <FromTarget>projectName.wpp.targets</FromTarget>
    </FilesForPackagingFromProject>
  </ItemGroup>
</Project>

然后,我编辑了 .SetParameters.xml 文件,如下所示:

<parameters>
  <setParameter name="IIS Web Application Name" value="c:\company\project" />
</parameters>

然后,当我使用生成的 .cmd 文件进行部署时,我会将所有文件部署到 C:\company\project\bin。

这还不错,但我想做得更好。特别是,我想省略“bin”文件夹并将所有文件放在“C:\company\project”文件夹中,并且我希望能够指定 ACL

有没有人能够解决这些问题?

控制台应用程序 msdeploy webdeploy msbuild-wpp

评论

0赞 alex.b 4/30/2014
您是否尝试过从中删除“bin\”部分?<DestinationRelativePath>bin\%(RecursiveDir)%(FileName)%(Extension)</DestinationRelativePath>
0赞 John Saunders 4/30/2014
这听起来像是一个答案。您应该在此处添加答案。3小时内赏金。
0赞 John Saunders 4/30/2014
@aleksey.berezan:你应该把它添加为答案
0赞 alex.b 5/1/2014
我检查了一下,那样也无济于事。但是我找到了另一个,很快就会发布答案。

答:

4赞 alex.b 5/1/2014 #1

好的,这是省略“bin”文件夹的方法。
首先,我想强调的是,所有这些与 msdeploy 相关的东西都是用于 Web 应用程序部署的,而“bin”文件夹对我来说几乎是硬编码的。所以如果你想摆脱它 - 你必须做一些肮脏的事情。我做到了。

我们将不得不稍微改变项目,所以最好不要改变它,但它是复制。$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets

步骤:

1.备份(或者,您可以安装 MSBuild.Microsoft.VisualStudio.Web.targets 包,将 csproj 文件重定向到从包中获取的文件并使用它)。
2.在找到看起来像的xml节点(有几个节点,从~2570行中取出一个)。
3. 注释掉节点,替换为自定义节点,因此最终它将如下所示:
$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targetsMicrosoft.WebApplication.targets$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplicaton.targets<CopyPipelineFiles PipelineItems="@(FilesForPackagingFromProject)"

<!--
<CopyPipelineFiles PipelineItems="@(FilesForPackagingFromProject)"
                       SourceDirectory="$(WebPublishPipelineProjectDirectory)"
                       TargetDirectory="$(WPPAllFilesInSingleFolder)"
                       SkipMetadataExcludeTrueItems="True"
                       UpdateItemSpec="True"
                       DeleteItemsMarkAsExcludeTrue ="True"
                   Condition="'@(FilesForPackagingFromProject)' != ''">
  <Output TaskParameter="ResultPipelineItems" ItemName="_FilesForPackagingFromProjectTempory"/>
</CopyPipelineFiles>-->

<!-- Copying files to package folder in 'custom'(dirty) way -->
<CreateItem Include="$(OutputPath)\**\*.*">
  <Output TaskParameter="Include" ItemName="YourFilesToCopy" />
</CreateItem>
<Copy SourceFiles="@(YourFilesToCopy)"
      DestinationFiles="@(YourFilesToCopy->'$(WPPAllFilesInSingleFolder)\%(RecursiveDir)%(Filename)%(Extension)')" />

然后
4.您的 projectName.wpp.targets 不必具有 ,因此它看起来像:
FilesForPackagingFromProject

<!-- targets -->
    <PropertyGroup>
      <DeployAsIisApp>false</DeployAsIisApp>
      <IncludeSetAclProviderOnDestination>false</IncludeSetAclProviderOnDestination>
    </PropertyGroup>
    <ItemGroup>
    <!-- intentionally left blank -->
    </ItemGroup>
    </Project>

就是这样。为我工作(tm),经过测试。老实说,我不喜欢这种方法,但这是我让它以所需的方式工作的唯一方法。是否在项目中使用它取决于您。

我的意见是不要在这里使用 msdeploy - 它不适合你的任务。
最好从头开始编写 msbuild-scripts 或接受“bin”文件夹,并在下次需要自定义时再次与框架作斗争。

评论

0赞 John Saunders 5/1/2014
我同意这总体上不是一个好主意。这是权宜之计,因为这意味着应用程序的所有组件都可以通过 MSDEPLOY 部署到所有环境中。这是摆脱控制台应用程序的 MSI 安装程序的一部分。MSI 安装程序除了复制文件外什么也没做。
0赞 alex.b 5/1/2014
另外,我尝试设置ACL,遇到消息错误,发现SO主题与评论有类似的问题......所以我认为设置 ACL 对你不起作用。最好使用 MSI/Wix。ERROR_SITE_DOES_NOT_EXISTThis doesn't seem to work for applications that are not pushed into a virtual directory and are pushed to Default Site/ for instanc
0赞 John Saunders 5/1/2014
没错,但 VS2012/2013 不支持安装项目,Wix 甚至 InstallShield 都有很大的学习曲线。MSDEPLOY“有效”,我唯一的问题是上述问题。谢谢你的回答。