1

我们目前正在开发几个 Web 项目,并希望能够创建一个包含跨 Web 项目共享的用户控件的项目,而不必重新创建它们。据我发现,整个过程很痛苦,因为每个项目都需要访问实际ascx文件,而不仅仅是对其的引用。

我的处理方法是:

1- 使用 Pre-Build 事件复制 .ascx 文件

从共享程序集到当前项目的工作文件夹。这适用于调试应用程序,但我们需要在文件系统发布期间做同样的事情。

2- 使用 MSBuild 目标在发布过程中复制 .ascx 文件

我在项目的配置文件中添加了以下目标:

<Target Name="AfterPublish" AfterTargets="PipelinePreDeployCopyAllFilesToOneFolder">
   <Exec Command="xcopy.exe SourcePath OutputPath" />
</Target>

(注意SourcePathTargetPath是目录的完整路径。我在这里替换了它们以使其更短)

此目标在文件系统发布后被调用(右键单击项目 -> 发布),但是,文件不会被复制到目标文件夹。

我已经确认目标被调用(通过更改Command=explorer.exe,弹出一个 Windows 资源管理器窗口)并且还xcopy.exe使用相同的确切路径运行命令CommandPrompt并且它确实工作正常。所以我不明白为什么它不能作为目标的一部分。有任何想法吗?

4

2 回答 2

1

您可能需要检查您的发布选项并确保“在发布前删除所有现有文件” 发布选项

问题是 xcopy 命令总是在删除发生之前执行,因此它们被复制但在之后立即删除。

如果您每次都需要一个干净的文件夹,我建议您将所有内容都放在“AfterBuild”中

<Target Name="AfterBuild">

<Exec Command="echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Clean Publish Folder @@@@@@@@@@@@@@@@@@@@@@@@@@@@" />
<Exec Command="echo $(PublishUrl)" />
<Exec Command="echo Publish Folder Deleted...." Condition="Exists('$(PublishUrl)')"/>
<!--<Exec Command="del /q $(PublishUrl)\*" Condition="Exists('$(PublishUrl)')"/>-->
<!--<Exec Command="FOR /D %%p IN (&quot;$(PublishUrl)*.*&quot;) DO rmdir &quot;%%p&quot; /s /q" />-->
<Exec Command="del /q $(PublishUrl)\*" Condition="Exists('$(PublishUrl)')"/>
<Exec Command="FOR /D %%p IN (&quot;$(PublishUrl)\*.*&quot;) DO rmdir &quot;%%p&quot; /s /q" />
<Exec Command="echo Publish Folder Creation...." Condition="Exists('$(PublishUrl)')"/>
<Exec Command="mkdir $(PublishUrl)" Condition="!Exists('$(PublishUrl)')"/>
<Exec Command="echo @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Copying @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" />
<Exec Command="xcopy.exe SourceDir DestinationDir /S /E /H" />

</Target>
于 2014-08-29T17:14:12.150 回答
0

MSBuild 有一个复制任务。尝试以下操作:

<Target Name="AfterBuild">
  <ItemGroup>
    <MySource Include='path\to\files\**\*.*" />
  </ItemGroup>
  <Copy SourceFiles="@(MySource)" DestinationFolder="$(OutputDir)\%(RecursiveDir)" />
</Target>
于 2014-08-29T17:02:15.950 回答