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



我想使用web部署将Visual Studio"Console"应用程序发布到目标系统上的文件夹中。

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

我在控制台中添加了以下内容。csproj:

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

<Import Project="$(MSBuildExtensionsPath32)MicrosoftVisualStudiov10.0WebApplicationsMicrosoft.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:companyproject" />
</parameters>

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

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

有人能解决这些问题吗?

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

我们将不得不稍微更改$(MSBuildExtensionsPath32)MicrosoftVisualStudiov10.0WebApplicationsMicrosoft.WebApplication.targets项目,所以最好不要更改它,但它是副本。

步骤:

1.备份$(MSBuildExtensionsPath32)MicrosoftVisualStudiov10.0WebApplicationsMicrosoft.WebApplication.targets(或者,您可以安装MSBuild.Microsoft.VisualStudio.Web.targets包,将csproj文件重定向到从包中获得的Microsoft.WebApplication.targets文件并使用它)
2.在$(MSBuildExtensionsPath32)MicrosoftVisualStudiov10.0WebApplicationsMicrosoft.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"文件夹,并在需要下一次自定义时再次对抗框架。

相关内容

  • 没有找到相关文章

最新更新