【问题标题】:How to use the Web Publishing Pipeline and Web Deploy (MSDEPLOY) to Publish a Console Application?如何使用 Web 发布管道和 Web 部署 (MSDEPLOY) 发布控制台应用程序?
【发布时间】:2013-07-11 00:58:10
【问题描述】:

我想使用 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

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

【问题讨论】:

  • 您是否尝试从&lt;DestinationRelativePath&gt;bin\%(RecursiveDir)%(FileName)%(Extension)&lt;/DestinationRelativePath&gt; 中删除“bin\”部分?
  • 这听起来可能是一个答案。您应该在此处添加答案。 3 小时内赏金。
  • @aleksey.berezan:您应该将其添加为答案
  • 我检查过,那样没有帮助。但是我找到了另一个,很快就会发布答案。

标签: console-application msdeploy webdeploy msbuild-wpp


【解决方案1】:

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

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

步骤:

1.备份$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets(或者,您可以安装MSBuild.Microsoft.VisualStudio.Web.targets包,将您的csproj文件重定向到从包中获得的Microsoft.WebApplication.targets文件并使用它)。
2. 在$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplicaton.targets 中找到类似于&lt;CopyPipelineFiles PipelineItems="@(FilesForPackagingFromProject)" 的xml 节点(有几个,从~2570 行中取一个)。
3. 将节点注释掉,替换为自定义节点,最终会是这样的:

<!--
<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”文件夹,并在需要下一次自定义时再次与框架作斗争。

【讨论】:

  • 我同意这通常不是一个好主意。这是权宜之计,因为这意味着应用程序的所有组件都可以通过 MSDEPLOY 部署到所有环境中。这是摆脱控制台应用程序的 MSI 安装程序的一部分。 MSI 安装程序除了复制文件之外什么也没做。
  • 另外,我尝试设置 ACL,遇到错误消息 ERROR_SITE_DOES_NOT_EXIST,发现 SO topic 与评论 This doesn't seem to work for applications that are not pushed into a virtual directory and are pushed to Default Site/ for instanc 有类似问题...所以我认为设置 ACL 赢了不适合你。最好使用 MSI/Wix。
  • 是的,但是 VS2012/2013 不支持安装项目,Wix 甚至 InstallShield 都有很大的学习曲线。 MSDEPLOY“有效”,我唯一的问题是上述问题。感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
  • 1970-01-01
  • 2015-08-23
  • 2020-01-11
相关资源
最近更新 更多