使用多个项目发布Web应用程序

5
我有一个ASP.NET Web应用程序,由多个ASP.NET项目(以及多个类库)组成。显然,其中一个项目是根项目,而其余的是子项目(这种应用程序结构的详细概念在这里解释)。每个子/子项目都有自己的目录,并且它们都位于名为“模块”的目录下的根文件夹中。由于IIS只能处理一个应用程序的一个项目,所有子项目将被视为常规目录(在运行时)。因此,我修改了每个子项目的生成输出路径为“ .. \ .. \ bin \ ”,即根bin文件夹。这样,我就可以正确地设置所有内容。从Visual Studio的角度来看,我可以在一个解决方案下拥有不同的项目。而从IIS的角度来看,我有一个项目,其中包含一个bin文件夹和一个Web.Config文件。现在问题来了:如果我发布根项目(右键单击项目节点->发布),那么发布的输出将仅为该项目,不带“模块”文件夹。结果bin文件夹也将缺少子项目的输出DLL。这是可以预料的。因此,我认为解决这个问题的明显方法是发布我的所有Web项目(不仅仅是根项目),并牢记我的子项目发布路径需要是根项目的发布路径中的“模块”文件夹。所有这些都很好,除了一个重要问题。事实证明,每个已发布的子项目都有自己的bin文件夹,因此根bin文件夹不包含子项目的输出DLL。因此,我想到了一个解决方案:虽然Visual Studio允许我按照自己的方式指定每个项目的输出路径(正如我所提到的,我将其设置为“ .. \ .. \ bin \ ”),但ClickOnce发布并不尊重这一点,而只是为每个子项目创建一个bin文件夹。有没有办法指定ClickOnce发布过程的输出路径(bin文件夹)?如果没有,那么有什么替代方案吗?
2个回答

1

这里提供的答案可能会解决您的问题。通过将以下属性添加到您的.csproj文件中(从链接的答案进行修改),您可以告知ClickOnce在输出目录中包含其他内容:

<ItemGroup>
    <Content Include="bin\**\*.*" />
</ItemGroup>

另一个这里给出的答案提供了一种递归包含额外内容到您项目的输出中的方法,该方法适用于在您项目文件夹之外的其他项目;从根项目的角度来看,其他项目是在它的文件夹之外。但是,我不确定ClickOnce是否会忽略此操作。

<Content Include="..\..\MyContentFiles\**">
    <Link>%(RecursiveDir)%(Filename)%(Extension)</Link>
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>

我还没有机会测试你的解决方案,但我相信它是有帮助的。如果有效,我会将其标记为答案。谢谢。 - yazanpro

1

正如您所说,您有多个项目,其中一个是根项目。因此,每个项目都应该有自己的bin文件夹,因为它是一个项目,而不是根项目子文件夹

如果子项目没有bin文件夹,那么它将不知道从哪里加载在该项目中使用的程序集

为每个子项目设置bin文件夹并不是一个坏主意。


从我在问题中提供的链接中,请检查这部分,希望这能更清楚地说明我的情况。当您配置子项目以共享公共的IIS应用程序根目录后,您可以在解决方案中的项目之间共享资源。例如,您可以将共享资源项目中的用户控件拖动到另一个项目中的.aspx文件中。请注意,只有在配置项目共享公共的IIS应用程序根目录之后,才能这样做。如果项目仍处于单独的IIS应用程序根目录中,则Visual Studio .NET不允许您共享资源。 - yazanpro
从 IIS 的角度来看,我只有一个项目。技术上说,子项目将从根目录下的 bin 文件夹中加载它们的程序集(我明确设置了所有子项目的输出路径为 ..\..\bin,也就是根目录下的 bin 文件夹)。 - yazanpro

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