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

4
我希望使用Web Deploy将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" 文件夹中,并且我希望能够指定 ACLs。

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


你尝试过从<DestinationRelativePath>bin\%(RecursiveDir)%(FileName)%(Extension)</DestinationRelativePath>中删除"bin"部分吗? - alex.b
那听起来可能是一个答案。你应该在这里添加一个答案。3小时内有赏金。 - John Saunders
@aleksey.berezan:你应该将它添加为答案。 - John Saunders
我检查了,那种方法不会有帮助。但是我找到了另一种方法,很快就会发布答案。 - alex.b
1个回答

4

好的,接下来是如何省略“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中找到类似于<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脚本或接受'bin'文件夹,并在下次需要进行自定义时再次与框架进行斗争。


我同意,总的来说这并不是一个好主意。这么做是为了方便,因为它意味着应用程序的所有组件都可以通过MSDEPLOY部署到所有环境中。这是摆脱控制台应用程序的MSI安装程序的一部分。MSI安装程序除了复制文件之外什么也没做。 - John Saunders
另外,我尝试设置ACL,但遇到了错误消息ERROR_SITE_DOES_NOT_EXIST,在SO主题中找到了类似的问题,并评论说“这似乎不适用于没有推送到虚拟目录并被推送到默认站点/的应用程序”...所以我认为设置ACL不会对您有用。最好使用MSI/Wix。 - alex.b
是的,但是在VS2012/2013中不支持安装程序项目,而Wix甚至InstallShield都有很大的学习曲线。MSDEPLOY“可行”,我的唯一问题就是上述问题。感谢您的回答。 - John Saunders

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