我想使用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
有没有人能够解决这些问题?
答案 0 :(得分:4)
好的,这就是省略'bin'文件夹的方法。
首先,我想强调所有这些与msdeploy相关的东西都是用于Web应用程序部署,而'bin'文件夹对我来说似乎几乎在内部进行了硬编码。所以,如果你想摆脱它 - 你必须做一些肮脏的事情。我做了什么。
我们必须稍微更改$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets
项目,所以最好不要更改它,但它是副本。
步骤:
1.Backup $(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-scripts或接受'bin'文件夹,并在需要下一次定制后再次与框架作斗争。