2013-07-11 77 views
4

我想使用web部署将Visual Studio“Console”应用程序发布到目标系统上的文件夹。如何使用Web发布管道和Web部署(MSDEPLOY)发布控制台应用程序?

我有一些运气,并能够产生类似于我所需要的东西,但不完全。

我已经添加了以下控制台的.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中的所有文件:\企业\项目\ bin中。

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

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

+0

您是否尝试从“ bin \%(RecursiveDir)%(FileName)%(Extension)”中删除“bin \”部分? –

+0

听起来这可能是一个答案。你应该在这里添加一个答案。 3小时内赏金。 –

+0

@ aleksey.berezan:你应该添加它作为答案 –

回答

4

好吧,所以这里是如何省略'bin'文件夹的方式。首先,我想强调的是,所有与msdeploy相关的东西都是针对web应用程序部署的,'bin'文件夹对我来说似乎是,几乎在的硬编码深处。所以如果你想摆脱它 - 你必须做一些肮脏的事情。我做了哪些。

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

步骤:

。备份$(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'文件夹,并在需要下一次定制时再次与框架对抗。

+0

我同意这一般不是一个好主意。这很方便,因为它意味着应用程序的所有组件都可以通过MSDEPLOY部署到所有环境中。这是摆脱控制台应用程序的MSI安装程序的一部分。 MSI安装程序除了复制文件外没有其他任何操作。 –

+0

此外,我试图设置ACL的,面临错误消息'ERROR_SITE_DOES_NOT_EXIST',发现[SO主题](https://stackoverflow.com/questions/6861990/can-web-deploys-setacl-provider-在子目录上使用)与注释类似的问题'这似乎不适用于没有推入虚拟目录并被推送到默认站点/实例的应用程序......所以我认为设置ACL不适合你。 MSI/Wix更好。 –

+0

确实如此,但安装项目在VS2012/2013中不受支持,Wix甚至InstallShield都有很大的学习曲线。 MSDEPLOY“工作”,我唯一的问题就是上面的问题。感谢你的回答。 –

相关问题